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"
 }
