Version 2.0.0-dev.68.0

Merge commit 'c267586b652c0101a3f54ef7a75a08c0be27dafb' into dev
diff --git a/BUILD.gn b/BUILD.gn
index 1957140..b00fb39 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -151,46 +151,3 @@
     "runtime/observatory:copy_compressed_observatory_archive",
   ]
 }
-
-# The rules below build a Fuchsia OS image that includes the Dart tree
-# under /system/test/dart.  To get this into the `user.bootfs` generated
-# by the Fuchsia build, add the GN build argument:
-#   extra_bootdata = [ "//third_party/dart:dart_test_bootfs" ]
-if (is_fuchsia) {
-  import("//build/config/fuchsia/bootdata.gni")
-
-  action("generate_dart_test_manifest") {
-    testonly = true
-
-    output_prefix = "$target_gen_dir/dart_test_tree"
-    outputs = [
-      "$output_prefix.manifest",
-    ]
-
-    mode = "release"
-    if (is_debug) {
-      mode = "debug"
-    }
-
-    script = "tools/gen_fuchsia_test_manifest.py"
-    args = [
-      "-m",
-      mode,
-      "-o",
-      rebase_path(output_prefix),
-    ]
-  }
-
-  bootdata("dart_test_bootfs") {
-    testonly = true
-    deps = [
-      ":generate_dart_test_manifest",
-      "runtime/bin:dart",
-      "runtime/bin:process_test",
-      "runtime/bin:run_vm_tests",
-    ]
-    inputs = [
-      "$target_gen_dir/dart_test_tree.manifest",
-    ]
-  }
-}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4552410..1160e93 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,10 +16,29 @@
 
 #### Dart2js
 
+#### Analyzer
+
 #### Other Tools
 
 ### Core library changes
 
+## 2.0.0-dev.68.0
+
+### Tool Changes
+
+#### dartfmt
+
+* Do not split long strings inside their string interpolations.
+
+#### Analyzer
+
+  * The analysis server will now only analyze code in Dart 2 mode ('strong
+    mode'). It will emit warnings for analysis options files that have
+    `strong-mode: false` set (and will emit a hint for `strong-mode: true`,
+    which is no longer necessary).
+  * The dartanalyzer `--strong` flag is now deprecated and ignored; the
+    command-line analyzer now only analyzes code in strong mode.
+
 ## 2.0.0-dev.67.0
 
 ### Language
@@ -81,12 +100,18 @@
 * Mixed return statements of the form `return;` and `return exp;` are now
 allowed when `exp` has type `void`.
 
+* A compile time error is emitted for any literal which cannot be exactly
+  represented on the target platform. As a result, dart2js and DDC will
+  report errors if an integer literal cannot be represented exactly in
+  JavaScript. Issue [33282][issue 33282].
+
 [issue 31887]: https://github.com/dart-lang/sdk/issues/31887
 [issue 30638]: https://github.com/dart-lang/sdk/issues/30638
 [issue 32233]: https://github.com/dart-lang/sdk/issues/32233
 [issue 32881]: https://github.com/dart-lang/sdk/issues/32881
 [issue 33218]: https://github.com/dart-lang/sdk/issues/33218
 [issue 31278]: https://github.com/dart-lang/sdk/issues/31278
+[issue 33282]: https://github.com/dart-lang/sdk/issues/33282
 
 ### Dart VM
 
diff --git a/DEPS b/DEPS
index ba08f05..544f975 100644
--- a/DEPS
+++ b/DEPS
@@ -37,7 +37,7 @@
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
   "co19_rev": "9858ee7d79cf09b50d6b5bc13fb950ae5f357954",
-  "co19_2_rev": "c64be2141d1e4e9a883389d709ef6bf0477c1fcf",
+  "co19_2_rev": "bafb589613379dc1f2e3511566661a5c6250486a",
 
   # As Flutter does, we pull buildtools, including the clang toolchain, from
   # Fuchsia. This revision should be kept up to date with the revision pulled
@@ -78,7 +78,7 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.1.1",  # Please see the note above before updating.
+  "dart_style_tag": "1.1.2",  # Please see the note above before updating.
 
   "dartdoc_tag" : "v0.20.1",
   "fixnum_tag": "0.10.5",
@@ -89,7 +89,7 @@
   "http_multi_server_tag" : "2.0.4",
   "http_parser_tag" : "3.1.1",
   "http_retry_tag": "0.1.1",
-  "http_tag" : "0.11.3+16",
+  "http_tag" : "0.11.3+17",
   "http_throttle_tag" : "1.0.2",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "0.15.2",
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
index ee5e6e6..d1825f9 100644
--- a/build/dart/dart_action.gni
+++ b/build/dart/dart_action.gni
@@ -73,9 +73,8 @@
     # If that's not the case, we'll need another argument to the script to
     # specify this, since we can't know what the output name is (it might be in
     # another file not processed yet).
-    host_executable =
-        get_label_info(host_tool, "root_out_dir") + "/" +
-        get_label_info(host_tool, "name") + executable_suffix
+    host_executable = get_label_info(host_tool, "root_out_dir") + "/" +
+                      get_label_info(host_tool, "name") + executable_suffix
 
     # Add the executable itself as an input.
     inputs += [ host_executable ]
@@ -102,9 +101,9 @@
 
 template("_prebuilt_tool_action") {
   assert(defined(invoker.binary),
-      "The path to where the prebuilt binary lives must be defined")
+         "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")
+         "The target to use if the prebuilt doesn't exist must be defined")
 
   vm_args = []
   if (defined(invoker.vm_args)) {
@@ -112,15 +111,16 @@
   }
 
   if (_is_fuchsia || prebuilt_dart_exe_works) {
-    not_needed(invoker, ["target"])
+    not_needed(invoker, [ "target" ])
     action(target_name) {
-      forward_variables_from(invoker, [
-          "depfile",
-          "deps",
-          "outputs",
-          "testonly",
-          "visibility",
-      ])
+      forward_variables_from(invoker,
+                             [
+                               "depfile",
+                               "deps",
+                               "outputs",
+                               "testonly",
+                               "visibility",
+                             ])
       script = "$_dart_root/build/gn_run_binary.py"
 
       inputs = []
@@ -136,18 +136,14 @@
       }
 
       args = [
-        "compiled_action",
-        rebase_path(invoker.binary),
-      ] + vm_args
+               "compiled_action",
+               rebase_path(invoker.binary),
+             ] + vm_args
       if (defined(invoker.packages)) {
-        args += [
-          "--packages=" + rebase_path(invoker.packages),
-        ]
+        args += [ "--packages=" + rebase_path(invoker.packages) ]
       }
       if (defined(invoker.dfe)) {
-        args += [
-          "--dfe=" + rebase_path(invoker.dfe),
-        ]
+        args += [ "--dfe=" + rebase_path(invoker.dfe) ]
       }
       if (defined(invoker.script)) {
         args += [ rebase_path(invoker.script) ]
@@ -155,16 +151,17 @@
       args += invoker.args
     }
   } else {
-    not_needed(invoker, ["binary"])
+    not_needed(invoker, [ "binary" ])
     _compiled_action(target_name) {
-      forward_variables_from(invoker, [
-          "depfile",
-          "deps",
-          "inputs",
-          "outputs",
-          "testonly",
-          "visibility",
-      ])
+      forward_variables_from(invoker,
+                             [
+                               "depfile",
+                               "deps",
+                               "inputs",
+                               "outputs",
+                               "testonly",
+                               "visibility",
+                             ])
 
       if (defined(invoker.script)) {
         inputs += [ invoker.script ]
@@ -176,9 +173,7 @@
       tool = invoker.target
       args = vm_args
       if (defined(invoker.packages)) {
-        args += [
-          "--packages=" + rebase_path(invoker.packages),
-        ]
+        args += [ "--packages=" + rebase_path(invoker.packages) ]
       }
       if (defined(invoker.script)) {
         args += [ rebase_path(invoker.script) ]
@@ -226,23 +221,39 @@
       binary = prebuilt_dart
       dfe = "$prebuilt_dart_sdk/bin/snapshots/kernel-service.dart.snapshot"
     } else {
-      binary =
-          "$_dart_root/tools/sdks/dart-sdk/bin/dart$executable_suffix"
-      dfe =
-          "$_dart_root/tools/sdks/dart-sdk/bin/snapshots/kernel-service.dart.snapshot"
+      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"
   }
 }
 
 if (_is_fuchsia) {
-template("_prebuilt_gen_snapshot_action") {
-  _prebuilt_tool_action(target_name) {
-    forward_variables_from(invoker, "*")
-    binary = prebuilt_gen_snapshot
-    target = "error"
+  template("_prebuilt_gen_snapshot_action") {
+    _prebuilt_tool_action(target_name) {
+      forward_variables_from(invoker, "*")
+      binary = prebuilt_gen_snapshot
+      target = "error"
+    }
   }
 }
+
+template("prebuilt_dart2js_action") {
+  assert(defined(invoker.script), "script must be defined for $target_name")
+  assert(defined(invoker.outputs), "outputs must be defined for $target_name")
+  assert(defined(invoker.args), "args must be defined for $target_name")
+
+  _prebuilt_tool_action(target_name) {
+    forward_variables_from(invoker, "*")
+
+    # TODO(zra): On Fuchsia use a prebuilt dart2js, or a prebuilt Observatory.
+    extension = ""
+    if (is_win) {
+      extension = ".bat"
+    }
+    binary = "$_dart_root/tools/sdks/dart-sdk/bin/dart2js${extension}"
+    target = "error"
+  }
 }
 
 # This template runs the specified tool produced by the in-progress build.
@@ -283,15 +294,16 @@
   }
 
   _compiled_action(target_name) {
-    forward_variables_from(invoker, [
-        "depfile",
-        "deps",
-        "inputs",
-        "outputs",
-        "tool",
-        "testonly",
-        "visibility",
-    ])
+    forward_variables_from(invoker,
+                           [
+                             "depfile",
+                             "deps",
+                             "inputs",
+                             "outputs",
+                             "tool",
+                             "testonly",
+                             "visibility",
+                           ])
 
     if (!defined(invoker.inputs)) {
       inputs = []
@@ -341,19 +353,20 @@
   if (!_is_fuchsia || !use_prebuilt_dart_sdk) {
     _built_tool_action(target_name) {
       tool = "$_dart_root/runtime/bin:dart"
-      forward_variables_from(invoker, [
-        "args",
-        "depfile",
-        "deps",
-        "inputs",
-        "outputs",
-        "packages",
-        "script",
-        "testonly",
-        "tool",
-        "visibility",
-        "vm_args",
-      ])
+      forward_variables_from(invoker,
+                             [
+                               "args",
+                               "depfile",
+                               "deps",
+                               "inputs",
+                               "outputs",
+                               "packages",
+                               "script",
+                               "testonly",
+                               "tool",
+                               "visibility",
+                               "vm_args",
+                             ])
     }
   } else {
     prebuilt_dart_action(target_name) {
@@ -389,19 +402,20 @@
   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",
-      ])
+      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
@@ -432,23 +446,25 @@
 #    testonly
 #    visibility
 template("gen_snapshot_action") {
-  assert(!defined(invoker.script),
+  assert(
+      !defined(invoker.script),
       "script must not be defined for $target_name. If there is a script use args instead.")
   if (!_is_fuchsia || !use_prebuilt_dart_sdk) {
     _built_tool_action(target_name) {
       tool = "$_dart_root/runtime/bin:gen_snapshot"
-      forward_variables_from(invoker, [
-        "args",
-        "depfile",
-        "deps",
-        "inputs",
-        "outputs",
-        "packages",
-        "testonly",
-        "tool",
-        "visibility",
-        "vm_args",
-      ])
+      forward_variables_from(invoker,
+                             [
+                               "args",
+                               "depfile",
+                               "deps",
+                               "inputs",
+                               "outputs",
+                               "packages",
+                               "testonly",
+                               "tool",
+                               "visibility",
+                               "vm_args",
+                             ])
     }
   } else {
     _prebuilt_gen_snapshot_action(target_name) {
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index fa6c427c..79178c0 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -65,6 +65,8 @@
 % - Remove "boolean conversion". It's just an error to not be a bool.
 % - Adjust cyclic subtype prevention rule for type variables.
 % - Clarify that it is an error to use FutureOr<T> as a superinterface etc.
+% - Eliminate the notion of static warnings, all program faults are now errors.
+% - It is no longer an error for a getter to have return type `void`.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -308,11 +310,11 @@
 }
 
 \LMHash{}
-When the specification says that one piece of syntax {\em is equivalent to} another piece of syntax, it means that it is equivalent in all ways, and the former syntax should generate the same static warnings and have the same run-time behavior as the latter.
+When the specification says that one piece of syntax {\em is equivalent to} another piece of syntax, it means that it is equivalent in all ways, and the former syntax should generate the same compile-time errors and have the same run-time behavior as the latter, if any.
 \commentary{
 Error messages, if any, should always refer to the original syntax.
 }
-If execution or evaluation of a construct is said to be equivalent to execution or evaluation of another construct, then only the run-time behavior is equivalent, and only the static warnings or errors mentioned for the original syntax applies.
+If execution or evaluation of a construct is said to be equivalent to execution or evaluation of another construct, then only the run-time behavior is equivalent, and compile-time errors apply only for the original syntax.
 
 
 \section{Overview}
@@ -421,8 +423,8 @@
 Ultimately, the question is whether lexical scoping takes precedence over inheritance or vice versa.
 Dart chooses the former.
 
-Allowing inherited names to take precedence over locally declared names can create unexpected situations as code evolves.
-Specifically, the behavior of code in a subclass can change without warning if a new name is introduced in a superclass.
+Allowing inherited names to take precedence over locally declared names could create unexpected situations as code evolves.
+Specifically, the behavior of code in a subclass could silently change if a new name is introduced in a superclass.
 Consider:
 }
 
@@ -514,8 +516,8 @@
 Isolates are created by spawning (\ref{spawningAnIsolate}).
 
 
-\section{Errors and Warnings}
-\LMLabel{errorsAndWarnings}
+\section{Errors}
+\LMLabel{errors}
 
 \LMHash{}
 This specification distinguishes between several kinds of errors.
@@ -529,12 +531,16 @@
 Modern programming language implementations often interleave compilation and execution, so that compilation of a method may be delayed, e.g., until it is first invoked.
 Consequently, compile-time errors in a method $m$ may be reported as late as the time of $m$'s first invocation.
 
-As a web language, Dart is often loaded directly from source, with no intermediate binary representation.
+Dart is often loaded directly from source, with no intermediate binary representation.
 In the interests of rapid loading, Dart implementations may choose to avoid full parsing of method bodies, for example.
 This can be done by tokenizing the input and checking for balanced curly braces on method body entry.
 In such an implementation, even syntax errors will be detected only when the method needs to be executed, at which time it will be compiled (JITed).
 
 In a development environment a compiler should of course report compilation errors eagerly so as to best serve the programmer.
+
+A Dart development environment might choose to support error eliminating program transformations, e.g.,
+replacing an erroneous expression by the invocation of a debugger.
+It is outside the scope of this document to specify how such transformations work, and where they may be applied.
 }
 
 \LMHash{}
@@ -553,18 +559,15 @@
 }
 
 \LMHash{}
-{\em Static warnings} are those errors reported by the static checker.
-They have no effect on execution.
-Many, but not all, static warnings relate to types, in which case they are known as {\em static type warnings}.
-Static warnings must be provided by Dart compilers used during development such as those incorporated in IDEs or otherwise intended to be used by developers for developing code.
-Compilers that are part of run-time execution environments such as virtual machines should not issue static warnings.
+When this specification says that a {\em run-time error} occurs,
+it means that a corresponding error object is thrown.
+When it says that a {\em dynamic type error} occurs,
+it represents a failed run-time type check,
+and the object which is thrown implements \code{TypeError}.
 
 \LMHash{}
-{\em Dynamic type errors} are type errors reported in checked mode.
-
-\LMHash{}
-{\em Run-time errors} are exceptions thrown during execution.
-Whenever we say that an exception $ex$ is {\em thrown}, it acts like an expression had {\em thrown} (\ref{completion}) with $ex$ as exception object and with a stack trace corresponding to the current system state.
+Whenever we say that an exception $ex$ is {\em thrown},
+it acts like an expression had {\em thrown} (\ref{completion}) with $ex$ as exception object and with a stack trace corresponding to the current system state.
 When we say that {\em a} $C$ {\em is thrown}, where $C$ is a class, we mean that an instance of class $C$ is thrown.
 
 \LMHash{}
@@ -631,19 +634,18 @@
 The declaration of a final variable must include the modifier \FINAL{}.
 
 \LMHash{}
-It is a static warning if a final instance variable that has been initialized at its point of declaration is also initialized in a constructor.
-% It is a static warning if a final instance variable that has been initialized by means of an initializing formal of a constructor is also initialized elsewhere in the same constructor.
+It is a compile-time error if a final instance variable whose declaration has an initializer expression
+is also initialized by a constructor, either by an initializing formal or an initializer list entry.
 It is a compile-time error if a local variable $v$ is final and $v$ is not initialized at its point of declaration.
-It is a static warning and a dynamic error to assign to a final local variable.
+It is a compile-time error to assign to a final local variable.
 
 \commentary{
-A library or static variable is guaranteed to have an initializer at its declaration by the grammar.
-
-Attempting to assign to a final variable anywhere except in its declaration or in a constructor header will cause a run-time error to be thrown as discussed below.
-The assignment will also give rise to a static warning.
-Any repeated assignment to a final variable will also lead to a run-time error.
-
-Taken as a whole, the rules ensure that any attempt to execute multiple assignments to a final variable will yield static warnings and repeated assignments will fail dynamically.
+It is a compile-time error if a final instance variable
+that has been initialized by means of an initializing formal of a constructor $k$
+is also initialized in the initializer list of $k$ (\ref{initializerLists}).
+Any attempt to assign to a final non-local variable \id{} will cause a compile-time error,
+because it amounts to an invocation of a setter named \code{\id=},
+except of course when such a setter has been declared separately.
 }
 
 \LMHash{}
@@ -867,7 +869,7 @@
 Let $R$ be the static type of $e$
 and let $T$ be the actual return type (\ref{actualTypeOfADeclaration})
 of the function that has this body.
-It is a static warning if $T$ is not \VOID{} and either
+It is a compile-time error if $T$ is not \VOID{} and either
 the function is synchronous and the static type of $R$ is not assignable to $T$,
 or the function is asynchronous and \code{Future<$flatten(R)$>}
 is not assignable to $T$.
@@ -904,9 +906,9 @@
 This situation is very unusual so it is not worth making an exception to the general rule for constructors in order to allow it.
 }
 \LMHash{}
-It is a static warning if the declared return type of a function marked \ASYNC{} is not a supertype of \code{Future<\mbox{$T$}>} for some type $T$.
-It is a static warning if the declared return type of a function marked \SYNC* is not a supertype of \code{Iterable<\mbox{$T$}>} for some type $T$.
-It is a static warning if the declared return type of a function marked \ASYNC* is not a supertype of \code{Stream<\mbox{$T$}>} for some type $T$.
+It is a compile-time error if the declared return type of a function marked \ASYNC{} is not a supertype of \code{Future<$T$>} for some type $T$.
+It is a compile-time error if the declared return type of a function marked \SYNC* is not a supertype of \code{Iterable<$T$>} for some type $T$.
+It is a compile-time error if the declared return type of a function marked \ASYNC* is not a supertype of \code{Stream<$T$>} for some type $T$.
 
 
 \subsection{Function Declarations}
@@ -1358,18 +1360,15 @@
 Instance methods are functions (\ref{functions}) whose declarations are immediately contained within a class declaration and that are not declared \STATIC{}.
 The instance methods of a class $C$ are those instance methods declared by $C$ and the instance methods inherited by $C$ from its superclass.
 
-%make these warnings if possible
+\LMHash{}
+It is a compile-time error if an instance method $m_1$ overrides (\ref{inheritanceAndOverriding}) an instance member $m_2$ and $m_1$ has a greater number of required parameters than $m_2$.
+It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$ and $m_1$ has fewer positional parameters than $m_2$.
+It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$ and $m_1$ does not declare all the named parameters declared by $m_2$.
 
 \LMHash{}
-It is a static warning if an instance method $m_1$ overrides (\ref{inheritanceAndOverriding}) an instance member $m_2$ and $m_1$ has a greater number of required parameters than $m_2$.
-It is a static warning if an instance method $m_1$ overrides an instance member $m_2$ and $m_1$ has fewer positional parameters than $m_2$.
-It is a static warning if an instance method $m_1$ overrides an instance member $m_2$ and $m_1$ does not declare all the named parameters declared by $m_2$.
-
-% not quite right. It should be ok to override a method that requires N parameters with one that requires M < N but accepts the others as optional.
-
-\LMHash{}
-It is a static warning if an instance method $m_1$ overrides an instance member $m_2$ and the type of $m_1$ is not a subtype of the type of $m_2$.
-It is a static warning if an instance method $m_1$ overrides an instance member $m_2$, the signature of $m_2$ explicitly specifies a default value for a formal parameter $p$, and the signature of $m_1$ implies a different default value for $p$.
+%% TODO(eernst): We need to use the concept of 'correctly overrides' rather than 'is a subtype of', e.g., to treat `void` correctly.
+It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$ and the type of $m_1$ is not a subtype of the type of $m_2$.
+It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$, the signature of $m_2$ explicitly specifies a default value for a formal parameter $p$, and the signature of $m_1$ implies a different default value for $p$.
 
 \commentary{
 A method declaration may conflict with other declarations
@@ -1433,13 +1432,22 @@
 It is a compile-time error to declare an optional parameter in an operator.
 
 \LMHash{}
-It is a static warning if the return type of the user-declared operator \code{[]=} is explicitly declared and not \VOID{}.
+It is a compile-time error if the return type of a user-declared operator \code{[]=} is explicitly declared and not \VOID{}.
 
 \commentary{
 If no return type is specified for a user-declared operator \code{[]=}, its return type is \VOID{} (\ref{typeOfAFunction}).
 }
 
-% add rationale: return in []= methods will have no effect, a the expression always returns its second argument (the RHS of the assignment, for consistency with assignment in general). So it's best to enforce this by declaring the method to be void, even though the expression that uses it returns an object with the type of the RHS, as described in \ref{assignment}.
+\rationale{
+The return type is \VOID{} because
+a return statement in an implementation of operator \code{[]=} does not return a value.
+Consider a non-throwing evaluation of an expression $e$ of the form \code{$e_1$[$e_2$] = $e_3$},
+and assume that the evaluation of $e_3$ yields an instance $o$.
+$e$ will then evaluate to $o$,
+and even if the executed body of operator \code{[]=} completes with a value $o'$,
+that is, if $o'$ is returned, that value is simply ignored.
+The rationale for this behavior is that assignments should be guaranteed to evaluate to the assigned value.
+}
 
 
 \subsection{Getters}
@@ -1474,9 +1482,8 @@
 }
 
 \LMHash{}
-It is a static warning if the return type of a getter is \VOID.
-It is a static warning if a getter $m_1$ overrides (\ref{inheritanceAndOverriding}) a getter
-$m_2$ and the type of $m_1$ is not a subtype of the type of $m_2$.
+It is a compile-time error if a getter $m_1$ overrides (\ref{inheritanceAndOverriding}) a getter $m_2$
+and the return type of $m_1$ is not a subtype of the return type of $m_2$.
 
 
 \subsection{Setters}
@@ -1514,12 +1521,12 @@
 We could enforce this via the grammar, but we'd have to specify the evaluation rules in that case.
 }
 
-%It is a compile-time error if a class has both a setter and a method with the same name. This restriction holds regardless of whether the setter is defined explicitly or implicitly, or whether the setter or the method are inherited or not.
-
 \LMHash{}
-It is a static warning if a setter declares a return type other than \VOID{}.
-It is a static warning if a setter $m_1$ overrides (\ref{inheritanceAndOverriding}) a setter $m_2$ and the type of $m_1$ is not a subtype of the type of $m_2$.
-It is a static warning if a class has a setter named $v=$ with argument type $T$ and a getter named $v$ with return type $S$, and $T$ may not be assigned to $S$.
+It is a compile-time error if a setter declares a return type other than \VOID{}.
+It is a compile-time error if a setter $m_1$ overrides (\ref{inheritanceAndOverriding}) a setter $m_2$
+and the parameter type of $m_1$ is not a supertype of the parameter type of $m_2$.
+It is a compile-time error if a class has a setter named $v=$ with argument type $T$ and a getter named $v$ with return type $S$,
+and $S$ may not be assigned to $T$.
 
 \commentary{
 A setter declaration may conflict with other declarations
@@ -1551,25 +1558,25 @@
 }
 
 % so does an abstract method override a method in a superclass or not? Does the superclass method get inherited or not?  This generally makes the spec inconsistent, as there is no simple answer.
-% For example - if we say it does not override, then the superclass member is inherited, in which case the rules for warning break down, and also there is question of whether there are two definitions of the same name.
+% For example - if we say it does not override, then the superclass member is inherited, in which case the rules for errors break down, and also there is question of whether there are two definitions of the same name.
 % But if we do override, method lookup rules break down.  So several things need revisiting.
 
 \rationale{
 The purpose of an abstract method is to provide a declaration for purposes such as type checking and reflection.
 In classes used as mixins, it is often useful to introduce such declarations for methods that the mixin expects will be provided by the superclass the mixin is applied to.
 }
-%always results in a run-time error. This must be \code{NoSuchMethodError} or an instance of a subclass of \code{NoSuchMethodError}, such as \code{AbstractMethodError}.
 
 \LMHash{}
-It is a static warning if an abstract member $m$ is declared or inherited in a concrete class $C$ unless:
+%% TODO(eernst): Revise this to use the concepts of interfaces, and do not say that an abstract member is inherited by a class.
+It is a compile-time error if an abstract member $m$ is declared or inherited in a concrete class $C$ unless:
 \begin{itemize}
 \item $m$ overrides a concrete member, or
 \item $C$ has a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
 \end{itemize}
 
 \rationale{
-We wish to warn if one declares a concrete class with abstract members.
-However, code like the following should work without warnings:
+We wish to detect if one declares a concrete class with abstract members.
+However, code like the following should work:
 }
 
 \begin{dartCode}
@@ -1587,7 +1594,7 @@
 
 \rationale{
 At run time, the concrete method \code{one} declared in \code{Base} will be executed, and no problem should arise.
-Therefore no warning should be issued and so we suppress warnings if a corresponding concrete member exists in the hierarchy.
+Therefore no error should be raised if a corresponding concrete member exists in the hierarchy.
 }
 
 
@@ -1613,34 +1620,6 @@
 An instance getter for it can always be defined manually if desired.
 }
 
-%An instance variable declaration of one of the forms \code{$T$ $v$;}, \code{\FINAL{} $T$ $v$;} , \code{$T$ $v$ = $e$;}, \code{\CONST{} $T$ $v$ = $e$;} or \code{\FINAL{} $T$ $v$ = $e$;} always induces an implicit getter function (\ref{getters}) with signature
-
-%$T$ \GET{} $v$
-
-%whose invocation evaluates to the value stored in $v$.
-
-%An instance variable declaration of one of the forms \code{\VAR{} $v$;}, \code{\FINAL{} $v$;}, \code{\VAR{} $v$ = $e$;}, \code{\CONST{} $v$ = $e$;} or \code{\FINAL{} $v$ = $e$;} always induces an implicit getter function with signature
-
-%\GET{} $v$
-
-%whose invocation evaluates to the value stored in $v$.
-
-%\commentary{Getters are introduced for all instance and static variables (\ref{staticVariables}), regardless of whether they are const/final or not.}
-
-%A non-final instance variable declaration of the form \code{$T$ $v$;} or the form \code{$T$ $v$ = $e$;} always induces an implicit setter function (\ref{setters}) with signature
-
-%\VOID{} \SET{} $v=(T$ $x)$
-
-%whose execution sets the value of $v$ to the incoming argument $x$.
-
-%A non-final instance variable declaration of the form \code{\VAR{} $v$;} or the form \code{\VAR{} $v$ = $e$;} always induces an implicit setter function with signature
-
-%\SET{} $v=(x)$
-
-%whose execution sets the value of $v$ to the incoming argument $x$.
-
-% It is a compile-time error/warning if a class $C$ declares a final instance variable $v$ and $C$ inherits a setter $v=$.
-
 
 \subsection{Constructors}
 \LMLabel{constructors}
@@ -1687,7 +1666,7 @@
 \LMHash{}
 If an explicit type is attached to the initializing formal, that is its static type.
 Otherwise, the type of an initializing formal named \id{} is $T_{id}$, where $T_{id}$ is the type of the instance variable named \id{} in the immediately enclosing class.
-It is a static warning if the static type of \id{} is not a subtype of $T_{id}$.
+It is a compile-time error if the static type of \id{} is not a subtype of $T_{id}$.
 
 \LMHash{}
 Initializing formals constitute an exception to the rule that every formal parameter introduces a local variable into the formal parameter scope (\ref{formalParameters}).
@@ -1797,7 +1776,7 @@
 \item Initialization by means of an initializing formal of $k$.
 \end{itemize}
 
-or a static warning occurs.
+or a compile-time error occurs.
 It is a compile-time error if $k$'s initializer list contains an initializer for a variable that is not an instance variable declared in the immediately surrounding class.
 
 \commentary{
@@ -2001,7 +1980,8 @@
 }
 
 \LMHash{}
-It is a static warning if $type$ does not denote a class accessible in the current scope; if $type$ does denote such a class $C$ it is a static warning if the referenced constructor (be it \metavar{type} or \code{\metavar{type}.\id}) is not a constructor of $C$.
+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'$.
@@ -2045,14 +2025,14 @@
 It is a compile-time error if $k$ is prefixed with the \CONST{} modifier but $k'$ is not a constant constructor (\ref{constantConstructors}).
 
 \LMHash{}
-It is a static warning if the function type of $k'$ is not a subtype of the type of $k$.
+It is a compile-time error if the function type of $k'$ is not a subtype of the type of $k$.
 
 \commentary{
 This implies that the resulting object conforms to the interface of the immediately enclosing class of $k$.
 }
 
 \LMHash{}
-It is a static type warning if any of the type arguments to $k'$ are not subtypes of the bounds of the corresponding formal type parameters of $type$.
+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$.
 
 
 \subsubsection{Constant Constructors}
@@ -2358,11 +2338,8 @@
 Finally, static members never override anything.
 }
 
-\LMHash{}
-It is a static warning if a concrete class inherits an abstract method.
-
 \commentary{
-For convenience, here is a summary of the relevant rules.
+For convenience, here is a summary of the relevant rules, using `error' to denote compile-time errors.
 Remember that this is not normative.
 The controlling language is in the relevant sections of the specification.
 
@@ -2373,47 +2350,44 @@
   When we speak of members here, we mean accessible instance or static variables, getters, setters, and methods (\ref{classes}).
 \item You cannot have two members with the same name in the same class - be they declared or inherited (\ref{scoping}, \ref{classes}).
 \item Static members are never inherited.
-\item It is a warning if you have an static member named $m$ in your class or any superclass (even though it is not inherited) and an instance member of the same name (\ref{instanceMethods}, \ref{getters}, \ref{setters}).
-\item It is a warning if you have a static setter $v=$, and an instance member $v$ (\ref{setters}).
-\item It is a warning if you have a static getter $v$ and an instance setter $v=$ (\ref{getters}).
+\item It is an error if you have an static member named $m$ in your class and an instance member of the same name (\ref{instanceMethods}, \ref{getters}, \ref{setters}).
+\item It is an error if you have a static setter $v=$, and an instance member $v$ (\ref{setters}).
+\item It is an error if you have a static getter $v$ and an instance setter $v=$ (\ref{getters}).
 \item If you define an instance member named $m$, and your superclass has an instance member of the same name, they override each other.
 This may or may not be legal.
 \item \label{typeSigAssignable}
-If two members override each other, it is a static warning if their type signatures are not assignable to each other (\ref{instanceMethods}, \ref{getters}, \ref{setters}) (and since these are function types, this means the same as "subtypes of each other").
+%% TODO(eernst): This is commentary, but we may need to adjust it to say 'correctly overrides'.
+If two members override each other, it is an error if their type signatures are not assignable to each other (\ref{instanceMethods}, \ref{getters}, \ref{setters}) (and since these are function types, this means the same as "subtypes of each other").
 \item \label{requiredParams}
-If two members override each other, it is a static warning if the overriding member has more required parameters than the overridden one (\ref{instanceMethods}).
+If two members override each other, it is an error if the overriding member has more required parameters than the overridden one (\ref{instanceMethods}).
 \item \label{optionalPositionals}
-If two members override each other, it is a static warning if the overriding member has fewer positional parameters than the overridden one (\ref{instanceMethods}).
+If two members override each other, it is an error if the overriding member has fewer positional parameters than the overridden one (\ref{instanceMethods}).
 \item \label{namedParams}
-If two members override each other, it is a static warning if the overriding member does not have all the named parameters that the overridden one has (\ref{instanceMethods}).
-\item Setters, getters and operators never have optional parameters of any kind; it's a compile-time error (\ref{operators}, \ref{getters}, \ref{setters}).
-\item It is a compile-time error if a member has the same name as its enclosing class (\ref{classes}).
+If two members override each other, it is an error if the overriding member does not have all the named parameters that the overridden one has (\ref{instanceMethods}).
+\item Setters, getters and operators never have optional parameters of any kind; it's an error (\ref{operators}, \ref{getters}, \ref{setters}).
+\item It is an error if a member has the same name as its enclosing class (\ref{classes}).
 \item A class has an implicit interface (\ref{classes}).
 \item Superinterface members are not inherited by a class, but are inherited by its implicit interface.
 Interfaces have their own inheritance rules (\ref{interfaceInheritanceAndOverriding}).
 \item A member is abstract if it has no body and is not labeled \EXTERNAL{} (\ref{abstractInstanceMembers}, \ref{externalFunctions}).
 \item A class is abstract if{}f it is explicitly labeled \ABSTRACT{}.% or if it declares (not just inherits) an abstract member (\ref{classes}).
-\item It is a static warning if a concrete class has an abstract member (declared or inherited).
-\item It is a static warning and a dynamic error to call a non-factory constructor of an abstract class (\ref{new}).
-\item If a class defines an instance member named $m$, and any of its superinterfaces have a member named $m$, the interface of the class overrides $m$.
+\item It is an error if a concrete class has an abstract member (declared or inherited).
+\item It is an error to call a non-factory constructor of an abstract class using an instance creation expression (\ref{instanceCreation}),
+  such a constructor may only be invoked from another constructor using a super invocation (\ref{superinvocation}).
+\item If a class defines an instance member named $m$,
+  and any of its superinterfaces have a member named $m$,
+  the interface of the class contains the $m$ from the class itself.
 \item An interface inherits all members of its superinterfaces that are not overridden and not members of multiple superinterfaces.
 \item If multiple superinterfaces of an interface define a member with the same name $m$, then at most one member is inherited.
+%% TODO(eernst): Switch to use 'correctly overrides' terminology.
 That member (if it exists) is the one whose type is a subtype of all the others.
-If there is no such member, then:
-\begin{itemize}
-\item A static warning is given.
-\item If possible the interface gets a member named $m$ that has the minimum number of required parameters among all the members in the superinterfaces, the maximal number of positionals, and the superset of named parameters.
-The types of these are all \DYNAMIC{}.
-If this is impossible then no member $m$ appears in the interface.
-\end{itemize} (\ref{interfaceInheritanceAndOverriding})
+If there is no such member, then an error occurs (\ref{interfaceInheritanceAndOverriding}).
 \item Rule \ref{typeSigAssignable} applies to interfaces as well as classes (\ref{interfaceInheritanceAndOverriding}).
-\item It is a static warning if a concrete class does not have an implementation for a method in any of its superinterfaces unless it has a concrete \code{noSuchMethod} method (\ref{superinterfaces}) distinct from the one in class \code{Object}.
+\item It is an error if a concrete class does not have an implementation for a method in any of its superinterfaces unless it has a concrete \code{noSuchMethod} method (\ref{superinterfaces}) distinct from the one in class \code{Object}.
 \item The identifier of a named constructor cannot be the same as the name of a member declared (as opposed to inherited) in the same class (\ref{constructors}).
 \end{enumerate}
 }
 
-%Can we have abstract getters and setters?
-
 
 \subsection{Superinterfaces}
 \LMLabel{superinterfaces}
@@ -2448,8 +2422,6 @@
 \rationale{
 One might argue that it is harmless to repeat a type in the superinterface list, so why make it an error? The issue is not so much that the situation described in program source is erroneous, but that it is pointless.
 As such, it is an indication that the programmer may very well have meant to say something else - and that is a mistake that should be called to her or his attention.
-Nevertheless, we could simply issue a warning; and perhaps we should and will.
-That said, problems like these are local and easily corrected on the spot, so we feel justified in taking a harder line.
 }
 
 \LMHash{}
@@ -2457,7 +2429,9 @@
 
 \LMHash{}
 Let $C$ be a concrete class that does not have a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
-It is a static warning if the implicit interface of $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding concrete instance member $m$ of type $F'$ such that $F' <: F$.
+%% TODO(eernst): Adjust to use 'correctly overrides' terminology.
+It is a compile-time error if the implicit interface of $C$ includes an accessible instance member $m$ of type $F$,
+and $C$ does not declare or inherit a corresponding concrete instance member $m$ of type $F'$ such that $F' <: F$.
 
 \commentary{
 A class does not inherit members from its superinterfaces.
@@ -2465,20 +2439,29 @@
 }
 
 \rationale{
-We choose to issue these warnings only for concrete classes; an abstract class might legitimately be designed with the expectation that concrete subclasses will implement part of the interface.
-We also disable these warnings if a concrete \code{noSuchMethod()} declaration is present or inherited from any class other than \code{Object}.
-In such cases, the supported interface is going to be implemented via \code{noSuchMethod()} and no actual declarations of the implemented interface's members are needed.
-This allows proxy classes for specific types to be implemented without provoking type warnings.
+We choose to raise these compile-time errors only for concrete classes;
+an abstract class might legitimately be designed with the expectation that concrete subclasses will implement part of the interface.
+We also disable these errors if a concrete \code{noSuchMethod()} declaration is present or inherited from any class other than \code{Object},
+unless a concrete member $m$ is declared or inherited.
+The point is that there is an error to disable,
+so the signature of the concrete $m$ is not a correct override of the signature in the class interface.
+Otherwise, when all such errors have been disabled,
+the supported interface is going to be implemented via \code{noSuchMethod()}
+and no actual declarations of the implemented interface's members are needed.
+This allows proxy classes for specific types to be implemented without provoking errors.
 }
 
 \LMHash{}
-It is a static warning if the implicit interface of a class $C$ includes an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if $F'$ is not a subtype of $F$.
+%% TODO(eernst): Switch to use 'correctly overrides' terminology.
+It is a compile-time error if the implicit interface of a class $C$ includes an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if $F'$ is not a subtype of $F$.
 
 \rationale{
-However, if a class does explicitly declare a member that conflicts with its superinterface, this always yields a static warning.
+However, if a class does explicitly declare a member that conflicts with its superinterface, this always yields an error.
 }
-%It is a static warning if an imported superinterface of a class $C$ declares private members.
 
+% TODO(eernst): When integrating nosuchmethod-forwarders.md, delete this and make sure that we mention the
+% case where there is no `noSuchMethod` and we still generate forwarders.
+% Consider: It is a compile-time error if an imported superinterface of a class $C$ declares private members.
 % Should we ignore unimplemented private members?
 
 
@@ -2557,10 +2540,10 @@
 $I$ {\em inherits} all members of $inherited(I, L)$ and $I$ {\em overrides} $m'$ if $m' \in overrides(I, L)$.
 
 \LMHash{}
-All the static warnings pertaining to the overriding of instance members given in section \ref{classes} above hold for overriding between interfaces as well.
+All the compile-time errors pertaining to the overriding of instance members given in section \ref{classes} above hold for overriding between interfaces as well.
 
 \LMHash{}
-It is a static warning if $m$ is a method and $m'$ is a getter, or if $m$ is a getter and $m'$ is a method.
+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.
 
 %Let $I = S_0$ be the implicit interface of a class $C$ declared in library $L$, and let $\{S_1, \ldots, S_k\}$ be the set of all superinterfaces of $I$.
 
@@ -2572,40 +2555,13 @@
 However, if the above rules would cause multiple members $m_1, \ldots, m_k$ with the same name $n$ to be inherited (because identically named members existed in several superinterfaces) then at most one member is inherited.
 
 \LMHash{}
-If some but not all of the $m_i, 1 \le i \le k$ are getters none of the $m_i$ are inherited, and a static warning is issued.
+If some but not all of the $m_i, 1 \le i \le k$ are getters, a compile-time error occurs.
 
 \LMHash{}
+%% TODO(eernst): Adjust to use 'correctly overrides' terminology.
 Otherwise, if the static types $T_1, \ldots, T_k$ of the members $m_1, \ldots, m_k$ are not identical then there must be an $x \in 1 .. k$ such that $T_x <: T_i$ for all $i \in 1 .. k$,
-or a static type warning occurs.
-The member that is inherited  is $m_x$, if it exists; otherwise:
-let $numberOfPositionals(f)$ denote the number of positional parameters of a function $f$,
-and let $numberOfRequiredParams(f)$ denote the number of required parameters of a function $f$.
-Furthermore, let $s$ denote the set of all named parameters of the $m_1, \ldots, m_k$.
-Then let
-
-$h = max(numberOfPositionals(m_i)), $
-
-$r = min(numberOfRequiredParams(m_i)), i \in 1 .. k$.
-
-\LMHash{}
-Then $I$ has a method named $n$, with $r$ required parameters of type \DYNAMIC{}, $h$ positional parameters of type \DYNAMIC{}, named parameters $s$ of type \DYNAMIC{} and return type \DYNAMIC{}.
-
-\commentary{
-The only situation where the run-time system would be concerned with this would be during reflection, if a mirror attempted to obtain the signature of an interface member.
-}
-
-\rationale{
-The current solution is a tad complex, but is robust in the face of type annotation changes.
-Alternatives: (a) No member is inherited in case of conflict.
-(b) The first m is selected (based on order of superinterface list).
-(c) Inherited member chosen at random.
-
-(a) means that the presence of an inherited member of an interface varies depending on type signatures.
-(b) is sensitive to irrelevant details of the declaration, and
-(c) is liable to give unpredictable results between implementations or even between different compilation sessions.
-}
-
-% Need warnings if overrider conflicts with overriddee either because signatures are incompatible or because done is a method and one is a getter or setter.
+or a compile-time error occurs.
+The member that is inherited  is $m_x$, if it exists.
 
 
 \section{Mixins}
@@ -2726,11 +2682,12 @@
 
 \LMHash{}
 Let $K$ be a class declaration with the same constructors, superclass and interfaces as $C$, and the instance members declared by $M$ (respectively $M_1, \ldots, M_k$).
-It is a static warning if the declaration of $K$ would cause a static warning.
 It is a compile-time error if the declaration of $K$ would cause a compile-time error.
 
 \commentary{
-If, for example, $M$ declares an instance member $im$ whose type is at odds with the type of a member of the same name in $S$, this will result in a static warning just as if we had defined $K$ by means of an ordinary class declaration extending $S$, with a body that included $im$.
+If, for example,
+$M$ declares an instance member $im$ whose type is at odds with the type of a member of the same name in $S$,
+this will result in a compile-time error just as if we had defined $K$ by means of an ordinary class declaration extending $S$, with a body that included $im$.
 }
 
 \LMHash{}
@@ -2743,11 +2700,11 @@
 
 \LMHash{}
 Let $A$ be an application of $M_A$.
-It is a static warning if the superclass of $A$ is not a subtype of $S_{static}$.
+It is a compile-time error if the superclass of $A$ is not a subtype of $S_{static}$.
 
 \LMHash{}
 Let $C$ be a class declaration that includes $M_A$ in a with clause.
-It is a static warning if $C$ does not implement, directly or indirectly, all the direct superinterfaces of $M$.
+It is a compile-time error if $C$ does not implement, directly or indirectly, all the direct superinterfaces of $M$.
 
 
 \subsection{Mixin Composition}
@@ -2781,7 +2738,7 @@
 \rationale{
 The intermediate classes produced by mixin composition are regarded as abstract because they cannot be instantiated independently.
 They are only introduced as anonymous superclasses of ordinary class declarations and mixin applications.
-Consequently, no warning is given if a mixin composition includes abstract members, or incompletely implements an interface.
+Consequently, no errors are raised if a mixin composition includes abstract members, or incompletely implements an interface.
 }
 
 \LMHash{}
@@ -2857,8 +2814,8 @@
 and a parameterized type $T$ of the form \code{C<$T_1, \ldots,\ T_l$>}.
 
 \LMHash{}
-It is a static warning if $m \not= l$.
-It is a static warning if $T$ is not well-bounded
+It is a compile-time error if $m \not= l$.
+It is a compile-time error if $T$ is not well-bounded
 (\ref{superBoundedTypes}).
 
 \commentary{
@@ -2883,8 +2840,8 @@
 and the parameterized type $S$ of the form \code{F<$T_1, \ldots,\ T_l$>}.
 
 \LMHash{}
-It is a static warning if $m \not= l$.
-It is a static warning if $S$ is not well-bounded
+It is a compile-time error if $m \not= l$.
+It is a compile-time error if $S$ is not well-bounded
 (\ref{superBoundedTypes}).
 
 \commentary{
@@ -2919,8 +2876,8 @@
 $X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$.
 
 \LMHash{}
-It is a static warning if $m \not= l$.
-It is a static warning if there exists a $j$
+It is a compile-time error if $m \not= l$.
+It is a compile-time error if there exists a $j$
 such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
 
 \commentary{
@@ -2940,7 +2897,7 @@
 \LMHash{}
 A type parameter $T$ may be suffixed with an \EXTENDS{} clause that specifies the {\em upper bound} for $T$.
 If no \EXTENDS{} clause is present, the upper bound is \code{Object}.
-It is a static type warning if a type parameter is a supertype of its upper bound
+It is a compile-time error if a type parameter is a supertype of its upper bound
 when that upper bound is itself a type variable.
 
 \commentary{
@@ -4258,7 +4215,7 @@
 $<\DYNAMIC{}, \DYNAMIC{}>\{k_1:e_1, \ldots, k_n :e_n\}$.
 
 \LMHash{}
-If{}f all the keys in a map literal are compile-time constants, it is a static warning if the values of any two keys in a map literal are equal.
+It is a compile-time error if two keys of a constant map literal are equal.
 
 \LMHash{}
 A map literal is ordered: iterating over the keys and/or values of the maps always happens in the
@@ -4574,7 +4531,7 @@
 %It is a compile-time error if a constructor of a non-generic type invoked by a new expression or a constant object expression is passed any type arguments. It is a compile-time error if a constructor of a generic type with $n$ type parameters invoked by a new expression or a constant object expression is passed $m$ type arguments where $m \ne n$, or if any of its type arguments is misconstructed (\ref{parameterizedTypes}).
 
 \LMHash{}
-It is a static type warning if
+It is a compile-time error if
 the type $T$ in an instance creation expression of one of the forms
 
 \code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
@@ -4584,7 +4541,7 @@
 \code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-is malformed (\ref{dynamicTypeSystem}) or malbounded (\ref{parameterizedTypes}).
+is malformed (\ref{staticTypes}) or malbounded (\ref{parameterizedTypes}).
 
 \LMHash{}
 It is a compile-time error if the type $T$ in an instance creation expression of one of the forms
@@ -4620,23 +4577,17 @@
 
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-%It is a run-time type error if
-%the type $T$ is malformed.
-%It is a static warning if $T$ is a malformed type.
-
-%not a class accessible in the current scope, optionally followed by type arguments.
-
 \LMHash{}
 If $T$ is a class or parameterized type accessible in the current scope then:
 \begin{itemize}
 \item
 If $e$ is of the form
-\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-it is a static warning if \code{$T$.\id} is not the name of a constructor declared by the type $T$.
+\code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
+it is a compile-time error if \code{$T$.\id} is not the name of a constructor declared by the type $T$.
 \item
 If $e$ is of the form
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
-it is a static warning if the type $T$ does not declare a constructor with the same name as the declaration of $T$.
+it is a compile-time error if the type $T$ does not declare a constructor with the same name as the declaration of $T$.
 \end{itemize}
 
 \LMHash{}
@@ -4724,15 +4675,16 @@
 and then evaluation of $e$ also throws $x$ and $t$ (\ref{evaluation}).
 
 \LMHash{}
-It is a static warning if $q$ is a constructor of an abstract class and $q$ is not a factory constructor.
+It is a compile-time error if $q$ is a constructor of an abstract class and $q$ is not a factory constructor.
 
 \commentary{
-The above gives precise meaning to the idea that instantiating an abstract class leads to a warning.
+The above gives precise meaning to the idea that instantiating an abstract class leads to an error.
 A similar clause applies to constant object creation in the next section.
 }
 
 \rationale{
-In particular, a factory constructor can be declared in an abstract class and used safely, as it will either produce a valid instance or lead to a warning inside its own declaration.
+In particular, a factory constructor can be declared in an abstract class and used safely,
+as it will either produce a valid instance or throw.
 }
 
 \LMHash{}
@@ -4745,7 +4697,7 @@
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 is $T$.
-It is a static warning if the static type of $a_i, 1 \le i \le n + k$ may not be assigned to the type of the corresponding formal parameter of the constructor \code{$T$.\id} (respectively $T$).
+It is a compile-time error if the static type of $a_i, 1 \le i \le n + k$ may not be assigned to the type of the corresponding formal parameter of the constructor \code{$T$.\id} (respectively $T$).
 
 
 \subsubsection{Const}
@@ -4842,7 +4794,7 @@
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}:\ a_{n+1}, \ldots,\ x_{n+k}:\ a_{n+k}$)}
 
 is $T$.
-It is a static warning if the static type of $a_i, 1 \le i \le n+ k$ may not be assigned to the type of the corresponding formal parameter of the constructor \code{$T$.\id} (respectively $T$).
+It is a compile-time error if the static type of $a_i, 1 \le i \le n+ k$ may not be assigned to the type of the corresponding formal parameter of the constructor \code{$T$.\id} (respectively $T$).
 
 \LMHash{}
 It is a compile-time error if evaluation of a constant object results in an uncaught exception being thrown.
@@ -4875,7 +4827,7 @@
 }
 
 \LMHash{}
-Given an instance creation expression of the form \CONST{} $q(a_1, \ldots,\ a_n)$ it is a static warning if $q$ is a constructor of an abstract class (\ref{abstractInstanceMembers}) but $q$ is not a factory constructor.
+Given an instance creation expression of the form \CONST{} $q(a_1, \ldots,\ a_n)$ it is a compile-time error if $q$ is a constructor of an abstract class (\ref{abstractInstanceMembers}) but $q$ is not a factory constructor.
 
 
 \subsection{Spawning an Isolate}
@@ -4890,7 +4842,7 @@
 It is possible for a running isolate to exhaust its memory or stack, resulting in a run-time error that cannot be effectively caught, which will force the isolate to be suspended.
 
 \commentary{
-As discussed in section \ref{errorsAndWarnings}, the handling of a suspended isolate is the responsibility of the embedder.
+As discussed in section \ref{errors}, the handling of a suspended isolate is the responsibility of the embedder.
 }
 
 
@@ -5186,7 +5138,7 @@
 Let $T_i$ be the static type of $a_i$.
 If the static type of $f$ is \DYNAMIC{} or the built-in class \FUNCTION{},
 no further static checks are performed.
-Otherwise, it is a static type warning if the static type of $f$ is not a function type.
+Otherwise, it is a compile-time error if the static type of $f$ is not a function type.
 
 \LMHash{}
 Otherwise, let $X_1, \ldots, X_s$ be the formal type parameters of the static type of $f$,
@@ -5199,10 +5151,10 @@
 }
 
 \LMHash{}
-It is a static warning if $T_j$ may not be assigned to $S_j, j \in 1 .. m$.
-It is a static warning if $m < h$ or if $m > n$.
-Furthermore, each $q_i, i \in 1 .. l$, must have a corresponding named parameter in the set $\{p_{h+1}, \ldots, p_{h+k}\}$ or a static warning occurs.
-It is a static warning if $T_{m+j}$ may not be assigned to $S_{q_j}, j \in 1 .. l$.
+It is a compile-time error if $T_j$ may not be assigned to $S_j, j \in 1 .. m$.
+It is a compile-time error if $m < h$ or if $m > n$.
+Furthermore, each $q_i, i \in 1 .. l$, must have a corresponding named parameter in the set $\{p_{h+1}, \ldots, p_{h+k}\}$ or a compile-time error occurs.
+It is a compile-time error if $T_{m+j}$ may not be assigned to $S_{q_j}, j \in 1 .. l$.
 
 
 \subsubsection{Unqualified Invocation}
@@ -5250,7 +5202,7 @@
 \code{\THIS{}.\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 % Should also say:
-% It is a static warning if $i$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no lexically visible declaration named \id{} in scope.
+% It is a compile-time error if $i$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no lexically visible declaration named \id{} in scope.
 
 
 \subsubsection{Function Expression Invocation}
@@ -5329,7 +5281,7 @@
 
 \LMHash{}
 Let $F$ be the static type of $e_f$.
-It is a static warning unless one of the following conditions is satisfied:
+It is a compile-time error unless one of the following conditions is satisfied:
 \begin{enumerate}
 \item $F$ is \DYNAMIC{}.
 \item $F$ is \FUNCTION{}.
@@ -5526,7 +5478,7 @@
 \code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \noindent
-Exactly the same static warnings that would be caused by
+Exactly the same compile-time errors that would be caused by
 
 \code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 
@@ -5649,7 +5601,7 @@
 
 \LMHash{}
 Let $T$ be the static type of $e$.
-It is a static type warning if $T$ does not have an accessible (\ref{privacy}) instance member named $m$, unless either:
+It is a compile-time error if $T$ does not have an accessible (\ref{privacy}) instance member named $m$, unless either:
 \begin{itemize}
 \item $T$ is \code{Type}, $e$ is a constant type literal,
 and the class corresponding to $e$ has a static getter named $m$.
@@ -5661,13 +5613,11 @@
 The expectation is that any concrete subclass of \FUNCTION{} will implement \CALL,
 but there is no method signature which can be assumed for \CALL{} in \FUNCTION{}
 because every signature will conflict with some potential overriding declarations.
-Note that any use of \CALL{} on a subclass of \FUNCTION{} that fails to implement \CALL{} will provoke a warning,
-as this exemption is limited to type \FUNCTION{}, and does not apply to its subtypes.
 }
 \end{itemize}
 
 \LMHash{}
-If $T.m$ exists, it is a static type warning if the type $F$ of $T.m$ may not be assigned to a function type.
+If $T.m$ exists, it is a compile-time error if the type $F$ of $T.m$ may not be assigned to a function type.
 If $T.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}.
 Otherwise, let $X_1, \ldots, X_s$ be the formal type parameters of the type of $F$,
 and $T_0$ its declared return type.
@@ -5844,10 +5794,10 @@
 
 \LMHash{}
 Let $S_{static}$ be the superclass of the immediately enclosing class.
-It is a static type warning if $S_{static}$ does not have an accessible (\ref{privacy}) instance member named $m$.
+It is a compile-time error if $S_{static}$ does not have an accessible (\ref{privacy}) instance member named $m$.
 
 \LMHash{}
-If $S_{static}.m$ exists, it is a static type warning if the type $F$ of $S_{static}.m$ may not be assigned to a function type.
+If $S_{static}.m$ exists, it is a compile-time error if the type $F$ of $S_{static}.m$ may not be assigned to a function type.
 If $S_{static}.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{};
 Otherwise, let $X_1, \ldots, X_s$ be the formal type parameters of the type of $F$,
 and $T_0$ its declared return type.
@@ -5859,7 +5809,7 @@
 }
 
 % The following is not needed because it is specified in 'Binding Actuals to Formals"
-%Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of $(T_1, \ldots, t_n, \{T_{n+1}\ x_{n+1}, \ldots, T_{n+k}\ x_{n+k}\}) \to \bot$.
+%Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a compile-time error if $F$ is not a supertype of $(T_1, \ldots, t_n, \{T_{n+1}\ x_{n+1}, \ldots, T_{n+k}\ x_{n+k}\}) \to \bot$.
 
 
 \subsubsection{Sending Messages}
@@ -5911,7 +5861,7 @@
 
 The static type of $e$ is the same as the static type of \code{$e_1$.\id}.
 Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$.
-Exactly the same static warnings that would be caused by \code{$y$.\id} are also generated in the case of \code{$e_1$?.\id}.
+Exactly the same compile-time errors that would be caused by \code{$y$.\id} are also generated in the case of \code{$e_1$?.\id}.
 
 \LMHash{}
 Unconditional property extraction has one of two syntactic forms: $e.m$ (\ref{getterAccessAndMethodExtraction}) or $\SUPER.m$ (\ref{superGetterAccessAndMethodClosurization}), where $e$ is an expression and $m$ is an identifier.
@@ -5980,7 +5930,7 @@
 
 \LMHash{}
 Let $T$ be the static type of $e$.
-It is a static type warning if $T$ does not have a method or getter named $m$,
+It is a compile-time error if $T$ does not have a method or getter named $m$,
 unless $T$ is \code{Type},
 $e$ is a constant type literal,
 and the class corresponding to $e$ has a static method or getter named $m$.
@@ -6043,7 +5993,7 @@
 
 \LMHash{}
 Let $S_{static}$ be the superclass of the immediately enclosing class.
-It is a static type warning if $S_{static}$ does not have an accessible instance method or getter named $m$.
+It is a compile-time error if $S_{static}$ does not have an accessible instance method or getter named $m$.
 
 The static type of $i$ is:
 \begin{itemize}
@@ -6334,7 +6284,7 @@
 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$.
 
 \LMHash{}
-It is a static type warning if the static type of $e$ may not be assigned to the static type of $v$.
+It is a compile-time error if the static type of $e$ may not be assigned to the static type of $v$.
 The static type of the expression $v$ \code{=} $e$ is the static type of $e$.
 
 \LMHash{}
@@ -6354,7 +6304,7 @@
 \LMHash{}
 The static type of $a$ is the static type of $e_2$.
 Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$.
-Exactly the same static warnings that would be caused by \code{$y$.$v$ = $e_2$} are also generated in the case of \code{$e_1$?.$v$ = $e_2$}.
+Exactly the same compile-time errors that would be caused by \code{$y$.$v$ = $e_2$} are also generated in the case of \code{$e_1$?.$v$ = $e_2$}.
 
 \LMHash{}
 Evaluation of an assignment of the form \code{$e_1$.$v$ = $e_2$} proceeds as follows:
@@ -6402,10 +6352,10 @@
 
 \LMHash{}
 Let $T$ be the static type of $e_1$.
-It is a static type warning if $T$ does not have an accessible instance setter named $v=$ unless $T$ is \code{Type}, $e_1$ is a constant type literal and the class corresponding to $e_1$ has a static setter named $v=$.
+It is a compile-time error if $T$ does not have an accessible instance setter named $v=$ unless $T$ is \code{Type}, $e_1$ is a constant type literal and the class corresponding to $e_1$ has a static setter named $v=$.
 
 \LMHash{}
-It is a static type warning if the static type of $e_2$ may not be assigned to the static type of the formal parameter of the setter $v=$.
+It is a compile-time error if the static type of $e_2$ may not be assigned to the static type of the formal parameter of the setter $v=$.
 The static type of the expression $e_1.v$ \code{=} $e_2$ is the static type of $e_2$.
 
 \LMHash{}
@@ -6440,10 +6390,10 @@
 
 \LMHash{}
 Let $S_{static}$ be the superclass of the immediately enclosing class.
-It is a static type warning if $S_{static}$ does not have an accessible instance setter named $v=$ unless $S_{static}$.
+It is a compile-time error if $S_{static}$ does not have an accessible instance setter named $v=$ unless $S_{static}$.
 
 \LMHash{}
-It is a static type warning if the static type of $e$ may not be assigned to the static type of the formal parameter of the setter $v=$.
+It is a compile-time error if the static type of $e$ may not be assigned to the static type of the formal parameter of the setter $v=$.
 The static type of the expression $\SUPER.v$ \code{=} $e$ is the static type of $e$.
 
 \LMHash{}
@@ -6465,7 +6415,9 @@
 % Should we add: It is a dynamic error if $e_1$ evaluates to an constant list or map.
 
 \LMHash{}
-It is a static warning if an assignment of the form $v = e$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is neither a local variable declaration with name $v$ nor setter declaration with name $v=$ in the lexical scope enclosing the assignment.
+It is a compile-time error if an assignment of the form $v = e$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer,
+and there is neither a local variable (\commentary{which includes formal parameters}) with name $v$
+nor a setter declaration with name $v=$ in the lexical scope enclosing the assignment.
 
 \LMHash{}
 It is a compile-time error to invoke any of the setters of class \code{Object} on a prefix object (\ref{imports}) or on a constant type literal that is immediately followed by the token `.'.
@@ -6548,24 +6500,24 @@
 
 \LMHash{}
 The static type of a compound assignment of the form $v$ {\em ??=} $e$ is the least upper bound of the static type of $v$ and the static type of $e$.
-Exactly the same static warnings that would be caused by $v = e$ are also generated in the case of $v$ {\em ??=} $e$.
+Exactly the same compile-time errors that would be caused by $v = e$ are also generated in the case of $v$ {\em ??=} $e$.
 
 \LMHash{}
 The static type of a compound assignment of the form $C.v$ {\em ??=} $e$ is the least upper bound of the static type of $C.v$ and the static type of $e$.
-Exactly the same static warnings that would be caused by $C.v = e$ are also generated in the case of $C.v$ {\em ??=} $e$.
+Exactly the same compile-time errors that would be caused by $C.v = e$ are also generated in the case of $C.v$ {\em ??=} $e$.
 
 \LMHash{}
 The static type of a compound assignment of the form $e_1.v$ {\em ??=} $e_2$ is the least upper bound of the static type of $e_1.v$ and the static type of $e_2$.
 Let $T$ be the static type of $e_1$ and let $z$ be a fresh variable of type $T$.
-Exactly the same static warnings that would be caused by $z.v = e_2$ are also generated in the case of $e_1.v$ {\em ??=} $e_2$.
+Exactly the same compile-time errors that would be caused by $z.v = e_2$ are also generated in the case of $e_1.v$ {\em ??=} $e_2$.
 
 \LMHash{}
 The static type of a compound assignment of the form $e_1[e_2]$ {\em ??=} $e_3$ is the least upper bound of the static type of $e_1[e_2]$ and the static type of $e_3$.
-Exactly the same static warnings that would be caused by $e_1[e_2] = e_3$ are also generated in the case of $e_1[e_2]$ {\em ??=} $e_3$.
+Exactly the same compile-time errors that would be caused by $e_1[e_2] = e_3$ are also generated in the case of $e_1[e_2]$ {\em ??=} $e_3$.
 
 \LMHash{}
 The static type of a compound assignment of the form $\SUPER.v$ {\em ??=} $e$ is the least upper bound of the static type of $\SUPER.v$ and the static type of $e$.
-Exactly the same static warnings that would be caused by $\SUPER.v = e$ are also generated in the case of $\SUPER.v$ {\em ??=} $e$.
+Exactly the same compile-time errors that would be caused by $\SUPER.v = e$ are also generated in the case of $\SUPER.v$ {\em ??=} $e$.
 
 \LMHash{}
 For any other valid operator $op$, a compound assignment of the form \code{$v$ $op$= $e$} is equivalent to \code{$v$ = $v$ $op$ $e$}.
@@ -6596,7 +6548,7 @@
 
 \LMHash{}
 The static type of \code{$e_1$?.$v$ $op$= $e_2$} is the static type of \code{$e_1$.$v$ $op$ $e_2$}.
-Exactly the same static warnings that would be caused by \code{$e_1$.$v$ $op$= $e_2$} are also generated in the case of \code{$e_1$?.$v$ $op$= $e_2$}.
+Exactly the same compile-time errors that would be caused by \code{$e_1$.$v$ $op$= $e_2$} are also generated in the case of \code{$e_1$?.$v$ $op$= $e_2$}.
 
 \LMHash{}
 A compound assignment of the form $C?.v$ $op = e_2$ is equivalent to the expression
@@ -6652,7 +6604,7 @@
 then the type of $v$ is known to be $T$ in $e_2$.
 
 \LMHash{}
-It is a static type warning if the static type of $e_1$ may not be assigned to \code{bool}.
+It is a compile-time error if the static type of $e_1$ may not be assigned to \code{bool}.
 The static type of $c$ is the least upper bound (\ref{leastUpperBounds}) of the static type of $e_2$ and the static type of $e_3$.
 
 
@@ -6731,7 +6683,7 @@
 then the type of $v$ is known to be $T$ in $e_2$.
 
 \LMHash{}
-It is a static warning if the static type of $e_1$ may not be assigned to \code{bool} or if the static type of $e_2$ may not be assigned to \code{bool}.
+It is a compile-time error if the static type of $e_1$ may not be assigned to \code{bool} or if the static type of $e_2$ may not be assigned to \code{bool}.
 The static type of a logical boolean expression is \code{bool}.
 
 
@@ -7055,7 +7007,7 @@
 }
 
 \commentary{
-It is not a static warning if the type of $e$ is not a subtype of \code{Future}.
+It is not a compile-time error if the type of $e$ is not a subtype of \code{Future}.
 Tools may choose to give a hint in such cases.
 }
 
@@ -7400,8 +7352,7 @@
 \item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, then evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \code{$C$.\id}.
 \item If $d$ is the declaration of a library variable, top-level getter or top-level setter, then evaluation of $e$ is equivalent to evaluation of the top level getter invocation (\ref{topLevelGetterInvocation}) \id.
 \item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer, evaluation of $e$ causes a \code{NoSuchMethod} to be thrown.
-\item Otherwise, evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \THIS{}.\id.
-% This implies that referring to an undefined static getter by simple name is an error, whereas doing so by qualified name is only a warning. Same with assignments.  Revise?
+\item Otherwise, evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \code{\THIS.\id}.
 \end{itemize}
 
 \LMHash{}
@@ -7422,12 +7373,16 @@
 }
 
 \rationale{
- This prevents situations where one uses uncorrelated setters and getters.
+This prevents situations where one uses uncorrelated setters and getters.
 The intent is to prevent errors when a getter in a surrounding scope is used accidentally.
 }
 
 \LMHash{}
-It is a static warning if an identifier expression \id{} occurs inside a top level or static function (be it function, method, getter, or setter) or variable initializer and there is no declaration $d$ with name \id{} in the lexical scope enclosing the expression.
+It is a compile-time error if an identifier expression \id{} occurs inside a top level or static function
+(be it function, method, getter, or setter)
+or in an instance variable initializer,
+or in an initializer list expression,
+and there is no declaration $d$ with name \id{} in the lexical scope enclosing the expression.
 
 
 \subsection{Type Test}
@@ -7472,9 +7427,9 @@
 An is-expression of the form \code{$v$ \IS{} $T$} shows that $v$ has type $T$ if{}f $T$ is more specific than the type $S$ of the expression $v$ and both $T \ne \DYNAMIC{}$ and $S \ne \DYNAMIC{}$.
 
 \rationale{
-The motivation for the ``shows that v has type T" relation is to reduce spurious warnings thereby enabling a more natural coding style.
+The motivation for the ``shows that v has type T" relation is to reduce spurious errors thereby enabling a more natural coding style.
 The rules in the current specification are deliberately kept simple.
-It would be upwardly compatible to refine these rules in the future; such a refinement would accept more code without warning, but not reject any code now warning-free.
+It would be upwardly compatible to refine these rules in the future; such a refinement would accept more code without errors, but not reject any code now error-free.
 
 The rule only applies to locals and parameters, as instance or static variables could be modified via side-effecting functions or methods that are not accessible to a local analysis.
 
@@ -7482,7 +7437,7 @@
 Furthermore, this would lead to a situation where multiple types are associated with a variable at a given point, which complicates the specification.
 Hence the requirement that $T << S$ (we use $<<$ rather than subtyping because subtyping is not a partial order).
 
-We do not want to refine the type of a variable of type \DYNAMIC{}, as this could lead to more warnings rather than fewer.
+We do not want to refine the type of a variable of type \DYNAMIC{}, as this could lead to more errors rather than fewer.
 The opposite requirement, that $T \ne \DYNAMIC{}$ is a safeguard lest $S$ ever be $\bot$.
 }
 
@@ -7754,7 +7709,7 @@
 The cleanest approach would be to require a block following the test, rather than an arbitrary statement.
 However, this goes against long standing custom, undermining Dart's goal of familiarity.
 Instead, we choose to insert a block, introducing a scope, around the statement following the predicate (and similarly for \ELSE{} and loops).
-This will cause both a warning and a run-time error in the case above.
+This will cause a compile-time error in the case above.
 Of course, if there is a declaration of \code{v} in the surrounding scope, programmers might still be surprised.
 We expect tools to highlight cases of shadowing to help avoid such situations.
 }
@@ -7768,7 +7723,7 @@
 If $o$ is \TRUE{}, then the block statement $s_1$ is executed, otherwise the block statement $s_2$ is executed.
 
 \LMHash{}
-It is a static type warning if the type of the expression $b$ may not be assigned to \code{bool}.
+It is a compile-time error if the type of the expression $b$ may not be assigned to \code{bool}.
 
 \LMHash{}
 If:
@@ -7855,7 +7810,7 @@
 }
 
 \LMHash{}
-It is a static warning if the static type of $c$ may not be assigned to \code{bool}.
+It is a compile-time error if the static type of $c$ may not be assigned to \code{bool}.
 
 %A for statement of the form \code{\FOR{} ($d$ ; $c$; $e$) $s$} is equivalent to the following code:
 
@@ -7891,8 +7846,7 @@
 where $T$ is the static type of \code{$e$.iterator}.
 
 \commentary{
-It follows that it is a static warning if $D$ is empty and \id{} is a final variable,
-and a dynamic error will then occur if the body is executed.
+It follows that it is a compile-time error if $D$ is empty and \id{} is a final variable.
 }
 
 
@@ -7913,8 +7867,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 static warning if $D$ is empty and \id{} is a final variable,
-and it is then a dynamic error if the body is executed.
+It is a compile-time error if $D$ is empty and \id{} is a final variable.
 
 \LMHash{}
 The stream associated with the innermost enclosing asynchronous for loop, if any, is paused.
@@ -8014,7 +7967,7 @@
 }
 
 \LMHash{}
-It is a static type warning if the static type of $e$ may not be assigned to \code{bool}.
+It is a compile-time error if the static type of $e$ may not be assigned to \code{bool}.
 
 
 \subsection{Do}
@@ -8042,7 +7995,7 @@
 If $o$ is \TRUE{}, then the do statement is re-executed.
 
 \LMHash{}
-It is a static type warning if the static type of $e$ may not be assigned to \code{bool}.
+It is a compile-time error if the static type of $e$ may not be assigned to \code{bool}.
 
 
 \subsection{Switch}
@@ -8190,10 +8143,11 @@
 Otherwise the switch statement completes normally (\ref{completion}).
 
 \LMHash{}
-It is a static warning if the type of $e$ may not be assigned to the type of $e_k$.
+It is a compile-time error if the type of $e$ may not be assigned to the type of $e_k$.
 Let $s$ be the last statement of the statement sequence $s_k$.
 If $s$ is a non-empty block statement, let $s$ instead be the last statement of the block statement.
-It is a static warning $s$ is not a \BREAK{}, \CONTINUE{}, \RETHROW{} or \RETURN{} statement or an expression statement where the expression is a \THROW{} expression.
+It is a compile-time error if $s$ is not a \BREAK{}, \CONTINUE{}, \RETHROW{} or \RETURN{} statement
+or an expression statement where the expression is a \THROW{} expression.
 
 \rationale{
 The behavior of switch cases intentionally differs from the C tradition.
@@ -8205,8 +8159,6 @@
 Implicitly breaking the control flow at the end of a case would silently alter the meaning of ported code that relied on fall-through, potentially forcing the programmer to deal with subtle bugs.
 Our design ensures that the difference is immediately brought to the coder's attention.
 The programmer will be notified at compile time if they forget to end a case with a statement that terminates the straight-line control flow.
-We could make this warning a compile-time error, but refrain from doing so because do not wish to force the programmer to deal with this issue immediately while porting code.
-If developers ignore the warning and run their code, a run-time error will prevent the program from misbehaving in hard-to-debug ways (at least with respect to this issue).
 
 The sophistication of the analysis of fall-through is another issue.
 For now, we have opted for a very straightforward syntactic requirement.
@@ -8224,7 +8176,7 @@
 }
 
 \LMHash{}
-It is a static warning if all of the following conditions hold:
+It is a compile-time error if all of the following conditions hold:
 \begin{itemize}
 \item The switch statement does not have a default clause.
 \item The static type of $e$ is an enumerated typed with elements $id_1, \ldots, id_n$.
@@ -8232,7 +8184,7 @@
 \end{itemize}
 
 \commentary{
-In other words, a warning will be issued if a switch statement over an enum is not exhaustive.
+In other words, an error will be raised if a switch statement over an enum is not exhaustive.
 }
 
 
@@ -8395,7 +8347,7 @@
 
 \LMHash{}
 If $T_1$ is a malformed or deferred type (\ref{staticTypes}), then performing a match causes a run-time error.
-It is a static warning if $T_i$, $1 \le i \le n$ is a deferred or malformed type.
+It is a compile-time error if $T_i$, $1 \le i \le n$ is a deferred or malformed type.
 
 
 \subsubsection{\ON{}-\CATCH{} clauses}
@@ -8452,8 +8404,8 @@
 Then the return statement returns the value $r$ (\ref{completion}).
 
 \LMHash{}
-It is a static type warning if the body of $f$ is marked \ASYNC{} and the type \code{Future<$flatten(T)$>} (\ref{functionExpressions}) may not be assigned to the declared return type of $f$.
-Otherwise, it is a static type warning if $T$ may not be assigned to the declared return type of $f$.
+It is a compile-time error if the body of $f$ is marked \ASYNC{} and the type \code{Future<$flatten(T)$>} (\ref{functionExpressions}) may not be assigned to the declared return type of $f$.
+Otherwise, it is a compile-time error if $T$ may not be assigned to the declared return type of $f$.
 
 \LMHash{}
 Let $S$ be the run-time type of $o$.
@@ -8493,14 +8445,14 @@
 
 \LMHash{}
 Let $f$ be the function immediately enclosing a return statement of the form \RETURN{};.
-It is a static warning if $f$ is neither a generator nor a generative constructor and either:
+It is a compile-time error if $f$ is neither a generator nor a generative constructor and either:
 \begin{itemize}
 \item $f$ is synchronous and the return type of $f$ may not be assigned to \VOID{} (\ref{typeVoid}) or,
 \item $f$ is asynchronous and the return type of $f$ may not be assigned to \code{Future<Null>}.
 \end{itemize}
 
 \commentary{
-Hence, a static warning will not be issued if $f$ has no declared return type, since the return type would be \DYNAMIC{} and \DYNAMIC{} may be assigned to \VOID{} and to \code{Future<Null>}.
+Hence, a compile-time error will not be raised if $f$ has no declared return type, since the return type would be \DYNAMIC{} and \DYNAMIC{} may be assigned to \VOID{} and to \code{Future<Null>}.
 However, any synchronous non-generator function that declares a return type must return an expression explicitly.
 }
 \rationale{
@@ -8520,7 +8472,9 @@
 Executing a return statement with no expression, \code{\RETURN;} returns with no value (\ref{completion}).
 
 \LMHash{}
-It is a static warning if a function contains both one or more explicit return statements of the form \code{\RETURN;} and one or more return statements of the form \code{\RETURN{} $e$;}.
+% TODO(eernst): For integration of invalid_returns.md: We do allow that now, and
+% many other things, eg `void foo(bool b) { if (b) return; return print(''); }`.
+It is a compile-time error if a function contains both one or more explicit return statements of the form \code{\RETURN;} and one or more return statements of the form \code{\RETURN{} $e$;}.
 
 
 \subsection{Labels}
@@ -8677,7 +8631,7 @@
 
 \LMHash{}
 Let $T$ be the static type of $e$ and let $f$ be the immediately enclosing function.
-It is a static type warning if either:
+It is a compile-time error if either:
 \begin{itemize}
 \item
 the body of $f$ is marked \ASYNC* and the type \code{Stream<T>} may not be assigned to the declared return type of $f$.
@@ -8746,9 +8700,9 @@
 
 \LMHash{}
 Let $T$ be the static type of $e$ and let $f$ be the immediately enclosing function.
-It is a static type warning if $T$ may not be assigned to the declared return type of $f$.
-If $f$ is synchronous it is a static type warning if $T$ may not be assigned to \code{Iterable}.
-If $f$ is asynchronous it is a static type warning if $T$ may not be assigned to \code{Stream}.
+It is a compile-time error if $T$ may not be assigned to the declared return type of $f$.
+If $f$ is synchronous it is a compile-time error if $T$ may not be assigned to \code{Iterable}.
+If $f$ is asynchronous it is a compile-time error if $T$ may not be assigned to \code{Stream}.
 
 
 \subsection{Assert}
@@ -8795,7 +8749,7 @@
 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 static type warning if the type of $e$ may not be assigned to \code{bool}.
+It is a compile-time error if the type of $e$ 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.
@@ -8954,7 +8908,7 @@
 The interpretation of URIs is described in section \ref{uris} below.
 
 \LMHash{}
-It is a static warning if the specified URI of a deferred import does not refer to a library declaration.
+It is a compile-time error if the specified URI of a deferred import does not refer to a library declaration.
 
 \rationale{
 One cannot detect the problem at compile time because compilation often occurs during execution and one does not know what the URI refers to.
@@ -9000,7 +8954,7 @@
 \end{itemize}
 
 \rationale{
-The purpose of adding members of $B$ to $p$ is to ensure that any warnings issued when using $p$ are correct, and no spurious warnings are generated.
+The purpose of adding members of $B$ to $p$ is to ensure that any errors raised when using $p$ are correct, and no spurious errors are generated.
 In fact, at run time we cannot add these members until $B$ is loaded; but any such invocations will fail at run time as specified by virtue of being completely absent.
 }
 %But this is still a lie detectable by reflection. Probably revise so the type of p has these members but p does not.
@@ -9124,18 +9078,15 @@
 }
 
 \LMHash{}
-If a name $N$ is referenced by a library $L$ and $N$ is introduced into the top level scope of $L$ by more than one import, and not all the imports denote the same declaration, then:
-\begin{itemize}
-\item A static warning occurs.
-\item If $N$ is referenced as a function, getter or setter, a \code{NoSuchMethodError} is thrown.
-\item If $N$ is referenced as a type, it is treated as a malformed type.
-\end{itemize}
+If a name $N$ is referenced by a library $L$ and $N$ is introduced into the top level scope of $L$ by more than one import
+and not all the imports denote the same declaration,
+a compile-time error occurs.
 
 \LMHash{}
 We say that the namespace $NS$ {\em has been imported into} $L$.
 
 \commentary{
-It is neither an error nor a warning if $N$ is introduced by two or more imports but never referred to.
+It is not an error if $N$ is introduced by two or more imports but never referred to.
 }
 
 \rationale{
@@ -9152,7 +9103,7 @@
 }
 
 \LMHash{}
-It is a static warning to import two different libraries with the same name unless their name is the empty string.
+It is a compile-time error to import two different libraries with the same name unless their name is the empty string.
 
 \commentary{
 A widely disseminated library should be given a name that will not conflict with other such libraries.
@@ -9160,7 +9111,7 @@
 }
 
 \commentary{
-Note that no errors or warnings are given if one hides or shows a name that is not in a namespace.
+Note that no errors are raised if one hides or shows a name that is not in a namespace.
 }
 \rationale{
 This prevents situations where removing a name from a library would cause breakage of a client library.
@@ -9181,7 +9132,7 @@
 It would be nice if there was nothing special about \code{dart:core}.
 However, its use is pervasive, which leads to the decision to import it automatically.
 However, some library $L$ may wish to define entities with names used by \code{dart:core} (which it can easily do, as the names declared by a library take precedence).
-Other libraries may wish to use $L$ and may want to use members of $L$ that conflict with the core library without having to use a prefix and without encountering warnings.
+Other libraries may wish to use $L$ and may want to use members of $L$ that conflict with the core library without having to use a prefix and without encountering errors.
 The above rule makes this possible, essentially canceling \code{dart:core}'s special treatment by means of yet another special rule.
 }
 
@@ -9258,7 +9209,7 @@
 
 \LMHash{}
 It is a compile-time error if a name $N$ is re-exported by a library $L$ and $N$ is introduced into the export namespace of $L$ by more than one export, unless all exports refer to same declaration for the name $N$.
-It is a static warning to export two different libraries with the same name unless their name is the empty string.
+It is a compile-time error to export two different libraries with the same name unless their name is the empty string.
 
 
 \subsection{Parts}
@@ -9290,7 +9241,7 @@
 Compiling a part directive of the form \code{\PART{} $s$;} causes the Dart system to attempt to compile the contents of the URI that is the value of $s$.
 The top-level declarations at that URI are then compiled by the Dart compiler in the scope of the current library.
 It is a compile-time error if the contents of the URI are not a valid part declaration.
-It is a static warning if the referenced part declaration $p$ names a library other than the current library as the library to which $p$ belongs.
+It is a compile-time error if the referenced part declaration $p$ names a library other than the current library as the library to which $p$ belongs.
 
 \LMHash{}
 Let $L$ be a library.
@@ -9475,11 +9426,12 @@
 \end{grammar}
 
 \LMHash{}
-A Dart implementation must provide a static checker that detects and reports exactly those situations this specification identifies as static warnings and only those situations.
+A Dart implementation must provide a static checker that detects and reports exactly those situations this specification identifies as compile-time errors,
+and only those situations.
 However:
 \begin{itemize}
 \item Running the static checker on a program $P$ is not required for compiling and running $P$.
-\item Running the static checker on a program $P$ must not prevent successful compilation of $P$ nor may it prevent the execution of $P$, regardless of whether any static warnings occur.
+\item Running the static checker on a program $P$ must not prevent successful compilation of $P$ nor may it prevent the execution of $P$, regardless of whether any compile-time errors occur.
 \end{itemize}
 
 \commentary{
@@ -9528,17 +9480,17 @@
 \end{itemize}
 
 \LMHash{}
-Any use of a malformed type gives rise to a static warning.
-A malformed type is then interpreted as \DYNAMIC{} by the static type checker and the run-time system unless explicitly specified otherwise.
+Any use of a malformed type gives rise to a compile-time error.
+A malformed type is then interpreted as \DYNAMIC{} by the static type checker unless explicitly specified otherwise.
 
 \rationale{
-This ensures that the developer is spared a series of cascading warnings as the malformed type interacts with other types.
+This ensures that the developer is spared a series of cascading errors as the malformed type interacts with other types.
 }
 
 \LMHash{}
 A type $T$ is {\em deferred} if{}f it is of the form $p.T$ where $p$ is a deferred prefix.
-It is a static warning to use a deferred type in a type annotation, type test, type cast or as a type parameter.
-However, all other static warnings must be issued under the assumption that all deferred libraries have successfully been loaded.
+It is a compile-time error to use a deferred type in a type annotation, type test, type cast or as a type parameter.
+However, all other compile-time errors must be issued under the assumption that all deferred libraries have successfully been loaded.
 
 % Now, when passed to a generic, p.T also has to be treated as dynamic - otherwise we have to fail immediately. Where do we say that? And how does this fit with idea that as a type object it fails? Should we say that the accessor on p returns dynamic instead of failing? Do we distinguish its use in a constructor vs its use in an annotation? It's not that we evaluate type objects in constructor args - these cannot represent parameterized types.
 
@@ -9600,10 +9552,8 @@
 \end{dartCode}
 
 \commentary{
-The type of the formal parameter of $f$ is $foo$, which is undeclared in the lexical scope.
-This will lead to a static type warning.
-At run time the program will print \code{yoyoma}, because $foo$ is treated as \DYNAMIC{}.
-%fail when executing the type test on the first line of $main()$ because it leads to a subtype comparison involving a malformed type ($foo$).
+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
 }
@@ -9617,7 +9567,7 @@
 \end{dartCode}
 
 \commentary{
-Since $i$ is not a type, a static warning will be issue at the declaration of $j$.
+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.
 }
@@ -9630,7 +9580,7 @@
 \CLASS{} I<T \EXTENDS{} num> \{\}
 \CLASS{} J \{\}
 
-\CLASS{} A<T> \IMPLEMENTS{} J, I<T> // type warning: T is not a subtype of num
+\CLASS{} A<T> \IMPLEMENTS{} J, I<T> // compile-time error: T is not a subtype of num
 \{ ...
 \}
 \end{dartCode}
@@ -9950,7 +9900,6 @@
 \LMHash{}
 A function is always an instance of some class that implements the class \FUNCTION{}.
 All function types are subtypes of \FUNCTION{}.
-It is a static warning if a concrete class implements \FUNCTION{} and does not have a concrete method named \CALL{} unless that class has a concrete \code{noSuchMethod()} distinct from the one declared in class \code{Object}.
 
 %\commentary{Need to specify how a function values dynamic type is derived from its static signature.}
 
@@ -10019,20 +9968,25 @@
 
 \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.
 
 \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{}$>}.
 }
 
 \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{}.
 
 \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.
 
@@ -10055,7 +10009,7 @@
 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 warnings and so the checker is designed to be extremely charitable.
+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.
 }
 
@@ -10071,6 +10025,8 @@
 \subsection{Type FutureOr}
 \LMLabel{typeFutureOr}
 
+%% TODO(eernst): We should make this a separate section, or change the title of this section.
+
 \LMHash{}
 The built-in type declaration \code{FutureOr},
 which is declared in the library \code{dart:async},
@@ -10089,9 +10045,9 @@
 \commentary{The last point guarantees that generic type \code{FutureOr} is
 {\em covariant} in its type parameter, just like class types.
 That is, if $S$ <: $T$ then \code{FutureOr<$S$>} <: \code{FutureOr<$T$>}.}
-If the type arguments passed to \code{FutureOr} would issue static warnings
+If the type arguments passed to \code{FutureOr} would incur compile-time errors
 if applied to a normal generic class with one type parameter,
-the same warnings are issued for \code{FutureOr}.
+the same compile-time errors are issued for \code{FutureOr}.
 The name \code{FutureOr} as an expression
 denotes a \code{Type} object representing the type \code{FutureOr<dynamic>}.
 
@@ -10124,6 +10080,8 @@
 \subsection{Type Void}
 \LMLabel{typeVoid}
 
+%% TODO(eernst): Adjust everything in this section when specifying generalized-void.
+
 \LMHash{}
 The special type \VOID{} may only be used as the return type of a function: it is a compile-time error to use \VOID{} in any other context.
 
@@ -10144,12 +10102,12 @@
 
 The analogous rules also hold for the $<<$ relation for similar reasons.
 
-Hence, the static checker will issue warnings if one attempts to access a member of the result of a void method invocation (even for members of the null object (\ref{null}), such as \code{==}).
-Likewise, passing the result of a void method as a parameter or assigning it to a variable will cause a warning unless the variable/formal parameter has type dynamic.
+Hence, the static checker will issue errors if one attempts to access a member of the result of a void method invocation (even for members of the null object (\ref{null}), such as \code{==}).
+Likewise, passing the result of a void method as a parameter or assigning it to a variable will raise an error unless the variable/formal parameter has type dynamic.
 
 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 type warning.
+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{}).
 }
 
@@ -10167,21 +10125,8 @@
 \subsection{Parameterized Types}
 \LMLabel{parameterizedTypes}
 
-% TODO(eernst): Deletions needed below when switching warning-->error; new
-% concept may be needed when adding support for generic tear-offs.
-%
-% Details:
-%
-% When switching to Dart 2 the static warnings about having an incorrect
-% number of type arguments or violating the bounds will become compile-time
-% errors, and we will no longer need a specification of the dynamic
-% semantics: Parameterized types will always apply a compile-time constant
-% denotation of a class (a dynamic value, i.e., an instance of \code{Type},
-% cannot be applied to actual type arguments), so no error free program can
-% need this semantics.
-%
-% We may want to add a new concept for the application of a generic
-% function to actual type arguments (maybe it's an extra kind of
+% TODO(eernst): We may want to add a new concept for the application of a
+% generic function to actual type arguments (maybe it's an extra kind of
 % 'parameterized type', but it differs from the generic class case because
 % we _can_ have dynamic invocations of a generic function). But this does
 % not arise as a stand-alone entity before we introduce generic tear-offs
@@ -10199,11 +10144,15 @@
 
 \LMHash{}
 Let $T$ be a parameterized type \code{$G$<$S_1, \ldots,\ S_n$>}.
-Assume that $T$ is not malformed.
 
-\commentary{
-In particular, $G$ denotes a generic type with $n$ formal type parameters.
-}
+\LMHash{}
+It is a compile-time error if $G$ is not a generic type,
+or $G$ is a generic type, but the number of formal type parameters in the declaration of $G$ is not $n$.
+Otherwise, let
+$X_1, \ldots, X_n$
+be the formal type parameters of $G$, and let
+$B_1, \ldots, B_n$
+be the corresponding upper bounds, using \DYNAMIC{} when no bound is declared.
 
 \LMHash{}
 $T$ is {\em malbounded} if{}f either
@@ -10211,26 +10160,29 @@
 or $T$ is not well-bounded (\ref{superBoundedTypes}).
 
 \LMHash{}
-Any use of a malbounded type gives rise to a static warning.
+It is a compile-time error if $T$ is malbounded.
+
+\LMHash{}
+$T$ is evaluated as follows.
+Let $t_i$ be the result of evaluating $S_i$, for $i \in 1 .. n$.
+$T$ then evaluates to the generic instantiation where $G$ is applied to $t_1, \ldots, t_n$.
 
 \LMHash{}
 Let $T$ be a parameterized type of the form
 \code{$G$<$A_1, \ldots,\ A_n$>}
 and assume that $T$ is not malformed and not malbounded.
-If $S$ is the static type of a member $m$ declared by $G$,
-then the static type of the member $m$ of an expression of type $T$ is
+If $S$ is the static type of a member $m$ of $G$,
+then the static type of the member $m$ of an expression of type
+\code{$G$<$A_1, \ldots,\ A_n$>}
+is
 $[A_1/X_1, \ldots, A_n/X_n]S$,
 where $X_1, \ldots, X_n$ are the formal type parameters of $G$.
 
-\LMHash{}
-Let $T$ be a parameterized type of the form
-\code{$G$<$A_1, \ldots,\ A_n$>}
-and assume that $T$ is not malformed and not malbounded.
-$T$ is then evaluated as follows:
-
-\LMHash{}
-For $j \in 1 .. n$, evaluate $A_j$ to a type $t_j$.
-$T$ then evaluates to the generic instantiation where $G$ is applied to $t_1, \ldots, t_n$.
+%% TODO(eernst): This is the location where we can specify that each of the type arguments
+%% of the receiver type \code{$G$<$A_1, \ldots,\ A_n$>} must be replaced by the bottom type
+%% (`Null`, for now) in locations of the member type where it occurs contravariantly. For
+%% instance, `c.f` should have static type `void Function(Null)` when `c` has static type
+%% `C<T>` for any `T`, and we have `class C<X> { void Function(X) f; }`.
 
 
 \subsubsection{Actual Type of Declaration}
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index e80dadc..b4fd926 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -782,6 +782,7 @@
         refactoring is ExtractMethodRefactoring ||
         refactoring is ExtractWidgetRefactoring ||
         refactoring is InlineMethodRefactoring ||
+        refactoring is MoveFileRefactoring ||
         refactoring is RenameRefactoring;
   }
 
@@ -1160,6 +1161,12 @@
       inlineRefactoring.inlineAll = inlineOptions.inlineAll;
       return new RefactoringStatus();
     }
+    if (refactoring is MoveFileRefactoring) {
+      MoveFileRefactoring moveRefactoring = this.refactoring;
+      MoveFileOptions moveOptions = params.options;
+      moveRefactoring.newFile = moveOptions.newFile;
+      return new RefactoringStatus();
+    }
     if (refactoring is RenameRefactoring) {
       RenameRefactoring renameRefactoring = refactoring;
       RenameOptions renameOptions = params.options;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
new file mode 100644
index 0000000..58adda3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -0,0 +1,169 @@
+// 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 'package:analysis_server/src/protocol_server.dart' hide Element;
+import 'package:analysis_server/src/services/correction/status.dart';
+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/element/element.dart';
+import 'package:analyzer/file_system/file_system.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;
+
+/**
+ * [MoveFileRefactoring] implementation.
+ */
+class MoveFileRefactoringImpl extends RefactoringImpl
+    implements MoveFileRefactoring {
+  final ResourceProvider resourceProvider;
+  final pathos.Context pathContext;
+  final RefactoringWorkspace workspace;
+  final Source source;
+
+  String oldFile;
+  String newFile;
+
+  MoveFileRefactoringImpl(ResourceProvider resourceProvider, this.workspace,
+      this.source, this.oldFile)
+      : resourceProvider = resourceProvider,
+        pathContext = resourceProvider.pathContext {
+    if (source != null) {
+      oldFile = source.fullName;
+    }
+  }
+
+  @override
+  String get refactoringName => 'Move File';
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<SourceChange> createChange() async {
+    var changeBuilder =
+        new DartChangeBuilder(workspace.drivers.first.currentSession);
+
+    final drivers =
+        workspace.drivers.where((d) => d.contextRoot.containsFile(newFile));
+    if (drivers.length != 1) {
+      // TODO(dantup): What to do in this case? Should we throw?
+      return changeBuilder.sourceChange;
+    }
+
+    final driver = drivers.first; // The above guarantees there's exactly one.
+    final result = await driver.getResult(oldFile);
+    final element = result?.unit?.element;
+    if (element == null) {
+      return changeBuilder.sourceChange;
+    }
+    final library = element.library;
+
+    // If this element is a library, update outgoing references inside the file.
+    if (library != null && element == library.definingCompilationUnit) {
+      await changeBuilder.addFileEdit(library.source.fullName, (builder) {
+        final oldDir = pathContext.dirname(oldFile);
+        final newDir = pathContext.dirname(newFile);
+        _updateUriReferences(builder, library.imports, oldDir, newDir);
+        _updateUriReferences(builder, library.exports, oldDir, newDir);
+        _updateUriReferences(builder, library.parts, oldDir, newDir);
+      });
+    }
+
+    // Update incoming references to this file
+    List<SearchMatch> matches =
+        await workspace.searchEngine.searchReferences(result.unit.element);
+    List<SourceReference> references = getSourceReferences(matches);
+    for (SourceReference reference in references) {
+      await changeBuilder.addFileEdit(reference.file, (builder) {
+        String newUri = _computeNewUri(reference);
+        builder.addSimpleReplacement(reference.range, "'$newUri'");
+      });
+    }
+
+    return changeBuilder.sourceChange;
+  }
+
+  @override
+  bool requiresPreview() => false;
+
+  String _getRelativeUri(String path, String from) {
+    String uri = pathContext.relative(path, from: from);
+    List<String> parts = pathContext.split(uri);
+    return pathos.posix.joinAll(parts);
+  }
+
+  /**
+   * Checks if the given [path] represents a relative URI.
+   *
+   * The following URI's are not relative:
+   *    `/absolute/path/file.dart`
+   *    `dart:math`
+   */
+  bool _isRelativeUri(String path) {
+    // absolute URI
+    if (Uri.parse(path).isAbsolute) {
+      return false;
+    }
+    // absolute path
+    if (pathContext.isAbsolute(path)) {
+      return false;
+    }
+    // OK
+    return true;
+  }
+
+  void _updateUriReference(DartFileEditBuilder builder,
+      UriReferencedElement element, String oldDir, String newDir) {
+    if (!element.isSynthetic) {
+      String elementUri = element.uri;
+      if (_isRelativeUri(elementUri)) {
+        String elementPath = pathContext.join(oldDir, elementUri);
+        String newUri = _getRelativeUri(elementPath, newDir);
+        int uriOffset = element.uriOffset;
+        int uriLength = element.uriEnd - uriOffset;
+        builder.addSimpleReplacement(
+            new SourceRange(uriOffset, uriLength), "'$newUri'");
+      }
+    }
+  }
+
+  void _updateUriReferences(DartFileEditBuilder builder,
+      List<UriReferencedElement> elements, String oldDir, String newDir) {
+    for (UriReferencedElement element in elements) {
+      _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 a93e45b..6b5c4904 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/services/refactoring/extract_widget.dart';
 import 'package:analysis_server/src/services/refactoring/inline_local.dart';
 import 'package:analysis_server/src/services/refactoring/inline_method.dart';
+import 'package:analysis_server/src/services/refactoring/move_file.dart';
 import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
 import 'package:analysis_server/src/services/refactoring/rename_constructor.dart';
 import 'package:analysis_server/src/services/refactoring/rename_import.dart';
@@ -24,8 +25,10 @@
 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';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/ast_provider.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show RefactoringMethodParameter, SourceChange;
 
@@ -337,6 +340,25 @@
 }
 
 /**
+ * [Refactoring] to move/rename a file.
+ */
+abstract class MoveFileRefactoring implements Refactoring {
+  /**
+   * Returns a new [MoveFileRefactoring] instance.
+   */
+  factory MoveFileRefactoring(ResourceProvider resourceProvider,
+      RefactoringWorkspace workspace, Source source, String oldFile) {
+    return new MoveFileRefactoringImpl(
+        resourceProvider, workspace, source, oldFile);
+  }
+
+  /**
+   * The new file path to which the given file is being moved.
+   */
+  void set newFile(String newName);
+}
+
+/**
  * Abstract interface for all refactorings.
  */
 abstract class Refactoring {
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index f4b1cc7..a270d2c 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -140,7 +140,7 @@
         new ContextRoot(resourceProvider.convertPath('/project'), [],
             pathContext: resourceProvider.pathContext),
         sourceFactory,
-        new AnalysisOptionsImpl()..strongMode = true);
+        new AnalysisOptionsImpl());
     scheduler.start();
     AnalysisEngine.instance.logger = PrintLogger.instance;
   }
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index 5cca2f0..f764bfc 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
+
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:path/path.dart' as path;
@@ -19,7 +21,7 @@
 
 @reflectiveTest
 class SetAnalysisRootsTest extends AbstractAnalysisServerIntegrationTest {
-  test_package_root() {
+  test_package_root() async {
     String projPath = sourcePath('project');
     String mainPath = path.join(projPath, 'main.dart');
     String packagesPath = sourcePath('packages');
@@ -41,41 +43,47 @@
     writeFile(mainPath, mainText);
     String normalizedFooBarPath = writeFile(fooBarPath, fooBarText);
     sendServerSetSubscriptions([ServerService.STATUS]);
+    Future<AnalysisNavigationParams> navigationParamsFuture =
+        onAnalysisNavigation.first;
     sendAnalysisSetSubscriptions({
       AnalysisService.NAVIGATION: [mainPath]
     });
     List<NavigationRegion> navigationRegions;
     List<NavigationTarget> navigationTargets;
     List<String> navigationTargetFiles;
-    onAnalysisNavigation.listen((AnalysisNavigationParams params) {
-      expect(params.file, equals(mainPath));
-      navigationRegions = params.regions;
-      navigationTargets = params.targets;
-      navigationTargetFiles = params.files;
-    });
+
     sendAnalysisSetAnalysisRoots([projPath], [],
         packageRoots: {projPath: packagesPath});
     sendAnalysisSetPriorityFiles([mainPath]);
-    return analysisFinished.then((_) {
-      // Verify that fooBarPath was properly resolved by checking that f()
-      // refers to it.
-      bool found = false;
-      for (NavigationRegion region in navigationRegions) {
-        String navigationSource =
-            mainText.substring(region.offset, region.offset + region.length);
-        if (navigationSource == 'f') {
-          found = true;
-          expect(region.targets, hasLength(1));
-          int navigationTargetIndex = region.targets[0];
-          NavigationTarget navigationTarget =
-              navigationTargets[navigationTargetIndex];
-          String navigationFile =
-              navigationTargetFiles[navigationTarget.fileIndex];
-          expect(navigationFile, equals(normalizedFooBarPath));
-        }
+
+    AnalysisNavigationParams params = await navigationParamsFuture;
+
+    expect(params.file, equals(mainPath));
+    navigationRegions = params.regions;
+    navigationTargets = params.targets;
+    navigationTargetFiles = params.files;
+
+    await analysisFinished;
+
+    // Verify that fooBarPath was properly resolved by checking that f()
+    // refers to it.
+    bool found = false;
+    for (NavigationRegion region in navigationRegions) {
+      String navigationSource =
+          mainText.substring(region.offset, region.offset + region.length);
+      if (navigationSource == 'f') {
+        found = true;
+        expect(region.targets, hasLength(1));
+        int navigationTargetIndex = region.targets[0];
+        NavigationTarget navigationTarget =
+            navigationTargets[navigationTargetIndex];
+        String navigationFile =
+            navigationTargetFiles[navigationTarget.fileIndex];
+        expect(navigationFile, equals(normalizedFooBarPath));
       }
-      expect(found, isTrue);
-    });
+    }
+
+    expect(found, isTrue);
   }
 }
 
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index e251f77..f68d12e 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -64,8 +64,4 @@
 class GetFixesTest_UseCFE extends GetFixesTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_has_fixes() => super.test_has_fixes();
 }
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
new file mode 100644
index 0000000..2a84148
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -0,0 +1,246 @@
+// 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 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'abstract_refactoring.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MoveFileTest);
+  });
+}
+
+@reflectiveTest
+class MoveFileTest extends RefactoringTest {
+  MoveFileRefactoring refactoring;
+
+  test_file_containing_imports_exports_parts() async {
+    String pathA = '/project/000/1111/a.dart';
+    String pathB = '/project/000/1111/b.dart';
+    String pathC = '/project/000/1111/22/c.dart';
+    testFile = '/project/000/1111/test.dart';
+    addSource('/absolute/uri.dart', '');
+    addSource(pathA, 'part of lib;');
+    addSource(pathB, "import 'test.dart';");
+    addSource(pathC, '');
+    addTestSource('''
+library lib;
+import 'dart:math';
+import '22/c.dart';
+export '333/d.dart';
+part 'a.dart';
+part '/absolute/uri.dart';
+''');
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    await _assertSuccessfulRefactoring();
+    assertNoFileChange(pathA);
+    assertFileChangeResult(pathB, "import '22/new_name.dart';");
+    assertNoFileChange(pathC);
+    assertFileChangeResult(testFile, '''
+library lib;
+import 'dart:math';
+import 'c.dart';
+export '../333/d.dart';
+part '../a.dart';
+part '/absolute/uri.dart';
+''');
+  }
+
+  @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, '''
+import 'sub/folder/test.dart';
+''');
+    addTestSource('');
+    // perform refactoring
+    _createRefactoring('/project/000/new/folder/name/new_name.dart');
+    await _assertSuccessfulRefactoring();
+    assertFileChangeResult(pathA, '''
+import '../new/folder/name/new_name.dart';
+''');
+    assertNoFileChange(testFile);
+  }
+
+  @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, '''
+import 'test.dart';
+''');
+    addTestSource('');
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    await _assertSuccessfulRefactoring();
+    assertFileChangeResult(pathA, '''
+import '22/new_name.dart';
+''');
+    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_up() async {
+    fail('Not yet implemented/tested');
+    String pathA = '/project/000/1111/a.dart';
+    testFile = '/project/000/1111/22/test.dart';
+    addSource(pathA, '''
+import '22/test.dart';
+''');
+    addTestSource('');
+    // perform refactoring
+    _createRefactoring('/project/000/1111/new_name.dart');
+    await _assertSuccessfulRefactoring();
+    assertFileChangeResult(pathA, '''
+import 'new_name.dart';
+''');
+    assertNoFileChange(testFile);
+  }
+
+  test_file_referenced_by_part() async {
+    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 lib;
+''');
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    await _assertSuccessfulRefactoring();
+    assertFileChangeResult(pathA, '''
+library lib;
+part '22/new_name.dart';
+''');
+    assertNoFileChange(testFile);
+  }
+
+  @failingTest
+  test_file_referenced_by_multiple_libraries() async {
+    fail('Not yet implemented/tested');
+    String pathA = '/project/000/1111/a.dart';
+    String pathB = '/project/000/b.dart';
+    testFile = '/project/000/1111/22/test.dart';
+    addSource(pathA, '''
+library lib;
+part '22/test.dart';
+''');
+    addSource(pathB, '''
+library lib;
+part '1111/22/test.dart';
+''');
+    addTestSource('''
+part of lib;
+''');
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    await _assertSuccessfulRefactoring();
+    assertFileChangeResult(pathA, '''
+library lib;
+part '22/new_name.dart';
+''');
+    assertFileChangeResult(pathB, '''
+library lib;
+part '1111/22/new_name.dart';
+''');
+    assertNoFileChange(testFile);
+  }
+
+  @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');
+  }
+
+  @failingTest
+  test_projectFolder() async {
+    fail('Not yet implemented/tested');
+  }
+
+  @failingTest
+  test_folder_inside_project() async {
+    fail('Not yet implemented/tested');
+  }
+
+  @failingTest
+  test_folder_outside_workspace_returns_failure() async {
+    fail('Not yet implemented/tested');
+  }
+
+  @failingTest
+  test_project_folder_ancestor() async {
+    fail('Not yet implemented/tested');
+  }
+
+  @failingTest
+  test_nonexistent_file_returns_suitable_failure() async {
+    fail('Not yet implemented/tested');
+  }
+
+  @failingTest
+  test_dart_uris_are_unmodified() async {
+    // TODO(dantup): See _computeNewUri implementation which currently only
+    // handles relative + package: urls (package url handling is also incomplete)
+    fail('Not yet implemented/tested');
+  }
+
+  /**
+   * Checks that all conditions are OK.
+   */
+  Future _assertSuccessfulRefactoring() async {
+    await assertRefactoringConditionsOK();
+    refactoringChange = await refactoring.createChange();
+  }
+
+  void _createRefactoring(String newName) {
+    var workspace = new RefactoringWorkspace([driver], searchEngine);
+    refactoring =
+        new MoveFileRefactoring(resourceProvider, workspace, testSource, null);
+    refactoring.newFile = newName;
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/test_all.dart b/pkg/analysis_server/test/services/refactoring/test_all.dart
index 9a75af9..5dc96b6 100644
--- a/pkg/analysis_server/test/services/refactoring/test_all.dart
+++ b/pkg/analysis_server/test/services/refactoring/test_all.dart
@@ -11,6 +11,7 @@
 import 'extract_widget_test.dart' as extract_widget_test;
 import 'inline_local_test.dart' as inline_local_test;
 import 'inline_method_test.dart' as inline_method_test;
+import 'move_file_test.dart' as move_file_test;
 import 'naming_conventions_test.dart' as naming_conventions_test;
 import 'rename_class_member_test.dart' as rename_class_member_test;
 import 'rename_constructor_test.dart' as rename_constructor_test;
@@ -30,6 +31,7 @@
     extract_widget_test.main();
     inline_local_test.main();
     inline_method_test.main();
+    move_file_test.main();
     naming_conventions_test.main();
     rename_class_member_test.main();
     rename_constructor_test.main();
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 9ba434f..0933ae5 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -468,6 +468,6 @@
         contentOverlay,
         null,
         new SourceFactory(resolvers, null, resourceProvider),
-        new AnalysisOptionsImpl()..strongMode = true);
+        new AnalysisOptionsImpl());
   }
 }
diff --git a/pkg/analysis_server_client/test/analysis_server_client_test.dart b/pkg/analysis_server_client/test/analysis_server_client_test.dart
index baaf679..c07ea61 100644
--- a/pkg/analysis_server_client/test/analysis_server_client_test.dart
+++ b/pkg/analysis_server_client/test/analysis_server_client_test.dart
@@ -25,7 +25,7 @@
     serverWrapper.listenToOutput();
 
     final response = await future;
-    expect(response, new isInstanceOf<Map>());
+    expect(response, const TypeMatcher<Map>());
     final responseAsMap = response as Map;
     expect(responseAsMap['foo'], 'bar');
   });
@@ -34,7 +34,7 @@
     process.stdout = _badMessage();
     final future = serverWrapper.send('blahMethod', null);
     future.catchError((e) {
-      expect(e, new isInstanceOf<ServerErrorMessage>());
+      expect(e, const TypeMatcher<ServerErrorMessage>());
       final e2 = e as ServerErrorMessage;
       expect(e2.code, 'someErrorCode');
       expect(e2.message, 'something went wrong');
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 8739ccb..f7d5243 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,10 @@
+## unreleased
+* Deprecate the `AnalysisOptions.strongMode` flag. This is now hard-coded to
+  always return true.
+
+## 0.32.3
+* Pull fix in kernel package where non-executable util.dart was moved out of bin/.
+
 ## 0.32.2
 
 * Improved const evaluation analysis (new errors for `const A(B())` if `B` is non-const).
diff --git a/pkg/analyzer/benchmark/errors_in_all_libraries.dart b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
index 57b512b..e2540fb 100644
--- a/pkg/analyzer/benchmark/errors_in_all_libraries.dart
+++ b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
@@ -34,7 +34,6 @@
     AnalysisEngine.instance.clearCaches();
 
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     options.strongModeHints = true;
 
     PhysicalResourceProvider resourceProvider =
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 7a74867..68083db 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -117,6 +117,7 @@
   CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE,
   CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT,
   CompileTimeErrorCode.DUPLICATE_PART,
+  CompileTimeErrorCode.ENUM_CONSTANT_WITH_ENUM_NAME,
   CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
   CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
   CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS,
@@ -513,6 +514,7 @@
   ScannerErrorCode.MISSING_IDENTIFIER,
   ScannerErrorCode.MISSING_QUOTE,
   ScannerErrorCode.UNABLE_GET_CONTENT,
+  ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING,
   ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
   ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
   StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index a0a3140..535e3a6 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -32,7 +32,6 @@
 const String sdkPathOption = 'dart-sdk';
 
 const String sdkSummaryPathOption = 'dart-sdk-summary';
-const String strongModeFlag = 'strong';
 
 /**
  * Update [options] with the value of each analysis option command line flag.
@@ -64,8 +63,6 @@
     options.implicitDynamic = !args[noImplicitDynamicFlag];
     verbose('$noImplicitDynamicFlag = ${options.implicitDynamic}');
   }
-  options.strongMode = args[strongModeFlag];
-  verbose('$strongModeFlag = ${options.strongMode}');
   try {
     if (args.wasParsed(lintsFlag)) {
       options.lint = args[lintsFlag];
@@ -81,7 +78,7 @@
  * create a context builder.
  */
 ContextBuilderOptions createContextBuilderOptions(ArgResults args,
-    {bool strongMode, bool trackCacheDependencies}) {
+    {bool trackCacheDependencies}) {
   ContextBuilderOptions builderOptions = new ContextBuilderOptions();
   builderOptions.argResults = args;
   //
@@ -97,9 +94,6 @@
   //
   AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
   applyAnalysisOptionFlags(defaultOptions, args);
-  if (strongMode != null) {
-    defaultOptions.strongMode = strongMode;
-  }
   if (trackCacheDependencies != null) {
     defaultOptions.trackCacheDependencies = trackCacheDependencies;
   }
@@ -168,10 +162,10 @@
       help: 'The path to a package root directory (deprecated). '
           'This option cannot be used with --packages.',
       hide: ddc && hide);
-  parser.addFlag(strongModeFlag,
-      help: 'Enable strong static checks (https://goo.gl/DqcBsw).',
+  parser.addFlag('strong',
+      help: 'Enable strong mode (deprecated); this option is now ignored.',
       defaultsTo: true,
-      hide: ddc,
+      hide: true,
       negatable: true);
   parser.addFlag(declarationCastsFlag,
       negatable: true,
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 4ccf4cd..42a1380 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -316,7 +316,6 @@
     if (this._options.strongMode != options.strongMode) {
       _typeSystem = null;
     }
-    this._options.strongMode = options.strongMode;
     this._options.useFastaParser = options.useFastaParser;
     this._options.previewDart2 = options.previewDart2;
     this._options.trackCacheDependencies = options.trackCacheDependencies;
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 5d1c2b2..cdf82ad 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -222,10 +222,14 @@
 
         // Compile the entry point into the new component.
         _component = await _logger.runAsync('Compile', () async {
-          // TODO(brianwilkerson) Determine whether this await is necessary.
-          await null;
           await kernelTarget.buildOutlines(nameRoot: _component.root);
-          return await kernelTarget.buildComponent() ?? _component;
+          Component newComponent = await kernelTarget.buildComponent();
+          if (newComponent != null) {
+            AnalyzerMetadataRepository.merge(newComponent, _component);
+            return newComponent;
+          } else {
+            return _component;
+          }
         });
 
         // TODO(scheglov) Only for new libraries?
@@ -477,23 +481,25 @@
 
   @override
   Future<bool> exists() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return file.exists;
   }
 
   @override
   Future<List<int>> readAsBytes() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+    _throwIfDoesNotExist();
     // TODO(scheglov) Optimize.
     return utf8.encode(file.content);
   }
 
   @override
   Future<String> readAsString() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+    _throwIfDoesNotExist();
     return file.content;
   }
+
+  void _throwIfDoesNotExist() {
+    if (!file.exists) {
+      throw new front_end.FileSystemException(uri, 'File not found');
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
index 6962a80..7312359 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
@@ -127,4 +127,17 @@
       sink.writeByte(0);
     }
   }
+
+  /// Merge metadata from the [source] into the [destination].
+  static void merge(kernel.Component destination, kernel.Component source) {
+    kernel.MetadataRepository destinationRepo = destination.metadata[TAG];
+    kernel.MetadataRepository sourceRepo = source.metadata[TAG];
+    if (sourceRepo != null) {
+      if (destinationRepo != null) {
+        destinationRepo.mapping.addAll(sourceRepo.mapping);
+      } else {
+        destination.metadata[TAG] = sourceRepo;
+      }
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index c486315..d463793 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -750,6 +750,14 @@
 //          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
 //    }
 
+    for (var directive in unit.directives) {
+      if (directive.metadata.isNotEmpty) {
+        var resolution = resolutions.next();
+        var applier =
+            _createResolutionApplier(null, resolution, unit.localDeclarations);
+        applier.applyToAnnotations(directive);
+      }
+    }
     for (var declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
         if (declaration.metadata.isNotEmpty) {
@@ -1180,6 +1188,8 @@
       assert(element != null);
     } else if (referencedNode is kernel.DynamicType) {
       element = DynamicElementImpl.instance;
+    } else if (referencedNode is kernel.InvalidType) {
+      element = DynamicElementImpl.instance;
     } else {
       throw new UnimplementedError(
           'TODO(paulberry): ${referencedNode.runtimeType}');
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d38993a..e4a1f8f 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1213,8 +1213,9 @@
         visitedClasses.add(this);
       }
       try {
-        ClassElementImpl superElement = AbstractClassElementImpl
-            .getImpl(supertype.element) as ClassElementImpl;
+        ClassElementImpl superElement =
+            AbstractClassElementImpl.getImpl(supertype.element)
+                as ClassElementImpl;
         constructorsToForward =
             superElement._computeMixinAppConstructors(visitedClasses);
       } finally {
@@ -2827,6 +2828,7 @@
 
   @override
   LibraryElement get library => _library;
+
   set library(LibraryElement library) {
     assert(library.name == 'dart.core');
     _library = library;
@@ -4601,8 +4603,8 @@
             ImportElementImpl._buildCombinatorsForKernel(_kernel.combinators);
       }
       if (_unlinkedExportPublic != null) {
-        _combinators = ImportElementImpl
-            ._buildCombinators(_unlinkedExportPublic.combinators);
+        _combinators = ImportElementImpl._buildCombinators(
+            _unlinkedExportPublic.combinators);
       }
     }
     return _combinators ?? const <NamespaceCombinator>[];
@@ -5154,8 +5156,9 @@
 
   @override
   List<ParameterElement> get parameters {
-    return _parameters ??= ParameterElementImpl
-        .resynthesizeList(_entityRef.syntheticParams, this, synthetic: true);
+    return _parameters ??= ParameterElementImpl.resynthesizeList(
+        _entityRef.syntheticParams, this,
+        synthetic: true);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index f52e45d..49a4b15 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.error.codes;
-
 import 'package:analyzer/error/error.dart';
 
 export 'package:analyzer/src/analysis_options/error/option_codes.dart';
@@ -889,6 +887,9 @@
           correction: "Try removing one of the named arguments, or "
               "correcting one of the names to reference a different named parameter.");
 
+  static const CompileTimeErrorCode ENUM_CONSTANT_WITH_ENUM_NAME =
+      const CompileTimeErrorCode.fromFasta('ENUM_CONSTANT_WITH_ENUM_NAME');
+
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 20e611f..6545302 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1800,7 +1800,7 @@
     SimpleIdentifier name = pop();
     Token abstractKeyword = modifiers?.abstractKeyword;
     List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, classKeyword);
+    Comment comment = _findComment(metadata, begin);
     // leftBracket, members, and rightBracket are set in [endClassBody].
     classDeclaration = ast.classDeclaration(
       comment,
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index d988e9e..3e92782 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -592,6 +592,10 @@
         errorReporter?.reportErrorForOffset(
             StaticTypeWarningCode.UNDEFINED_SETTER, offset, length);
         return;
+      case "UNEXPECTED_DOLLAR_IN_STRING":
+        errorReporter?.reportErrorForOffset(
+            ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, offset, length);
+        return;
       case "UNEXPECTED_TOKEN":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.UNEXPECTED_TOKEN, offset, length, [lexeme()]);
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 08e71d0..6bd72ac 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -415,7 +415,7 @@
     node.staticType = type;
 
     node.constructorName.staticElement = constructor;
-    node.constructorName.type.type = constructor.returnType;
+    node.constructorName.type.type = type;
 
     typeIdentifier.staticType = type;
     classIdentifier.staticType = type;
@@ -503,13 +503,11 @@
       node.methodName.staticType = invokeType;
     }
 
-    if (invokeType is FunctionType) {
-      if (node.typeArguments != null && typeArguments != null) {
-        _applyTypeArgumentsToList(
-            _enclosingLibraryElement,
-            new TypeArgumentsDartType(typeArguments),
-            node.typeArguments.arguments);
-      }
+    if (node.typeArguments != null && typeArguments != null) {
+      _applyTypeArgumentsToList(
+          _enclosingLibraryElement,
+          new TypeArgumentsDartType(typeArguments),
+          node.typeArguments.arguments);
     }
 
     _applyResolutionToArguments(argumentList);
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index d04d6ad..64e7011 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1303,7 +1303,11 @@
 
   /**
    * Return `true` if strong mode analysis should be used.
+   *
+   * This field is deprecated, and is hard-coded to always return true.
    */
+  @Deprecated(
+      'This field is deprecated and is hard-coded to always return true.')
   bool get strongMode;
 
   /**
@@ -1440,7 +1444,12 @@
   @override
   bool preserveComments = true;
 
-  bool _strongMode = true;
+  @override
+  bool get strongMode => true;
+
+  @Deprecated(
+      "The strongMode field is deprecated, and shouldn't be assigned to")
+  set strongMode(bool value) {}
 
   /**
    * A flag indicating whether strong-mode inference hints should be
@@ -1513,7 +1522,6 @@
     lint = options.lint;
     lintRules = options.lintRules;
     preserveComments = options.preserveComments;
-    strongMode = options.strongMode;
     useFastaParser = options.useFastaParser;
     previewDart2 = options.previewDart2;
     if (options is AnalysisOptionsImpl) {
@@ -1653,9 +1661,9 @@
       buffer.addBool(enableSuperMixins);
       buffer.addBool(implicitCasts);
       buffer.addBool(implicitDynamic);
-      buffer.addBool(strongMode);
       buffer.addBool(strongModeHints);
       buffer.addBool(useFastaParser);
+      buffer.addBool(previewDart2);
 
       // Append error processors.
       buffer.addInt(errorProcessors.length);
@@ -1683,13 +1691,6 @@
   }
 
   @override
-  bool get strongMode => _strongMode || previewDart2;
-
-  void set strongMode(bool value) {
-    _strongMode = value;
-  }
-
-  @override
   void resetToDefaults() {
     declarationCasts = true;
     dart2jsHint = false;
@@ -1710,7 +1711,6 @@
     nonnullableTypes = NONNULLABLE_TYPES;
     patchPaths = {};
     preserveComments = true;
-    strongMode = false;
     strongModeHints = false;
     trackCacheDependencies = true;
     useFastaParser = false;
@@ -1720,7 +1720,6 @@
   void setCrossContextOptionsFrom(AnalysisOptions options) {
     enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
     enableSuperMixins = options.enableSuperMixins;
-    strongMode = options.strongMode;
     if (options is AnalysisOptionsImpl) {
       strongModeHints = options.strongModeHints;
     }
@@ -2568,9 +2567,8 @@
    * Initialize a newly created exception to represent the removal of the given
    * [source].
    */
-  ObsoleteSourceAnalysisException(Source source)
-      : super(
-            "The source '${source.fullName}' was removed while it was being analyzed") {
+  ObsoleteSourceAnalysisException(Source source) : super("The source '${source
+            .fullName}' was removed while it was being analyzed") {
     this._source = source;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 41ee8bb..e82fa74 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1159,6 +1159,7 @@
     _checkForAmbiguousImport(node);
     _checkForReferenceBeforeDeclaration(node);
     _checkForImplicitThisReferenceInInitializer(node);
+    _checkForTypeParameterIdentifierReferencedByStatic(node);
     if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
       _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
     }
@@ -6005,6 +6006,21 @@
     }
   }
 
+  void _checkForTypeParameterIdentifierReferencedByStatic(
+      SimpleIdentifier identifier) {
+    var element = identifier.staticElement;
+    if (element is TypeParameterElement &&
+        element.enclosingElement is ClassElement) {
+      if (_isInStaticMethod || _isInStaticVariableDeclaration) {
+        // The class's type parameters are not in scope for static methods.
+        // However all other type parameters are legal (e.g. the static method's
+        // type parameters, or a local function's type parameters).
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, identifier);
+      }
+    }
+  }
+
   /**
    * Check whether the given type [name] is a type parameter being used to
    * define a static member.
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 744db6f..c669bd0 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -48,7 +48,6 @@
 
 AnalysisOptions _buildAnalyzerOptions(LinterOptions options) {
   AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
-  analysisOptions.strongMode = options.strongMode;
   analysisOptions.hint = false;
   analysisOptions.previewDart2 = options.previewDart2;
   analysisOptions.lint = options.enableLints;
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index 47bdf9f..b835a7a 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -109,7 +109,7 @@
   Map<dynamic, YamlNode> _getDeclaredDependencies(
       ErrorReporter reporter, Map<dynamic, YamlNode> contents, String key) {
     YamlNode field = contents[key];
-    if (field == null) {
+    if (field == null || (field is YamlScalar && field.value == null)) {
       return <String, YamlNode>{};
     } else if (field is YamlMap) {
       return field.nodes;
diff --git a/pkg/analyzer/lib/src/summary/summary_file_builder.dart b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
index 3028abf..3b1087d 100644
--- a/pkg/analyzer/lib/src/summary/summary_file_builder.dart
+++ b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
@@ -45,7 +45,7 @@
     FolderBasedDartSdk sdk = new FolderBasedDartSdk(
         resourceProvider, resourceProvider.getFolder(sdkPath), strong);
     sdk.useSummary = false;
-    sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = strong;
+    sdk.analysisOptions = new AnalysisOptionsImpl();
 
     //
     // Prepare 'dart:' URIs to serialize.
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index e38d019..7a21393 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -60,8 +60,7 @@
   @override
   AnalysisContext get context {
     if (_analysisContext == null) {
-      AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl()
-        ..strongMode = strongMode;
+      AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
       _analysisContext = new SdkAnalysisContext(analysisOptions);
       SourceFactory factory = new SourceFactory(
           [new DartUriResolver(this)], null, resourceProvider);
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 207cd29..6bf8433 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -665,7 +665,6 @@
 
   void _applyStrongOptions(AnalysisOptionsImpl options, YamlNode config) {
     if (config is YamlMap) {
-      options.strongMode = true;
       config.nodes.forEach((k, v) {
         if (k is YamlScalar && v is YamlScalar) {
           _applyStrongModeOption(options, k.value?.toString(), v.value);
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index dddf70e..a5167cd 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.32.2
+version: 0.32.3
 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.2
+  front_end: 0.1.3
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.2
+  kernel: 0.3.3
   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/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index 73eb7d3..d4efaca 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -99,8 +99,6 @@
     SourceFactory sourceFactory = new SourceFactory(resolvers);
     context.sourceFactory = sourceFactory;
     AnalysisContext coreContext = sdk.context;
-    (coreContext.analysisOptions as AnalysisOptionsImpl).strongMode =
-        context.analysisOptions.strongMode;
     //
     // dart:core
     //
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 6cd4ceb..7ffb604 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -38,13 +38,6 @@
 
   @failingTest
   @override
-  test_fieldFormalParameterAssignableToField_typedef() async {
-    // Expected 1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
-    await super.test_fieldFormalParameterAssignableToField_typedef();
-  }
-
-  @failingTest
-  @override
   test_fieldFormalParameterNotAssignableToField() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, found 0;
     //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 1d350f0..d79d0f5 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -20,8 +20,7 @@
 @reflectiveTest
 class CheckedModeCompileTimeErrorCodeTest extends ResolverTestCase {
   @override
-  AnalysisOptions get defaultAnalysisOptions =>
-      new AnalysisOptionsImpl()..strongMode = true;
+  AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
   test_assertion_throws() async {
     Source source = addSource(r'''
@@ -493,7 +492,6 @@
   }
 
   test_listLiteral_inferredElementType() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 const Object x = [1];
 const List<String> y = x;
@@ -515,7 +513,6 @@
   }
 
   test_mapLiteral_inferredKeyType() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 const Object x = {1: 1};
 const Map<String, dynamic> y = x;
@@ -527,7 +524,6 @@
   }
 
   test_mapLiteral_inferredValueType() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 const Object x = {1: 1};
 const Map<dynamic, String> y = x;
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 8ac0d6c..e3f152c 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -685,13 +685,6 @@
 
   @override
   @failingTest
-  test_duplicateDefinition_typeParameters() async {
-    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
-    await super.test_duplicateDefinition_typeParameters();
-  }
-
-  @override
-  @failingTest
   test_duplicateDefinitionInheritance_instanceGetter_staticGetter() async {
     // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
     await super
@@ -1608,20 +1601,6 @@
 
   @override
   @failingTest
-  test_mixinDeclaresConstructor_classDeclaration() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, found 0
-    await super.test_mixinDeclaresConstructor_classDeclaration();
-  }
-
-  @override
-  @failingTest
-  test_mixinDeclaresConstructor_typeAlias() async {
-    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, found 0
-    await super.test_mixinDeclaresConstructor_typeAlias();
-  }
-
-  @override
-  @failingTest
   test_mixinDeferredClass() async {
     // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DEFERRED_CLASS, found 0;
     //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
@@ -2384,25 +2363,6 @@
 
   @override
   @failingTest
-  test_privateOptionalParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
-    await super.test_privateOptionalParameter();
-  }
-
-  @override
-  @failingTest
-  test_privateOptionalParameter_fieldFormal() async {
-    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
-    await super.test_privateOptionalParameter_fieldFormal();
-  }
-
-  @override
-  @failingTest
-  test_privateOptionalParameter_withDefaultValue() async {
-    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
-    await super.test_privateOptionalParameter_withDefaultValue();
-  }
-
   @override
   @failingTest
   test_recursiveCompileTimeConstant() async {
@@ -2441,13 +2401,6 @@
 
   @override
   @failingTest
-  test_recursiveFactoryRedirect_diverging() async {
-    // Bad state: Attempting to apply a non-parameterized type (TypeParameterTypeImpl) to type arguments
-    await super.test_recursiveFactoryRedirect_diverging();
-  }
-
-  @override
-  @failingTest
   test_recursiveFactoryRedirect_generic() async {
     // AnalysisException: Element mismatch in /test.dart at /test.dart
     await super.test_recursiveFactoryRedirect_generic();
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 3edfff2..18567fb 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -110,8 +110,7 @@
 @reflectiveTest
 class CompileTimeErrorCodeTest extends ResolverTestCase {
   @override
-  AnalysisOptions get defaultAnalysisOptions =>
-      new AnalysisOptionsImpl()..strongMode = true;
+  AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
   disabled_test_conflictingGenericInterfaces_hierarchyLoop_infinite() async {
     // There is an interface conflict here due to a loop in the class
@@ -4380,7 +4379,6 @@
   test_mixinInference_conflictingSubstitution() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4398,7 +4396,6 @@
   test_mixinInference_doNotIgnorePreviousExplicitMixins() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 class A extends Object with B<String>, C {}
@@ -4415,7 +4412,6 @@
   test_mixinInference_impossibleSubstitution() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4432,7 +4428,6 @@
   test_mixinInference_matchingClass() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4447,7 +4442,6 @@
   test_mixinInference_matchingClass_inPreviousMixin() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4463,7 +4457,6 @@
   test_mixinInference_noMatchingClass() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4480,7 +4473,6 @@
   test_mixinInference_noMatchingClass_constraintSatisfiedByImplementsClause() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4498,7 +4490,6 @@
   test_mixinInference_noMatchingClass_namedMixinApplication() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4514,7 +4505,6 @@
   test_mixinInference_noMatchingClass_noSuperclassConstraint() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4529,7 +4519,6 @@
   test_mixinInference_noMatchingClass_typeParametersSupplied() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4546,7 +4535,6 @@
     // See dartbug.com/32353 for a detailed explanation.
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 class ioDirectory implements ioFileSystemEntity {}
@@ -5634,7 +5622,6 @@
   }
 
   test_nonConstValueInInitializer_instanceCreation_inDifferentFile() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source sourceA = addNamedSource('/a.dart', r'''
 import 'b.dart';
 const v = const MyClass();
@@ -7384,7 +7371,6 @@
     assertErrors(source,
         [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS]);
     verify([source]);
-    reset();
   }
 
   test_wrongNumberOfParametersForOperator_tilde() async {
@@ -7565,7 +7551,6 @@
       assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
       // no verify(), 'null x' is not resolved
     }
-    reset();
   }
 
   Future<Null> _check_constEvalTypeBool_withParameter_binary(
@@ -7581,7 +7566,6 @@
       StaticTypeWarningCode.NON_BOOL_OPERAND
     ]);
     verify([source]);
-    reset();
   }
 
   Future<Null> _check_constEvalTypeInt_withParameter_binary(String expr) async {
@@ -7596,7 +7580,6 @@
       StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
     ]);
     verify([source]);
-    reset();
   }
 
   Future<Null> _check_constEvalTypeNum_withParameter_binary(String expr) async {
@@ -7611,7 +7594,6 @@
       StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
     ]);
     verify([source]);
-    reset();
   }
 
   Future<Null> _check_wrongNumberOfParametersForOperator(
@@ -7624,7 +7606,6 @@
     assertErrors(
         source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
     verify([source]);
-    reset();
   }
 
   Future<Null> _check_wrongNumberOfParametersForOperator1(String name) async {
@@ -7633,7 +7614,6 @@
   }
 
   Future<Null> _privateCollisionInMixinApplicationTest(String testCode) async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     addNamedSource('/lib1.dart', '''
 class A {
   int _x;
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 807155e..119bbd9 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -815,7 +815,7 @@
 class StrongModeDeclarationResolverTest extends ResolverTestCase {
   @override
   void setUp() {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
+    reset();
   }
 
   test_genericFunction_typeParameter() async {
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index ed41c50..75c40b4 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -53,7 +53,6 @@
       'dart:core': ['/dart_core.patch.dart']
     };
     modifiedOptions.preserveComments = false;
-    modifiedOptions.strongMode = true;
     modifiedOptions.trackCacheDependencies = false;
 
     modifiedOptions.resetToDefaults();
@@ -76,7 +75,6 @@
     expect(modifiedOptions.lintRules, defaultOptions.lintRules);
     expect(modifiedOptions.patchPaths, defaultOptions.patchPaths);
     expect(modifiedOptions.preserveComments, defaultOptions.preserveComments);
-    expect(modifiedOptions.strongMode, defaultOptions.strongMode);
     expect(modifiedOptions.trackCacheDependencies,
         defaultOptions.trackCacheDependencies);
   }
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index b99033d..bfc95d5 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -57,20 +57,6 @@
 
   @failingTest
   @override
-  test_argumentTypeNotAssignable_functionType() async {
-    // Expected 1 errors of type HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
-    return super.test_argumentTypeNotAssignable_functionType();
-  }
-
-  @failingTest
-  @override
-  test_argumentTypeNotAssignable_type() async {
-    // Expected 1 errors of type HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
-    return super.test_argumentTypeNotAssignable_type();
-  }
-
-  @failingTest
-  @override
   test_deprecatedAnnotationUse_call() async {
     // Expected 1 errors of type HintCode.DEPRECATED_MEMBER_USE, found 0
     return super.test_deprecatedAnnotationUse_call();
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 1ee7d3e..a958802 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -3050,7 +3050,6 @@
 
   test_strongMode_downCastCompositeHint() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     options.strongModeHints = true;
     resetWith(options: options);
     Source source = addSource(r'''
@@ -3066,7 +3065,6 @@
 
   test_strongMode_downCastCompositeNoHint() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     options.strongModeHints = false;
     resetWith(options: options);
     Source source = addSource(r'''
@@ -3091,7 +3089,6 @@
             },
           }
         }));
-    options.strongMode = true;
     options.strongModeHints = false;
     resetWith(options: options);
     Source source = addSource(r'''
@@ -3106,7 +3103,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int get g => 0;
@@ -3121,7 +3117,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_call() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int Function() get g => () => 0;
@@ -3137,7 +3132,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_field() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int g;
@@ -3152,7 +3146,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_field_call() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int Function() g;
@@ -3168,7 +3161,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_field_prefixedIdentifier() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int g;
@@ -3184,7 +3176,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   get g => 0;
@@ -3201,7 +3192,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_call() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   get g => () => 0;
@@ -3219,7 +3209,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_field() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var g = 0;
@@ -3236,7 +3225,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var g = () => 0;
@@ -3254,7 +3242,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_prefixedIdentifier() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var g = 0;
@@ -3272,7 +3259,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_fn() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3293,7 +3279,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_fn_explicit_type_params() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3310,7 +3295,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_fn_not_generic() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3327,7 +3311,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_indexExpression() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3344,7 +3327,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3364,7 +3346,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_explicit_type_params() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3380,7 +3361,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3396,7 +3376,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_method() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3417,7 +3396,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_method_explicit_type_params() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3434,7 +3412,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_method_not_generic() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3451,7 +3428,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3474,7 +3450,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3493,7 +3468,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_named() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3512,7 +3486,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     addNamedSource('/lib1.dart', '''
 class B<T> {
   B(x);
@@ -3534,7 +3507,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_named() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3557,7 +3529,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3576,7 +3547,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_named() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = 0;
@@ -3595,7 +3565,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     addNamedSource('/lib1.dart', '''
 class B {
   B(x);
@@ -3617,7 +3586,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     addNamedSource('/lib1.dart', '''
 class B<T> {
   B(x);
@@ -3643,7 +3611,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_prefixedIdentifier() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   get g => 0;
@@ -3661,7 +3628,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_propertyAccessLhs() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   var x = new B();
@@ -3685,7 +3651,6 @@
   }
 
   test_strongMode_topLevelInstanceGetter_prefixedIdentifier() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int get g => 0;
@@ -3701,7 +3666,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   f() => 0;
@@ -3718,7 +3682,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_parameter() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int f(v) => 0;
@@ -3731,7 +3694,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_parameter_generic() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int f<T>(v) => 0;
@@ -3748,7 +3710,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_parameter_generic_explicit() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int f<T>(v) => 0;
@@ -3761,7 +3722,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_static() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   static f() => 0;
@@ -3774,7 +3734,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_tearoff() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   f() => 0;
@@ -3791,7 +3750,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_tearoff_parameter() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   int f(v) => 0;
@@ -3808,7 +3766,6 @@
   }
 
   test_strongMode_topLevelInstanceMethod_tearoff_static() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource('''
 class A {
   static f() => 0;
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 686290a..253b063 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -26,8 +26,7 @@
 @reflectiveTest
 class InvalidCodeTest extends ResolverTestCase {
   @override
-  AnalysisOptions get defaultAnalysisOptions =>
-      new AnalysisOptionsImpl()..strongMode = true;
+  AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
   /**
    * This code results in a method with the empty name, and the default
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index cbecf0a..e668382 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -48,6 +48,13 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33795')
+  test_annotated_partOfDeclaration() async {
+    return super.test_annotated_partOfDeclaration();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
@@ -170,7 +177,7 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33799')
   test_functionTypeAlias_scope_signature() async {
     // Caused by Bad state: Found 1 annotation nodes and 0 element annotations
     return super.test_functionTypeAlias_scope_signature();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 679a8d5..19d4b8e 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -29,8 +29,7 @@
 @reflectiveTest
 class NonErrorResolverTest extends ResolverTestCase {
   @override
-  AnalysisOptions get defaultAnalysisOptions =>
-      new AnalysisOptionsImpl()..strongMode = true;
+  AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
   fail_undefinedEnumConstant() async {
     Source source = addSource(r'''
@@ -315,10 +314,7 @@
   }
 
   test_argumentTypeNotAssignable_optionalNew() async {
-    resetWith(
-        options: new AnalysisOptionsImpl()
-          ..previewDart2 = true
-          ..strongMode = true);
+    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
     Source source = addSource(r'''
 class Widget { }
 
@@ -1100,8 +1096,7 @@
     CompilationUnit unit = analysisResult.unit;
 
     Element getElement(String search) {
-      return EngineTestCase
-          .findSimpleIdentifier(unit, code, search)
+      return EngineTestCase.findSimpleIdentifier(unit, code, search)
           .staticElement;
     }
 
@@ -1295,7 +1290,6 @@
   }
 
   test_const_imported_defaultParameterValue_withImportPrefix() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addNamedSource("/a.dart", r'''
 import 'b.dart';
 const b = const B();
@@ -2702,7 +2696,6 @@
   test_infer_mixin() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -2727,7 +2720,6 @@
   test_infer_mixin_multiplyConstrained() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -2758,7 +2750,6 @@
   test_infer_mixin_with_substitution() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -2783,7 +2774,6 @@
   test_infer_mixin_with_substitution_functionType() async {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.enableSuperMixins = true;
-    options.strongMode = true;
     resetWith(options: options);
     Source source = addSource('''
 abstract class A<T> {}
@@ -4777,10 +4767,7 @@
   }
 
   test_optionalNew_rewrite() async {
-    resetWith(
-        options: new AnalysisOptionsImpl()
-          ..previewDart2 = true
-          ..strongMode = true);
+    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
     Source source = addSource(r'''
 import 'b.dart';
 main() {
@@ -4820,10 +4807,7 @@
   }
 
   test_optionalNew_rewrite_instantiatesToBounds() async {
-    resetWith(
-        options: new AnalysisOptionsImpl()
-          ..previewDart2 = true
-          ..strongMode = true);
+    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
     Source source = addSource(r'''
 import 'b.dart';
 
@@ -6429,7 +6413,6 @@
     await computeAnalysisResult(source);
     assertNoErrors(source);
     verify([source]);
-    reset();
   }
 
   Future<Null> _check_wrongNumberOfParametersForOperator1(String name) async {
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index d0b41db..ede068d 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -36,15 +36,6 @@
   @override
   bool get useCFE => true;
 
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
-  test_deprecatedMemberUse_inDeprecatedLibrary() async {
-    // LibraryAnalyzer is not applying resolution data to annotations on
-    // directives.
-    await super.test_deprecatedMemberUse_inDeprecatedLibrary();
-  }
-
   @override
   @failingTest
   test_overrideOnNonOverridingField_inInterface() {
@@ -113,13 +104,6 @@
     await super.test_unusedImport_annotationOnDirective();
   }
 
-  @failingTest
-  @override
-  @potentialAnalyzerProblem
-  test_unusedImport_metadata() async {
-    await super.test_unusedImport_metadata();
-  }
-
   @override
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/33678')
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index f7003ec..4ce0687 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -312,12 +312,12 @@
       int parentStart = parent.offset;
       int parentEnd = parentStart + parent.length;
       if (nodeStart < parentStart) {
-        _errors.add(
-            "Invalid source start ($nodeStart) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
+        _errors.add("Invalid source start ($nodeStart) for ${node
+            .runtimeType} inside ${parent.runtimeType} ($parentStart)");
       }
       if (nodeEnd > parentEnd) {
-        _errors.add(
-            "Invalid source end ($nodeEnd) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
+        _errors.add("Invalid source end ($nodeEnd) for ${node
+            .runtimeType} inside ${parent.runtimeType} ($parentStart)");
       }
     }
   }
@@ -3201,7 +3201,10 @@
   void test_expectedInterpolationIdentifier() {
     StringLiteral literal = parseExpression("'\$x\$'", errors: [
       fe.Scanner.useFasta
-          ? expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 4, 1)
+          ? (usingFastaParser
+              ? expectedError(
+                  ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 4, 1)
+              : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 4, 1))
           : expectedError(ParserErrorCode.MISSING_IDENTIFIER, 3, 1)
     ]);
     expectNotNullIfNoErrors(literal);
@@ -3212,11 +3215,13 @@
     // make sure that the MISSING_IDENTIFIER error that is generated has a
     // nonzero width so that it will show up in the editor UI.
     StringLiteral literal = parseExpression("'\$\$foo'",
-//        codes: fe.Scanner.useFasta
-//            ? [ScannerErrorCode.MISSING_IDENTIFIER]
-//            : [ParserErrorCode.MISSING_IDENTIFIER],
         errors: fe.Scanner.useFasta
-            ? [expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)]
+            ? [
+                (usingFastaParser
+                    ? expectedError(
+                        ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 2, 1)
+                    : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1))
+              ]
             : [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 2, 1)]);
     expectNotNullIfNoErrors(literal);
   }
@@ -4081,7 +4086,10 @@
   void test_invalidInterpolationIdentifier_startWithDigit() {
     StringLiteral literal = parseExpression("'\$1'", errors: [
       fe.Scanner.useFasta
-          ? expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1)
+          ? (usingFastaParser
+              ? expectedError(
+                  ScannerErrorCode.UNEXPECTED_DOLLAR_IN_STRING, 2, 1)
+              : expectedError(ScannerErrorCode.MISSING_IDENTIFIER, 2, 1))
           : expectedError(ParserErrorCode.MISSING_IDENTIFIER, 2, 1)
     ]);
     expectNotNullIfNoErrors(literal);
@@ -6750,17 +6758,6 @@
     expect(literal.typeArguments, isNotNull);
   }
 
-  void test_parseConstExpression_mapLiteral_typed_missingGt() {
-    Expression expression = parseExpression('const <A, B {}',
-        errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 1)]);
-    expect(expression, isNotNull);
-    var literal = expression as MapLiteral;
-    expect(literal.leftBracket, isNotNull);
-    expect(literal.entries, hasLength(0));
-    expect(literal.rightBracket, isNotNull);
-    expect(literal.typeArguments, isNotNull);
-  }
-
   void test_parseConstExpression_mapLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
     Expression expression = parseConstExpression('const /*<A, B>*/ {}');
@@ -6777,6 +6774,17 @@
     expect(literal.typeArguments, isNotNull);
   }
 
+  void test_parseConstExpression_mapLiteral_typed_missingGt() {
+    Expression expression = parseExpression('const <A, B {}',
+        errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 1)]);
+    expect(expression, isNotNull);
+    var literal = expression as MapLiteral;
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNotNull);
+  }
+
   void test_parseConstExpression_mapLiteral_untyped() {
     Expression expression = parseConstExpression('const {}');
     expect(expression, isNotNull);
@@ -7036,25 +7044,6 @@
     expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
   }
 
-  void test_parseFunctionExpression_functionInPlaceOfTypeName() {
-    Expression expression = parseExpression('<test(' ', (){});>[0, 1, 2]',
-        codes: usingFastaParser
-            ? [
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.UNEXPECTED_TOKEN,
-                ParserErrorCode.MISSING_IDENTIFIER,
-                ParserErrorCode.MISSING_IDENTIFIER,
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.MISSING_FUNCTION_BODY,
-              ]
-            : [
-                ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.MISSING_IDENTIFIER,
-                ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
-              ]);
-    expect(expression, isNotNull);
-  }
-
   void test_parseFunctionExpression_constAndTypeParameters2() {
     FunctionExpression expression =
         parseFunctionExpression('const <E>(E i) => i++');
@@ -7076,6 +7065,25 @@
     }
   }
 
+  void test_parseFunctionExpression_functionInPlaceOfTypeName() {
+    Expression expression = parseExpression('<test(' ', (){});>[0, 1, 2]',
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_FUNCTION_BODY,
+              ]
+            : [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
+              ]);
+    expect(expression, isNotNull);
+  }
+
   void test_parseFunctionExpression_typeParameterComments() {
     enableGenericMethodComments = true;
     FunctionExpression expression =
@@ -7965,6 +7973,19 @@
     expect(invocation.period, isNull);
   }
 
+  void test_parseRelationalExpression_as_chained() {
+    AsExpression asExpression = parseExpression('x as Y as Z',
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 2)]
+            : []);
+    expect(asExpression, isNotNull);
+    SimpleIdentifier identifier = asExpression.expression;
+    expect(identifier.name, 'x');
+    expect(asExpression.asOperator, isNotNull);
+    TypeName typeName = asExpression.type;
+    expect(typeName.name.name, 'Y');
+  }
+
   void test_parseRelationalExpression_as_functionType_noReturnType() {
     Expression expression = parseRelationalExpression('x as Function(int)');
     expect(expression, isNotNull);
@@ -8006,19 +8027,6 @@
     expect(asExpression.type, new TypeMatcher<TypeName>());
   }
 
-  void test_parseRelationalExpression_as_chained() {
-    AsExpression asExpression = parseExpression('x as Y as Z',
-        errors: usingFastaParser
-            ? [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 7, 2)]
-            : []);
-    expect(asExpression, isNotNull);
-    SimpleIdentifier identifier = asExpression.expression;
-    expect(identifier.name, 'x');
-    expect(asExpression.asOperator, isNotNull);
-    TypeName typeName = asExpression.type;
-    expect(typeName.name.name, 'Y');
-  }
-
   void test_parseRelationalExpression_as_simple_function() {
     Expression expression = parseRelationalExpression('x as Function');
     expect(expression, isNotNull);
@@ -13883,6 +13891,20 @@
     expect(declaration.metadata, isEmpty);
   }
 
+  void test_parseCommentReferences_33738() {
+    CompilationUnit unit =
+        parseCompilationUnit('/** [String] */ abstract class Foo {}');
+    ClassDeclaration clazz = unit.declarations[0];
+    Comment comment = clazz.documentationComment;
+    expect(clazz.isAbstract, isTrue);
+    List<CommentReference> references = comment.references;
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 5);
+  }
+
   void test_parseConfiguration_noOperator_dottedIdentifier() {
     createParser("if (a.b) 'c.dart'");
     Configuration configuration = parser.parseConfiguration();
@@ -14209,6 +14231,37 @@
     expect(creation.typeArguments.toSource(), '<int, int Function(String)>');
   }
 
+  void test_parseInstanceCreation_keyword_33647() {
+    enableOptionalNewAndConst = true;
+    CompilationUnit unit = parseCompilationUnit('''
+var c = new Future<int>.sync(() => 3).then<int>((e) => e);
+''');
+    expect(unit, isNotNull);
+    TopLevelVariableDeclaration v = unit.declarations[0];
+    MethodInvocation init = v.variables.variables[0].initializer;
+    expect(init.methodName.name, 'then');
+    NodeList<TypeAnnotation> typeArg = init.typeArguments.arguments;
+    expect(typeArg, hasLength(1));
+    expect(typeArg[0].beginToken.lexeme, 'int');
+  }
+
+  void test_parseInstanceCreation_noKeyword_33647() {
+    enableOptionalNewAndConst = true;
+    // Old parser produces errors
+    if (usingFastaParser) {
+      CompilationUnit unit = parseCompilationUnit('''
+var c = Future<int>.sync(() => 3).then<int>((e) => e);
+''');
+      expect(unit, isNotNull);
+      TopLevelVariableDeclaration v = unit.declarations[0];
+      MethodInvocation init = v.variables.variables[0].initializer;
+      expect(init.methodName.name, 'then');
+      NodeList<TypeAnnotation> typeArg = init.typeArguments.arguments;
+      expect(typeArg, hasLength(1));
+      expect(typeArg[0].beginToken.lexeme, 'int');
+    }
+  }
+
   void test_parseLibraryIdentifier_builtin() {
     String name = "deferred";
     LibraryIdentifier identifier = parseLibraryIdentifier(name);
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 96b1156..7898ec9 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -674,9 +674,7 @@
     options ??= defaultAnalysisOptions;
     if (enableNewAnalysisDriver) {
       if (useCFE) {
-        (options as AnalysisOptionsImpl)
-          ..strongMode = true
-          ..useFastaParser = true;
+        (options as AnalysisOptionsImpl)..useFastaParser = true;
       }
       DartSdk sdk = new MockSdk(resourceProvider: resourceProvider)
         ..context.analysisOptions = options;
@@ -958,5 +956,6 @@
   final Source source;
   final CompilationUnit unit;
   final List<AnalysisError> errors;
+
   TestAnalysisResult(this.source, this.unit, this.errors);
 }
diff --git a/pkg/analyzer/test/generated/sdk_test.dart b/pkg/analyzer/test/generated/sdk_test.dart
index 9a317e9..ef34fcc 100644
--- a/pkg/analyzer/test/generated/sdk_test.dart
+++ b/pkg/analyzer/test/generated/sdk_test.dart
@@ -89,11 +89,9 @@
   void test_equals_samePaths_differentOptions() {
     String path = '/a/b/c';
     AnalysisOptionsImpl leftOptions = new AnalysisOptionsImpl()
-      ..previewDart2 = false
-      ..strongMode = false;
+      ..previewDart2 = false;
     AnalysisOptionsImpl rightOptions = new AnalysisOptionsImpl()
-      ..previewDart2 = true
-      ..strongMode = true;
+      ..previewDart2 = true;
     SdkDescription left = new SdkDescription(<String>[path], leftOptions);
     SdkDescription right = new SdkDescription(<String>[path], rightOptions);
     expect(left == right, isFalse);
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index d98e6c1..1a31ec6 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -1624,7 +1624,6 @@
     InternalAnalysisContext context;
     if (strongMode) {
       AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-      options.strongMode = true;
       context = AnalysisContextFactory.contextWithCoreAndOptions(options,
           resourceProvider: resourceProvider);
     } else {
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 92509f6..fd5c686 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -854,13 +854,6 @@
 
   @override
   @failingTest
-  test_undefinedSuperSetter() async {
-    // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_SUPER_SETTER, found 0
-    await super.test_undefinedSuperSetter();
-  }
-
-  @override
-  @failingTest
   test_unqualifiedReferenceToNonLocalStaticMember_getter() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, found 0
     await super.test_unqualifiedReferenceToNonLocalStaticMember_getter();
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 1912d7f..8c6e5b1 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -436,7 +436,6 @@
   }
 
   test_illegalAsyncGeneratorReturnType_function_subtypeOfStream() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode('''
 import 'dart:async';
 abstract class SubStream<T> implements Stream<T> {}
@@ -453,7 +452,6 @@
   }
 
   test_illegalAsyncGeneratorReturnType_method_subtypeOfStream() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode('''
 import 'dart:async';
 abstract class SubStream<T> implements Stream<T> {}
@@ -473,7 +471,6 @@
   }
 
   test_illegalAsyncReturnType_function_subtypeOfFuture() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode('''
 import 'dart:async';
 abstract class SubFuture<T> implements Future<T> {}
@@ -495,7 +492,6 @@
   }
 
   test_illegalAsyncReturnType_method_subtypeOfFuture() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode('''
 import 'dart:async';
 abstract class SubFuture<T> implements Future<T> {}
@@ -514,7 +510,6 @@
   }
 
   test_illegalSyncGeneratorReturnType_function_subclassOfIterator() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode('''
 abstract class SubIterator<T> implements Iterator<T> {}
 SubIterator<int> f() sync* {}
@@ -530,7 +525,6 @@
   }
 
   test_illegalSyncGeneratorReturnType_method_subclassOfIterator() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode('''
 abstract class SubIterator<T> implements Iterator<T> {}
 class C {
@@ -1114,7 +1108,6 @@
   }
 
   test_typeArgumentNotMatchingBounds_methodInvocation_localFunction() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode(r'''
 class Point<T extends num> {
   Point(T x, T y);
@@ -1130,7 +1123,6 @@
   }
 
   test_typeArgumentNotMatchingBounds_methodInvocation_method() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode(r'''
 class Point<T extends num> {
   Point(T x, T y);
@@ -1149,7 +1141,6 @@
   }
 
   test_typeArgumentNotMatchingBounds_methodInvocation_topLevelFunction() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     await assertErrorsInCode(r'''
 class Point<T extends num> {
   Point(T x, T y);
@@ -2044,7 +2035,6 @@
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     resetWith(options: options);
   }
 
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index 5c1b8df..9d1f172 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -126,48 +126,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_ambiguousClassName() async {
-    return super.test_argumentTypeNotAssignable_ambiguousClassName();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_annotation_namedConstructor() async {
-    return super.test_argumentTypeNotAssignable_annotation_namedConstructor();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_annotation_unnamedConstructor() async {
-    return super.test_argumentTypeNotAssignable_annotation_unnamedConstructor();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_binary() async {
-    return super.test_argumentTypeNotAssignable_binary();
-  }
-
-  @override
-  @failingTest
-  test_argumentTypeNotAssignable_call() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_argumentTypeNotAssignable_call();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_cascadeSecond() async {
-    return super.test_argumentTypeNotAssignable_cascadeSecond();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_argumentTypeNotAssignable_const() async {
     return super.test_argumentTypeNotAssignable_const();
   }
@@ -182,120 +140,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_functionExpressionInvocation_required() async {
-    return super
-        .test_argumentTypeNotAssignable_functionExpressionInvocation_required();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_index() async {
-    return super.test_argumentTypeNotAssignable_index();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_callParameter() async {
-    return super.test_argumentTypeNotAssignable_invocation_callParameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_callVariable() async {
-    return super.test_argumentTypeNotAssignable_invocation_callVariable();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_functionParameter() async {
-    return super.test_argumentTypeNotAssignable_invocation_functionParameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_functionParameter_generic() async {
-    return super
-        .test_argumentTypeNotAssignable_invocation_functionParameter_generic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_generic() async {
-    return super.test_argumentTypeNotAssignable_invocation_generic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_named() async {
-    return super.test_argumentTypeNotAssignable_invocation_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_optional() async {
-    return super.test_argumentTypeNotAssignable_invocation_optional();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_required() async {
-    return super.test_argumentTypeNotAssignable_invocation_required();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_typedef_generic() async {
-    return super.test_argumentTypeNotAssignable_invocation_typedef_generic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_typedef_local() async {
-    return super.test_argumentTypeNotAssignable_invocation_typedef_local();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_invocation_typedef_parameter() async {
-    return super.test_argumentTypeNotAssignable_invocation_typedef_parameter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_new_generic() async {
-    return super.test_argumentTypeNotAssignable_new_generic();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_new_optional() async {
-    return super.test_argumentTypeNotAssignable_new_optional();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_argumentTypeNotAssignable_new_required() async {
-    return super.test_argumentTypeNotAssignable_new_required();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_assignmentToClass() async {
     return super.test_assignmentToClass();
   }
@@ -613,6 +457,13 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
+  test_constWithAbstractClass_generic() async {
+    return super.test_constWithAbstractClass_generic();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
   test_equalKeysInMap() async {
     return super.test_equalKeysInMap();
   }
@@ -1120,13 +971,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_newWithAbstractClass() async {
-    return super.test_newWithAbstractClass();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_newWithInvalidTypeParameters() async {
     return super.test_newWithInvalidTypeParameters();
   }
@@ -1591,27 +1435,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeParameterReferencedByStatic_field() async {
-    return super.test_typeParameterReferencedByStatic_field();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeParameterReferencedByStatic_getter() async {
-    return super.test_typeParameterReferencedByStatic_getter();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_typeParameterReferencedByStatic_methodBodyReference() async {
-    return super.test_typeParameterReferencedByStatic_methodBodyReference();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeParameterReferencedByStatic_methodParameter() async {
     return super.test_typeParameterReferencedByStatic_methodParameter();
   }
@@ -1619,13 +1442,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typeParameterReferencedByStatic_methodReturn() async {
-    return super.test_typeParameterReferencedByStatic_methodReturn();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeParameterReferencedByStatic_setter() async {
     return super.test_typeParameterReferencedByStatic_setter();
   }
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 7f66abf..b216684 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -4,6 +4,7 @@
 
 library analyzer.test.generated.static_warning_code_test;
 
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -369,7 +370,6 @@
   }
 
   test_argumentTypeNotAssignable_call() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource(r'''
 typedef bool Predicate<T>(T object);
 
@@ -1224,6 +1224,27 @@
     verify([source]);
   }
 
+  test_constWithAbstractClass_generic() async {
+    Source source = addSource(r'''
+abstract class A<E> {
+  const A();
+}
+void f() {
+  var a = const A<int>();
+}''');
+    TestAnalysisResult result = await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS]);
+    verify([source]);
+
+    ClassDeclaration classA = result.unit.declarations[0];
+    FunctionDeclaration f = result.unit.declarations[1];
+    BlockFunctionBody body = f.functionExpression.body;
+    VariableDeclarationStatement a = body.block.statements[0];
+    InstanceCreationExpression init = a.variables.variables[0].initializer;
+    expect(init.staticType,
+        classA.element.type.instantiate([typeProvider.intType]));
+  }
+
   test_equalKeysInMap() async {
     Source source = addSource("var m = {'a' : 0, 'b' : 1, 'a' : 2};");
     await computeAnalysisResult(source);
@@ -2980,6 +3001,25 @@
     verify([source]);
   }
 
+  test_newWithAbstractClass_generic() async {
+    Source source = addSource(r'''
+abstract class A<E> {}
+void f() {
+  var a = new A<int>();
+}''');
+    TestAnalysisResult result = await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS]);
+    verify([source]);
+
+    ClassDeclaration classA = result.unit.declarations[0];
+    FunctionDeclaration f = result.unit.declarations[1];
+    BlockFunctionBody body = f.functionExpression.body;
+    VariableDeclarationStatement a = body.block.statements[0];
+    InstanceCreationExpression init = a.variables.variables[0].initializer;
+    expect(init.staticType,
+        classA.element.type.instantiate([typeProvider.intType]));
+  }
+
   test_newWithInvalidTypeParameters() async {
     Source source = addSource(r'''
 class A {}
@@ -3202,7 +3242,6 @@
   }
 
   test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface_abstractNSM() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource(r'''
 class I {
   m(p) {}
@@ -3217,7 +3256,6 @@
   }
 
   test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface_abstractOverrideNSM() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource(r'''
 class I {
   m(p) {}
@@ -3234,7 +3272,6 @@
   }
 
   test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface_ifcNSM() async {
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
     Source source = addSource(r'''
 class I {
   m(p) {}
@@ -4063,6 +4100,20 @@
     verify([source]);
   }
 
+  test_typeParameterReferencedByStatic_simpleIdentifier() async {
+    Source source = addSource('''
+class A<T> {
+  static foo() {
+    T;
+  }
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
   test_typePromotion_functionType_arg_InterToDyn() async {
     Source source = addSource(r'''
 typedef FuncDyn(x);
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 411efa9..174f423 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -37,20 +37,6 @@
 
   @override
   @failingTest
-  test_async_star_method_propagation() async {
-    // Bad state: No type information for Stream at 124
-    await super.test_async_star_method_propagation();
-  }
-
-  @override
-  @failingTest
-  test_async_star_propagation() async {
-    // Bad state: No type information for Stream at 105
-    await super.test_async_star_propagation();
-  }
-
-  @override
-  @failingTest
   test_constrainedByBounds2() async {
     // Expected: InterfaceTypeImpl:<int>
     await super.test_constrainedByBounds2();
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index a84ddc6..3b4a816 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -95,7 +95,6 @@
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     resetWith(options: options);
   }
 
@@ -2810,7 +2809,6 @@
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     resetWith(options: options);
   }
 
@@ -4357,7 +4355,6 @@
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongMode = true;
     resetWith(options: options);
   }
 
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 8cbef81..1634449 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -40,7 +40,6 @@
       '--options=$defaultAnalysisOptionsFilePath',
       '--packages=$defaultPackageFilePath',
       '--package-root=$defaultPackagesDirectoryPath',
-      '--strong',
       '--supermixin',
     ];
     ArgResults result = parse(provider, parser, args);
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 94e546b..8dc66ad 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -629,24 +629,8 @@
     expect(sdk, isNotNull);
   }
 
-  void test_findSdk_noPackageMap_html_spec() {
-    DartSdk sdk = builder.findSdk(
-        null,
-        new AnalysisOptionsImpl()
-          ..previewDart2 = false
-          ..strongMode = false);
-    expect(sdk, isNotNull);
-    Source htmlSource = sdk.mapDartUri('dart:html');
-    expect(
-        htmlSource.fullName,
-        resourceProvider
-            .convertPath('/sdk/lib/html/dartium/html_dartium.dart'));
-    expect(htmlSource.exists(), isTrue);
-  }
-
   void test_findSdk_noPackageMap_html_strong() {
-    DartSdk sdk =
-        builder.findSdk(null, new AnalysisOptionsImpl()..strongMode = true);
+    DartSdk sdk = builder.findSdk(null, new AnalysisOptionsImpl());
     expect(sdk, isNotNull);
     Source htmlSource = sdk.mapDartUri('dart:html');
     expect(
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 206fbf9..0cc8e04 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -148,8 +148,7 @@
 
   void test_applyChanges_addNewImport_invalidateLibraryCycle() {
     context.analysisOptions =
-        new AnalysisOptionsImpl.from(context.analysisOptions)
-          ..strongMode = true;
+        new AnalysisOptionsImpl.from(context.analysisOptions);
     Source embedder = addSource('/a.dart', r'''
 library a;
 import 'b.dart';
@@ -2386,7 +2385,7 @@
 
   @failingTest // TODO(paulberry): Remove the annotation when dartbug.com/28515 is fixed.
   void test_resolveCompilationUnit_existingElementModel() {
-    prepareAnalysisContext(new AnalysisOptionsImpl()..strongMode = true);
+    prepareAnalysisContext(new AnalysisOptionsImpl());
     Source source = addSource('/test.dart', r'''
 library test;
 
@@ -2793,7 +2792,7 @@
 
   void _checkFlushSingleResolvedUnit(String code,
       void validate(CompilationUnitElement unitElement, String reason)) {
-    prepareAnalysisContext(new AnalysisOptionsImpl()..strongMode = true);
+    prepareAnalysisContext(new AnalysisOptionsImpl());
     String path = resourceProvider.convertPath('/test.dart');
     Source source = resourceProvider.newFile(path, code).createSource();
     context.applyChanges(new ChangeSet()..addedSource(source));
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 917a0cf6..62d34e0 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -109,9 +109,8 @@
         enableKernelDriver: useCFE);
   }
 
-  AnalysisOptionsImpl createAnalysisOptions() => new AnalysisOptionsImpl()
-    ..strongMode = true
-    ..useFastaParser = useCFE;
+  AnalysisOptionsImpl createAnalysisOptions() =>
+      new AnalysisOptionsImpl()..useFastaParser = useCFE;
 
   int findOffset(String search) {
     int offset = testCode.indexOf(search);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index a78089a..e62131b 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -52,6 +52,30 @@
 //    await super.test_asyncChangesDuringAnalysis_getErrors();
   }
 
+  test_componentMetadata_incremental_merge() async {
+    var a = _p('/a.dart');
+    var b = _p('/b.dart');
+    provider.newFile(a, r'''
+class A {
+  A.a();
+}
+''');
+    provider.newFile(b, r'''
+class B {
+  B.b();
+}
+''');
+    await driver.getResult(a);
+    await driver.getResult(b);
+
+    // This will fail if compilation of 'b' removed metadata for 'a'.
+    // We use metadata to get constructor name offsets.
+    await driver.getResult(a);
+
+    // And check that 'b' still has its metadata as well.
+    await driver.getResult(b);
+  }
+
   @override
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/33642')
@@ -80,30 +104,30 @@
     await super.test_const_implicitSuperConstructorInvocation();
   }
 
-  @failingTest
-  @potentialAnalyzerProblem
   @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
   test_errors_uriDoesNotExist_export() async {
     await super.test_errors_uriDoesNotExist_export();
   }
 
-  @failingTest
-  @potentialAnalyzerProblem
   @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
   test_errors_uriDoesNotExist_import() async {
     await super.test_errors_uriDoesNotExist_import();
   }
 
-  @failingTest
-  @potentialAnalyzerProblem
   @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
   test_errors_uriDoesNotExist_import_deferred() async {
     await super.test_errors_uriDoesNotExist_import_deferred();
   }
 
-  @failingTest
-  @potentialAnalyzerProblem
   @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
   test_errors_uriDoesNotExist_part() async {
     await super.test_errors_uriDoesNotExist_part();
   }
@@ -125,6 +149,13 @@
     await super.test_getErrors();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
+  test_getResult_doesNotExist() async {
+    await super.test_getResult_doesNotExist();
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   @override
@@ -241,12 +272,7 @@
     await super.test_removeFile_invalidate_importers();
   }
 
-  @failingTest
-  @potentialAnalyzerProblem
-  @override
-  test_results_order() async {
-    await super.test_results_order();
-  }
+  String _p(String path) => provider.convertPath(path);
 }
 
 /// Tests marked with this annotation fail because of an Analyzer problem.
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index d6fef73..c7b5634 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -21,6 +21,20 @@
   @override
   bool get useCFE => true;
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33795')
+  test_annotation_onDirective_partOf() async {
+    await super.test_annotation_onDirective_partOf();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33800')
+  test_annotation_onFormalParameter_redirectingFactory() async {
+    await super.test_annotation_onFormalParameter_redirectingFactory();
+  }
+
   @failingTest
   @override
   test_annotation_onVariableList_topLevelVariable() =>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index c4c8cbd..18d8fb2 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -236,6 +236,136 @@
     }
   }
 
+  test_annotation_onDirective_export() async {
+    addTestFile(r'''
+@a
+export 'dart:math';
+
+const a = 1;
+''');
+    await resolveTestFile();
+
+    var directive = findNode.export('dart:math');
+
+    expect(directive.metadata, hasLength(1));
+    Annotation annotation = directive.metadata[0];
+    expect(annotation.element, findElement.topGet('a'));
+
+    SimpleIdentifier aRef = annotation.name;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_annotation_onDirective_import() async {
+    addTestFile(r'''
+@a
+import 'dart:math';
+
+const a = 1;
+''');
+    await resolveTestFile();
+
+    var directive = findNode.import('dart:math');
+
+    expect(directive.metadata, hasLength(1));
+    Annotation annotation = directive.metadata[0];
+    expect(annotation.element, findElement.topGet('a'));
+
+    SimpleIdentifier aRef = annotation.name;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_annotation_onDirective_library() async {
+    addTestFile(r'''
+@a
+library test;
+
+const a = 1;
+''');
+    await resolveTestFile();
+
+    var directive = findNode.libraryDirective;
+
+    expect(directive.metadata, hasLength(1));
+    Annotation annotation = directive.metadata[0];
+    expect(annotation.element, findElement.topGet('a'));
+
+    SimpleIdentifier aRef = annotation.name;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_annotation_onDirective_part() async {
+    provider.newFile(_p('/test/lib/a.dart'), r'''
+part of 'test.dart';
+''');
+    addTestFile(r'''
+@a
+part 'a.dart';
+
+const a = 1;
+''');
+    await resolveTestFile();
+
+    var directive = findNode.part('a.dart');
+
+    expect(directive.metadata, hasLength(1));
+    Annotation annotation = directive.metadata[0];
+    expect(annotation.element, findElement.topGet('a'));
+
+    SimpleIdentifier aRef = annotation.name;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_annotation_onDirective_partOf() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+part 'test.dart';
+''');
+    addTestFile(r'''
+@a
+part of 'a.dart';
+
+const a = 1;
+''');
+    driver.addFile(a);
+    await resolveTestFile();
+
+    var directive = findNode.partOf('a.dart');
+
+    expect(directive.metadata, hasLength(1));
+    Annotation annotation = directive.metadata[0];
+    expect(annotation.element, findElement.topGet('a'));
+
+    SimpleIdentifier aRef = annotation.name;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
+  test_annotation_onFormalParameter_redirectingFactory() async {
+    addTestFile(r'''
+class C {
+  factory C(@a p) = C.named;
+  C.named(p);
+}
+
+const a = 1;
+''');
+    await resolveTestFile();
+
+    var parameter = findNode.simpleParameter('p) = C.');
+
+    expect(parameter.metadata, hasLength(1));
+    Annotation annotation = parameter.metadata[0];
+    expect(annotation.element, findElement.topGet('a'));
+
+    SimpleIdentifier aRef = annotation.name;
+    assertElement(aRef, findElement.topGet('a'));
+    assertType(aRef, 'int');
+  }
+
   test_annotation_onVariableList_constructor() async {
     String content = r'''
 class C {
@@ -2971,6 +3101,74 @@
     assertType(aRef, 'int');
   }
 
+  test_invalid_instanceCreation_abstract() async {
+    addTestFile(r'''
+abstract class C<T> {
+  C(T a);
+  C.named(T a);
+  C.named2();
+}
+var a = 0;
+var b = true;
+main() {
+  new C(a);
+  new C.named(b);
+  new C<double>.named2();
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var c = findElement.class_('C');
+
+    {
+      var creation = findNode.instanceCreation('new C(a)');
+      assertType(creation, 'C<int>');
+
+      ConstructorName constructorName = creation.constructorName;
+      expect(constructorName.name, isNull);
+
+      TypeName type = constructorName.type;
+      expect(type.typeArguments, isNull);
+      assertElement(type.name, c);
+      assertType(type.name, useCFE ? 'C<int>' : 'C<dynamic>');
+
+      SimpleIdentifier aRef = creation.argumentList.arguments[0];
+      assertElement(aRef, findElement.topGet('a'));
+      assertType(aRef, 'int');
+    }
+
+    {
+      var creation = findNode.instanceCreation('new C.named(b)');
+      assertType(creation, 'C<bool>');
+
+      ConstructorName constructorName = creation.constructorName;
+      expect(constructorName.name.name, 'named');
+
+      TypeName type = constructorName.type;
+      expect(type.typeArguments, isNull);
+      assertElement(type.name, c);
+      assertType(type.name, useCFE ? 'C<bool>' : 'C<dynamic>');
+
+      SimpleIdentifier bRef = creation.argumentList.arguments[0];
+      assertElement(bRef, findElement.topGet('b'));
+      assertType(bRef, 'bool');
+    }
+
+    {
+      var creation = findNode.instanceCreation('new C<double>.named2()');
+      assertType(creation, 'C<double>');
+
+      ConstructorName constructorName = creation.constructorName;
+      expect(constructorName.name.name, 'named2');
+
+      TypeName type = constructorName.type;
+      assertTypeArguments(type.typeArguments, [doubleType]);
+      assertElement(type.name, c);
+      assertType(type.name, 'C<double>');
+    }
+  }
+
   test_invalid_methodInvocation_simpleIdentifier() async {
     addTestFile(r'''
 int foo = 0;
@@ -7368,6 +7566,21 @@
     expect(invocation.staticInvokeType, isDynamicType);
   }
 
+  test_unresolved_static_call_arguments() async {
+    addTestFile('''
+int x;
+class C {
+  static f() => C.g(x);
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var x = findNode.simple('x)');
+    assertElement(x, findElement.topGet('x'));
+    assertType(x, 'int');
+  }
+
   test_unresolved_static_call_same_name_as_type_param() async {
     addTestFile('''
 class C<T> {
@@ -7385,6 +7598,20 @@
     expect(invocation.staticInvokeType, isDynamicType);
   }
 
+  test_unresolved_static_call_type_arguments() async {
+    addTestFile('''
+class C {
+  static f() => C.g<int>();
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+
+    var intRef = findNode.simple('int>');
+    assertElement(intRef, intType.element);
+    assertType(intRef, 'int');
+  }
+
   /// Assert that the [argument] is associated with the [expectedParameter],
   /// if [useCFE] is `null`. If the [argument] is a [NamedExpression],
   /// the name must be resolved to the parameter in both cases.
@@ -7523,6 +7750,15 @@
 
   CompilationUnitElement get unitElement => result.unit.element;
 
+  ClassElement class_(String name) {
+    for (var class_ in unitElement.types) {
+      if (class_.name == name) {
+        return class_;
+      }
+    }
+    fail('Not found class: $name');
+  }
+
   FieldElement field(String name) {
     for (var type in unitElement.types) {
       for (var field in type.fields) {
@@ -7609,6 +7845,10 @@
 
   FindNode(this.result);
 
+  LibraryDirective get libraryDirective {
+    return result.unit.directives.singleWhere((d) => d is LibraryDirective);
+  }
+
   AssignmentExpression assignment(String search) {
     return _node(search).getAncestor((n) => n is AssignmentExpression);
   }
@@ -7617,10 +7857,18 @@
     return _node(search).getAncestor((n) => n is CascadeExpression);
   }
 
+  ExportDirective export(String search) {
+    return _node(search).getAncestor((n) => n is ExportDirective);
+  }
+
   FunctionExpression functionExpression(String search) {
     return _node(search).getAncestor((n) => n is FunctionExpression);
   }
 
+  ImportDirective import(String search) {
+    return _node(search).getAncestor((n) => n is ImportDirective);
+  }
+
   InstanceCreationExpression instanceCreation(String search) {
     return _node(search).getAncestor((n) => n is InstanceCreationExpression);
   }
@@ -7629,6 +7877,14 @@
     return _node(search).getAncestor((n) => n is MethodInvocation);
   }
 
+  PartDirective part(String search) {
+    return _node(search).getAncestor((n) => n is PartDirective);
+  }
+
+  PartOfDirective partOf(String search) {
+    return _node(search).getAncestor((n) => n is PartOfDirective);
+  }
+
   PostfixExpression postfix(String search) {
     return _node(search).getAncestor((n) => n is PostfixExpression);
   }
@@ -7641,6 +7897,10 @@
     return _node(search);
   }
 
+  SimpleFormalParameter simpleParameter(String search) {
+    return _node(search).getAncestor((n) => n is SimpleFormalParameter);
+  }
+
   VariableDeclaration variableDeclaration(String search) {
     return _node(search).getAncestor((n) => n is VariableDeclaration);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 5212d5e..7f9f886 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -82,7 +82,7 @@
             [new DartUriResolver(sdk), new ResourceUriResolver(provider)],
             null,
             provider),
-        new AnalysisOptionsImpl()..strongMode = true);
+        new AnalysisOptionsImpl());
     driver.results.forEach(allResults.add);
     return driver;
   }
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 3a84319..990c2f8 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -57,8 +57,7 @@
       }),
       new ResourceUriResolver(provider)
     ], null, provider);
-    AnalysisOptions analysisOptions = new AnalysisOptionsImpl()
-      ..strongMode = true;
+    AnalysisOptions analysisOptions = new AnalysisOptionsImpl();
     fileSystemState = new FileSystemState(logger, byteStore, contentOverlay,
         provider, sourceFactory, analysisOptions, new Uint32List(0));
   }
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 1a930e5..a987bef 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_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.
 
-library analyzer.test.constant_test;
+library analyzer.test.evaluation_test;
 
 import 'dart:async';
 
@@ -1705,6 +1705,6 @@
 class StrongConstantValueComputerTest extends ConstantValueComputerTest {
   void setUp() {
     super.setUp();
-    resetWith(options: new AnalysisOptionsImpl()..strongMode = true);
+    reset();
   }
 }
diff --git a/pkg/analyzer/test/src/dart/sdk/patch_test.dart b/pkg/analyzer/test/src/dart/sdk/patch_test.dart
index f45c9fd..e6f1c71 100644
--- a/pkg/analyzer/test/src/dart/sdk/patch_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/patch_test.dart
@@ -1054,7 +1054,7 @@
 
   void _createSdk() {
     sdk = new FolderBasedDartSdk(provider, sdkFolder);
-    sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
+    sdk.analysisOptions = new AnalysisOptionsImpl();
   }
 
   CompilationUnit _doTopLevelPatching(String baseCode, String patchCode) {
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index 74633e6..7f1a7c5 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -67,22 +67,6 @@
     expect(sdk.getLinkedBundle(), isNull);
   }
 
-  void test_getLinkedBundle_spec() {
-    pathTranslator.newFileWithBytes('$foxPath/spec.sum',
-        new PackageBundleAssembler().assemble().toBuffer());
-    EmbedderYamlLocator locator = new EmbedderYamlLocator({
-      'fox': <Folder>[pathTranslator.getResource(foxLib)]
-    });
-    EmbedderSdk sdk = new EmbedderSdk(resourceProvider, locator.embedderYamls);
-    sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = false;
-    sdk.useSummary = true;
-    if (sdk.analysisOptions.previewDart2) {
-      expect(sdk.getLinkedBundle(), isNull);
-    } else {
-      expect(sdk.getLinkedBundle(), isNotNull);
-    }
-  }
-
   void test_getLinkedBundle_strong() {
     pathTranslator.newFileWithBytes('$foxPath/strong.sum',
         new PackageBundleAssembler().assemble().toBuffer());
@@ -90,7 +74,7 @@
       'fox': <Folder>[pathTranslator.getResource(foxLib)]
     });
     EmbedderSdk sdk = new EmbedderSdk(resourceProvider, locator.embedderYamls);
-    sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
+    sdk.analysisOptions = new AnalysisOptionsImpl();
     sdk.useSummary = true;
     expect(sdk.getLinkedBundle(), isNotNull);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/parameter_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/parameter_test.dart
index ba995b5..7298a30 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/parameter_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/parameter_test.dart
@@ -24,6 +24,21 @@
           'f(Function(void) _s_) {}',
           failing: ['eof'],
         ),
+        new TestDescriptor(
+          'typeArgument_noGt',
+          '''
+          class C<E> {}
+          f(C<int Function(int, int) c) {}
+          ''',
+          [
+            ScannerErrorCode.EXPECTED_TOKEN,
+          ],
+          '''
+          class C<E> {}
+          f(C<int Function(int, int)> c) {}
+          ''',
+          failing: ['eof'],
+        ),
       ],
       [],
     );
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index f4eb228..f841d78 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -53,6 +53,25 @@
     validator = new PubspecValidator(resourceProvider, source);
   }
 
+  test_assetDirectoryDoesExists_noError() {
+    newFolder('/sample/assets/logos');
+    assertNoErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/logos/
+''');
+  }
+
+  test_assetDirectoryDoesNotExist_error() {
+    assertErrors('''
+name: sample
+flutter:
+  assets:
+    - assets/logos/
+''', [PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST]);
+  }
+
   test_assetDoesNotExist_path_error() {
     assertErrors('''
 name: sample
@@ -159,44 +178,10 @@
 ''');
   }
 
-  test_assetDirectoryDoesNotExist_error() {
-    assertErrors('''
-name: sample
-flutter:
-  assets:
-    - assets/logos/
-''', [PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST]);
-  }
-
-  test_assetDirectoryDoesExists_noError() {
-    newFolder('/sample/assets/logos');
+  test_dependenciesField_empty() {
     assertNoErrors('''
 name: sample
-flutter:
-  assets:
-    - assets/logos/
-''');
-  }
-
-  test_dependenciesFieldNotMap_dev_error_bool() {
-    assertErrors('''
-name: sample
-dev_dependencies: true
-''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
-  }
-
-  test_dependenciesFieldNotMap_dev_error_empty() {
-    assertErrors('''
-name: sample
-dev_dependencies:
-''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
-  }
-
-  test_dependenciesFieldNotMap_dev_noError() {
-    assertNoErrors('''
-name: sample
-dev_dependencies:
-  a: any
+dependencies:
 ''');
   }
 
@@ -207,13 +192,6 @@
 ''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
   }
 
-  test_dependenciesFieldNotMap_error_empty() {
-    assertErrors('''
-name: sample
-dependencies:
-''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
-  }
-
   test_dependenciesFieldNotMap_noError() {
     assertNoErrors('''
 name: sample
@@ -222,11 +200,26 @@
 ''');
   }
 
-  test_flutterFieldNotMap_error_bool() {
+  test_devDependenciesField_empty() {
+    assertNoErrors('''
+name: sample
+dev_dependencies:
+''');
+  }
+
+  test_devDependenciesFieldNotMap_dev_error_bool() {
     assertErrors('''
 name: sample
-flutter: true
-''', [PubspecWarningCode.FLUTTER_FIELD_NOT_MAP]);
+dev_dependencies: true
+''', [PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP]);
+  }
+
+  test_devDependenciesFieldNotMap_dev_noError() {
+    assertNoErrors('''
+name: sample
+dev_dependencies:
+  a: any
+''');
   }
 
   test_flutterField_empty_noError() {
@@ -242,6 +235,13 @@
 ''');
   }
 
+  test_flutterFieldNotMap_error_bool() {
+    assertErrors('''
+name: sample
+flutter: true
+''', [PubspecWarningCode.FLUTTER_FIELD_NOT_MAP]);
+  }
+
   test_flutterFieldNotMap_noError() {
     newFile('/sample/assets/my_icon.png');
     assertNoErrors('''
diff --git a/pkg/analyzer/test/src/summary/expr_builder_test.dart b/pkg/analyzer/test/src/summary/expr_builder_test.dart
index 0dedca8..4c755b9 100644
--- a/pkg/analyzer/test/src/summary/expr_builder_test.dart
+++ b/pkg/analyzer/test/src/summary/expr_builder_test.dart
@@ -446,10 +446,12 @@
     checkSimpleExpression('({x}) => 0');
   }
 
+  @failingTest
   void test_pushLocalFunctionReference_nested() {
-    prepareAnalysisContext(new AnalysisOptionsImpl()
-      ..previewDart2 = false
-      ..strongMode = false);
+    // TODO(devoncarew): This test fails when run in strong mode.
+    // Failed assertion: line 5116 pos 16:
+    //   'Linker._initializerTypeInferenceCycle == null': is not true.
+    prepareAnalysisContext(new AnalysisOptionsImpl()..previewDart2 = false);
     var expr =
         checkSimpleExpression('(x) => (y) => x + y') as FunctionExpression;
     var outerFunctionElement = expr.element;
@@ -470,10 +472,10 @@
     expect(yRef.staticElement, same(yElement));
   }
 
+  @failingTest
   void test_pushLocalFunctionReference_paramReference() {
-    prepareAnalysisContext(new AnalysisOptionsImpl()
-      ..previewDart2 = false
-      ..strongMode = false);
+    // TODO(devoncarew): This test fails when run in strong mode.
+    prepareAnalysisContext(new AnalysisOptionsImpl()..previewDart2 = false);
     var expr = checkSimpleExpression('(x, y) => x + y') as FunctionExpression;
     var localFunctionElement = expr.element;
     var xElement = localFunctionElement.parameters[0];
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index 891b523..521c002 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -32,7 +32,6 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ResynthesizeAstSpecTest);
     defineReflectiveTests(ResynthesizeAstStrongTest);
     defineReflectiveTests(ApplyCheckElementTextReplacements);
   });
@@ -171,16 +170,7 @@
 }
 
 @reflectiveTest
-class ResynthesizeAstSpecTest extends _ResynthesizeAstTest {
-  @override
-  bool get isStrongMode => false;
-}
-
-@reflectiveTest
 class ResynthesizeAstStrongTest extends _ResynthesizeAstTest {
-  @override
-  bool get isStrongMode => true;
-
   @failingTest // See dartbug.com/32290
   test_const_constructor_inferred_args() =>
       super.test_const_constructor_inferred_args();
@@ -273,13 +263,9 @@
   @override
   AnalysisOptionsImpl createOptions() {
     if (isStrongMode) {
-      return super.createOptions()
-        ..previewDart2 = true
-        ..strongMode = true;
+      return super.createOptions()..previewDart2 = true;
     } else {
-      return super.createOptions()
-        ..previewDart2 = false
-        ..strongMode = false;
+      return super.createOptions()..previewDart2 = false;
     }
   }
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 251e729..d8994bb 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -73,8 +73,10 @@
 
   /**
    * Return `true` if resynthesizing should be done in strong mode.
+   *
+   * Deprecated - remove this getter.
    */
-  bool get isStrongMode;
+  bool get isStrongMode => true;
 
   void addLibrary(String uri) {
     otherLibrarySources.add(context.sourceFactory.forUri(uri));
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 86116af..2625f04 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -228,6 +228,13 @@
     await super.test_parameter_checked_inherited();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
+  test_parts_invalidUri() async {
+    await super.test_parts_invalidUri();
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   test_setter_inferred_type_conflictingInheritance() async {
@@ -246,10 +253,31 @@
     await super.test_unresolved_annotation_instanceCreation_argument_super();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
+  test_unresolved_export() async {
+    await super.test_unresolved_export();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
+  test_unresolved_import() async {
+    await super.test_unresolved_import();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33719')
+  test_unresolved_part() async {
+    await super.test_unresolved_part();
+  }
+
   Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
     var logger = new PerformanceLog(null);
     var byteStore = new MemoryByteStore();
-    var analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
+    var analysisOptions = new AnalysisOptionsImpl();
 
     var fsState = new FileSystemState(
         logger,
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index d86e01e..3b90871 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -83,24 +83,18 @@
     new TypeMatcher<BuildDirectiveElementsTask>();
 final isBuildEnumMemberElementsTask =
     new TypeMatcher<BuildEnumMemberElementsTask>();
-final isBuildExportNamespaceTask =
-    new TypeMatcher<BuildExportNamespaceTask>();
-final isBuildLibraryElementTask =
-    new TypeMatcher<BuildLibraryElementTask>();
-final isBuildPublicNamespaceTask =
-    new TypeMatcher<BuildPublicNamespaceTask>();
+final isBuildExportNamespaceTask = new TypeMatcher<BuildExportNamespaceTask>();
+final isBuildLibraryElementTask = new TypeMatcher<BuildLibraryElementTask>();
+final isBuildPublicNamespaceTask = new TypeMatcher<BuildPublicNamespaceTask>();
 final isBuildSourceExportClosureTask =
     new TypeMatcher<BuildSourceExportClosureTask>();
-final isBuildTypeProviderTask =
-    new TypeMatcher<BuildTypeProviderTask>();
+final isBuildTypeProviderTask = new TypeMatcher<BuildTypeProviderTask>();
 final isComputeConstantDependenciesTask =
     new TypeMatcher<ComputeConstantDependenciesTask>();
-final isComputeConstantValueTask =
-    new TypeMatcher<ComputeConstantValueTask>();
+final isComputeConstantValueTask = new TypeMatcher<ComputeConstantValueTask>();
 final isComputeInferableStaticVariableDependenciesTask =
     new TypeMatcher<ComputeInferableStaticVariableDependenciesTask>();
-final isContainingLibrariesTask =
-    new TypeMatcher<ContainingLibrariesTask>();
+final isContainingLibrariesTask = new TypeMatcher<ContainingLibrariesTask>();
 final isDartErrorsTask = new TypeMatcher<DartErrorsTask>();
 final isEvaluateUnitConstantsTask =
     new TypeMatcher<EvaluateUnitConstantsTask>();
@@ -116,10 +110,8 @@
     new TypeMatcher<InferStaticVariableTypesInUnitTask>();
 final isInferStaticVariableTypeTask =
     new TypeMatcher<InferStaticVariableTypeTask>();
-final isLibraryErrorsReadyTask =
-    new TypeMatcher<LibraryErrorsReadyTask>();
-final isLibraryUnitErrorsTask =
-    new TypeMatcher<LibraryUnitErrorsTask>();
+final isLibraryErrorsReadyTask = new TypeMatcher<LibraryErrorsReadyTask>();
+final isLibraryUnitErrorsTask = new TypeMatcher<LibraryUnitErrorsTask>();
 final isParseDartTask = new TypeMatcher<ParseDartTask>();
 final isPartiallyResolveUnitReferencesTask =
     new TypeMatcher<PartiallyResolveUnitReferencesTask>();
@@ -133,13 +125,11 @@
 final isResolveTopLevelUnitTypeBoundsTask =
     new TypeMatcher<ResolveTopLevelUnitTypeBoundsTask>();
 final isResolveUnitTask = new TypeMatcher<ResolveUnitTask>();
-final isResolveUnitTypeNamesTask =
-    new TypeMatcher<ResolveUnitTypeNamesTask>();
+final isResolveUnitTypeNamesTask = new TypeMatcher<ResolveUnitTypeNamesTask>();
 final isResolveVariableReferencesTask =
     new TypeMatcher<ResolveVariableReferencesTask>();
 final isScanDartTask = new TypeMatcher<ScanDartTask>();
-final isStrongModeVerifyUnitTask =
-    new TypeMatcher<StrongModeVerifyUnitTask>();
+final isStrongModeVerifyUnitTask = new TypeMatcher<StrongModeVerifyUnitTask>();
 final isVerifyUnitTask = new TypeMatcher<VerifyUnitTask>();
 
 final LintCode _testLintCode = new LintCode('test lint', 'test lint code');
@@ -1455,7 +1445,6 @@
   void setUp() {
     super.setUp();
     // Variable dependencies are only available in strong mode.
-    enableStrongMode();
   }
 
   test_created_resolved_unit() {
@@ -1510,14 +1499,7 @@
     return outputs[LIBRARY_CYCLE_UNITS] as List<LibrarySpecificUnit>;
   }
 
-  @override
-  void setUp() {
-    super.setUp();
-    enableStrongMode();
-  }
-
   void test_library_cycle_incremental() {
-    enableStrongMode();
     Source a = newSource('/a.dart', '''
 library a;
 ''');
@@ -1561,7 +1543,6 @@
   }
 
   void test_library_cycle_incremental_partial() {
-    enableStrongMode();
     Source a = newSource('/a.dart', r'''
 library a;
 ''');
@@ -1595,7 +1576,6 @@
   }
 
   void test_library_cycle_incremental_partial2() {
-    enableStrongMode();
     Source a = newSource('/a.dart', r'''
 library a;
 import 'b.dart';
@@ -1695,7 +1675,6 @@
   }
 
   void test_library_cycle_override_inference_incremental() {
-    enableStrongMode();
     Source lib1Source = newSource('/my_lib1.dart', '''
 library my_lib1;
 import 'my_lib3.dart';
@@ -2465,6 +2444,7 @@
 
 class GenerateLintsTaskTest_AstVisitor extends SimpleAstVisitor {
   Linter linter;
+
   GenerateLintsTaskTest_AstVisitor(this.linter);
 
   @override
@@ -2498,7 +2478,6 @@
   }
 
   void test_perform() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 class A {
   X f;
@@ -2540,7 +2519,6 @@
   }
 
   void test_perform_cross_library_const() {
-    enableStrongMode();
     AnalysisTarget firstSource = newSource('/first.dart', '''
 library first;
 
@@ -2581,7 +2559,6 @@
   }
 
   void test_perform_reresolution() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 const topLevel = '';
 class C {
@@ -2606,12 +2583,6 @@
 
 @reflectiveTest
 class InferStaticVariableTypesInUnitTaskTest extends _AbstractDartTaskTest {
-  @override
-  void setUp() {
-    super.setUp();
-    enableStrongMode();
-  }
-
   test_created_resolved_unit() {
     Source source = newSource('/test.dart', r'''
 library lib;
@@ -2624,7 +2595,6 @@
   }
 
   void test_perform_const_field() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 class M {
   static const X = "";
@@ -2650,7 +2620,6 @@
   }
 
   void test_perform_nestedDeclarations() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 var f = (int x) {
   int squared(int value) => value * value;
@@ -2663,7 +2632,6 @@
   }
 
   void test_perform_recursive() {
-    enableStrongMode();
     AnalysisTarget firstSource = newSource('/first.dart', '''
 import 'second.dart';
 
@@ -2705,7 +2673,6 @@
   }
 
   void test_perform_simple() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 var X = 1;
 var Y = () => 1 + X;
@@ -2775,7 +2742,6 @@
   }
 
   void test_perform() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test3.dart', '''
 var topLevel3 = '';
 class C {
@@ -2800,7 +2766,6 @@
   }
 
   void test_perform_const() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 const topLevel = "hello";
 class C {
@@ -2822,7 +2787,6 @@
   }
 
   void test_perform_cycle() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 var piFirst = true;
 var pi = piFirst ? 3.14 : tau / 2;
@@ -2845,7 +2809,6 @@
   }
 
   void test_perform_error() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 var a = '' / null;
 ''');
@@ -2860,7 +2823,6 @@
   }
 
   void test_perform_null() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 var a = null;
 ''');
@@ -3251,7 +3213,6 @@
   }
 
   test_perform_strong_inferable() {
-    enableStrongMode();
     Source source = newSource('/test.dart', '''
 int a = b;
 int b = c;
@@ -3282,7 +3243,6 @@
   }
 
   test_perform_strong_notResolved() {
-    enableStrongMode();
     Source source = newSource('/test.dart', '''
 int A;
 f1() {
@@ -3399,12 +3359,6 @@
 
 @reflectiveTest
 class ResolveInstanceFieldsInUnitTaskTest extends _AbstractDartTaskTest {
-  @override
-  void setUp() {
-    super.setUp();
-    enableStrongMode();
-  }
-
   test_created_resolved_unit() {
     Source source = newSource('/test.dart', r'''
 library lib;
@@ -4179,12 +4133,6 @@
 
 @reflectiveTest
 class StrongModeInferenceTest extends _AbstractDartTaskTest {
-  @override
-  void setUp() {
-    super.setUp();
-    enableStrongMode();
-  }
-
   // Check that even within a static variable cycle, inferred
   // types get propagated to the members of the cycle.
   void test_perform_cycle() {
@@ -4201,8 +4149,7 @@
         AstFinder.getTopLevelVariable(unit, 'pi').name.staticElement;
     VariableElement tau =
         AstFinder.getTopLevelVariable(unit, 'tau').name.staticElement;
-    Expression piFirstUse = (AstFinder
-            .getTopLevelVariable(unit, 'tau')
+    Expression piFirstUse = (AstFinder.getTopLevelVariable(unit, 'tau')
             .initializer as ConditionalExpression)
         .condition;
 
@@ -4653,12 +4600,6 @@
 
 @reflectiveTest
 class StrongModeVerifyUnitTaskTest extends _AbstractDartTaskTest {
-  @override
-  void setUp() {
-    super.setUp();
-    enableStrongMode();
-  }
-
   test_created_resolved_unit() {
     Source source = newSource('/test.dart', r'''
 library lib;
@@ -4671,7 +4612,6 @@
   }
 
   void test_perform_recordDynamicInvoke() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 void main() {
   dynamic a = [];
@@ -4693,7 +4633,6 @@
   }
 
   void test_perform_verifyError() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 class A {}
 class B extends A {}
@@ -4831,7 +4770,6 @@
   }
 
   void test_perform_reresolution() {
-    enableStrongMode();
     AnalysisTarget source = newSource('/test.dart', '''
 const topLevel = 3;
 class C {
@@ -4951,15 +4889,6 @@
         source, [new ScriptFragment(97, 5, 36, scriptContent)]);
   }
 
-  /**
-   * Enable strong mode in the current analysis context.
-   */
-  void enableStrongMode() {
-    AnalysisOptionsImpl options = context.analysisOptions;
-    options.strongMode = true;
-    context.analysisOptions = options;
-  }
-
   void setUp() {
     super.setUp();
     emptySource = newSource('/test.dart');
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 21b6a46..716161d 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -52,14 +52,12 @@
       optionsProvider.getOptionsFromString(source);
 
   test_configure_bad_options_contents() {
-    (analysisOptions as AnalysisOptionsImpl)
-      ..previewDart2 = false
-      ..strongMode = false;
     configureContext('''
 analyzer:
-  strong-mode:true # misformatted
+  language:
+    enableSuperMixins true; # misformatted
 ''');
-    expect(analysisOptions.strongMode, false);
+    expect(analysisOptions.enableSuperMixins, false);
   }
 
   test_configure_enableSuperMixins() {
@@ -158,14 +156,12 @@
   }
 
   test_configure_strong_mode_bad_value() {
-    (analysisOptions as AnalysisOptionsImpl)
-      ..previewDart2 = false
-      ..strongMode = false;
     configureContext('''
 analyzer:
-  strong-mode: foo
+  language:
+    enableSuperMixins: true;
 ''');
-    expect(analysisOptions.strongMode, false);
+    expect(analysisOptions.enableSuperMixins, false);
   }
 }
 
@@ -292,9 +288,8 @@
   ErrorProcessorMatcher(this.required);
 
   @override
-  Description describe(Description desc) =>
-      desc..add("an ErrorProcessor setting ${required.code} to ${required
-            .severity}");
+  Description describe(Description desc) => desc
+    ..add("an ErrorProcessor setting ${required.code} to ${required.severity}");
 
   @override
   bool matches(dynamic o, Map<dynamic, dynamic> options) {
diff --git a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
index 33108c9..ebfa63b 100644
--- a/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
+++ b/pkg/analyzer/test/src/task/strong/dart2_inference_test.dart
@@ -27,8 +27,7 @@
 @reflectiveTest
 class Dart2InferenceTest extends ResolverTestCase {
   @override
-  AnalysisOptions get defaultAnalysisOptions =>
-      new AnalysisOptionsImpl()..strongMode = true;
+  AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
   @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 bd0f90a..283c2ce 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -289,7 +289,6 @@
     expect(mainFile.exists, true, reason: '`/main.dart` is missing');
 
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
-    analysisOptions.strongMode = true;
     analysisOptions.strongModeHints = true;
     analysisOptions.declarationCasts = declarationCasts;
     analysisOptions.implicitCasts = implicitCasts;
diff --git a/pkg/analyzer/tool/analyzer_cfe_progress.dart b/pkg/analyzer/tool/analyzer_cfe_progress.dart
index 27577db..efd525f 100644
--- a/pkg/analyzer/tool/analyzer_cfe_progress.dart
+++ b/pkg/analyzer/tool/analyzer_cfe_progress.dart
@@ -101,22 +101,41 @@
   }
 
   // Also count the Fasta '-DuseFastaParser=true' tests.
-  print('\nuseFastaParser=true failures from pkg/pkg.status');
+  print('\n--use-fasta-parser excusions from status files');
 
-  io.File file = new io.File('pkg/pkg.status');
+  int testExclusions = 0;
+
+  // pkg/pkg.status:
+  //   [ $builder_tag == analyzer_use_fasta && $runtime == vm ]
+  testExclusions += countExclusions('pkg/pkg.status',
+      r'[ $builder_tag == analyzer_use_fasta && $runtime == vm ]');
+
+  // tests/language_2/language_2_analyzer.status:
+  //   [ $compiler == dart2analyzer && $analyzer_use_fasta_parser ]
+  testExclusions += countExclusions(
+      'tests/language_2/language_2_analyzer.status',
+      r'[ $compiler == dart2analyzer && $analyzer_use_fasta_parser ]');
+
+  print('  $testExclusions failing tests');
+}
+
+int countExclusions(String filePath, String exclusionHeader) {
+  io.File file = new io.File(filePath);
   List<String> lines = file.readAsLinesSync();
   lines = lines
       .where((line) => line.trim().isNotEmpty && !line.trim().startsWith('#'))
       .toList();
 
-  int index = lines
-      .indexOf(r'[ $builder_tag == analyzer_use_fasta && $runtime == vm ]');
+  int index = lines.indexOf(exclusionHeader);
   if (index == -1) {
     print('error parsing ${file.path}');
   }
 
   lines = lines.sublist(index + 1);
-  lines = lines.sublist(0, lines.indexWhere((line) => line.startsWith('[')));
+  int endIndex = lines.indexWhere((line) => line.startsWith('['));
+  if (endIndex >= 0) {
+    lines = lines.sublist(0, endIndex);
+  }
 
-  print('  ${lines.length} failing tests');
+  return lines.length;
 }
diff --git a/pkg/analyzer/tool/test_log_parser/test_log_parser.dart b/pkg/analyzer/tool/test_log_parser/test_log_parser.dart
index 18a5cc9..42ff3bd 100644
--- a/pkg/analyzer/tool/test_log_parser/test_log_parser.dart
+++ b/pkg/analyzer/tool/test_log_parser/test_log_parser.dart
@@ -20,6 +20,8 @@
   TestResult currentResult;
   Map<String, List<TestResult>> testsByExpectedAndActual =
       <String, List<TestResult>>{};
+  Map<String, List<TestResult>> testsByStackTrace =
+      <String, List<TestResult>>{};
   while (index < output.length) {
     String currentLine = output[index];
     if (currentLine.startsWith('FAILED:')) {
@@ -49,6 +51,10 @@
         }
         if (hasStackTrace) {
           currentResult.stackTrace = output.sublist(index + 1, endIndex - 2);
+          String traceLine = currentResult.traceLine;
+          testsByStackTrace
+              .putIfAbsent(traceLine, () => <TestResult>[])
+              .add(currentResult);
         }
         index = endIndex;
       }
@@ -93,10 +99,19 @@
       print('  $message');
     }
   }
+  if (testsByStackTrace.isNotEmpty) {
+    print('');
+    print('Unique stack traces (${testsByStackTrace.length}):');
+    for (String traceLine in testsByStackTrace.keys) {
+      print('  $traceLine');
+    }
+  }
 }
 
 /// A representation of the result of a single test.
 class TestResult {
+  static final RegExp framePattern = new RegExp('#[0-9]+ ');
+
   String testName;
   String expected;
   String actual;
@@ -104,4 +119,15 @@
   List<String> stackTrace;
 
   TestResult(this.testName, this.expected, this.actual);
+
+  String get traceLine {
+    for (int i = 0; i < stackTrace.length; i++) {
+      String traceLine = stackTrace[i];
+      if (traceLine.startsWith(framePattern) &&
+          traceLine.contains('(package:')) {
+        return traceLine;
+      }
+    }
+    return null;
+  }
 }
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index 11ec5f0..ed0e892 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -97,7 +97,6 @@
     contextOptions.generateSdkErrors = clOptions.showSdkWarnings;
     contextOptions.previewDart2 = clOptions.previewDart2;
     contextOptions.useFastaParser = clOptions.useFastaParser;
-    contextOptions.strongMode = clOptions.strongMode;
     if (clOptions.useCFE) {
       contextOptions.useFastaParser = true;
     }
diff --git a/pkg/analyzer_cli/lib/src/error_severity.dart b/pkg/analyzer_cli/lib/src/error_severity.dart
index 79a2111..71a2d7a 100644
--- a/pkg/analyzer_cli/lib/src/error_severity.dart
+++ b/pkg/analyzer_cli/lib/src/error_severity.dart
@@ -26,10 +26,7 @@
     }
   }
 
-  if (!commandLineOptions.enableTypeChecks &&
-      error.errorCode.type == ErrorType.CHECKED_MODE_COMPILE_TIME_ERROR) {
-    return ErrorSeverity.INFO;
-  } else if (commandLineOptions.lintsAreFatal && error.errorCode is LintCode) {
+  if (commandLineOptions.lintsAreFatal && error.errorCode is LintCode) {
     return ErrorSeverity.ERROR;
   }
 
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index d0521d3..9f3ffd2 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -91,10 +91,6 @@
   /// Whether to display version information
   final bool displayVersion;
 
-  /// Whether to treat type mismatches found during constant evaluation as
-  /// errors.
-  final bool enableTypeChecks;
-
   /// Whether to ignore unrecognized flags
   final bool ignoreUnrecognizedFlags;
 
@@ -142,7 +138,9 @@
   final bool infosAreFatal;
 
   /// Whether to use strong static checking.
-  final bool strongMode;
+  ///
+  /// This flag is deprecated and hard-coded to `true`.
+  final bool strongMode = true;
 
   /// Whether implicit casts are enabled (in strong mode)
   final bool implicitCasts;
@@ -183,7 +181,6 @@
         disableCacheFlushing = args['disable-cache-flushing'],
         disableHints = args['no-hints'],
         displayVersion = args['version'],
-        enableTypeChecks = args['enable_type_checks'],
         ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'],
         lints = args[lintsFlag],
         log = args['log'],
@@ -202,7 +199,6 @@
         infosAreFatal = args['fatal-infos'] || args['fatal-hints'],
         warningsAreFatal = args['fatal-warnings'],
         lintsAreFatal = args['fatal-lints'],
-        strongMode = args['strong'],
         implicitCasts = args[implicitCastsFlag],
         implicitDynamic = !args['no-implicit-dynamic'],
         verbose = args['verbose'],
@@ -470,10 +466,10 @@
           negatable: false,
           hide: hide)
       ..addFlag('enable_type_checks',
-          help: 'Check types in constant evaluation.',
+          help: 'Check types in constant evaluation (deprecated).',
           defaultsTo: false,
           negatable: false,
-          hide: hide)
+          hide: true)
       // TODO(brianwilkerson) Remove the following option after we're sure that
       // it's no longer being used.
       ..addFlag('enable-assert-initializers',
@@ -589,6 +585,13 @@
           return null; // Only reachable in testing.
         }
       }
+
+      if (results.wasParsed('strong')) {
+        errorSink.writeln(
+            'Note: the --strong flag is deprecated and will be removed in an '
+            'future release.\n');
+      }
+
       return new CommandLineOptions._fromArgs(results);
     } on FormatException catch (e) {
       errorSink.writeln(e.message);
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 6619bc3..e832287 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -245,7 +245,6 @@
       await new Driver(isTesting: true).start([
         '--dart-sdk',
         _findSdkDirForSummaries(),
-        '--strong',
         '--build-mode',
         '--build-summary-unlinked-input=$aUnlinked,$bUnlinked',
         '--build-summary-output=$abLinked'
@@ -372,7 +371,6 @@
 
       await _doDrive(testDart,
           additionalArgs: [
-            '--strong',
             '--build-summary-only',
             '--build-summary-output=$testSum'
           ],
@@ -959,7 +957,7 @@
 
   test_strongSdk() async {
     String testDir = path.join(testDirectory, 'data', 'strong_sdk');
-    await drive(path.join(testDir, 'main.dart'), args: ['--strong']);
+    await drive(path.join(testDir, 'main.dart'));
     expect(analysisOptions.strongMode, isTrue);
     expect(outSink.toString(), contains('No issues found'));
   }
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 4ffddfe..52e576e 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -61,7 +61,6 @@
         expect(options.lints, isFalse);
         expect(options.displayVersion, isFalse);
         expect(options.enableSuperMixins, isFalse);
-        expect(options.enableTypeChecks, isFalse);
         expect(options.infosAreFatal, isFalse);
         expect(options.ignoreUnrecognizedFlags, isFalse);
         expect(options.log, isFalse);
@@ -103,12 +102,6 @@
         expect(options.enableSuperMixins, isTrue);
       });
 
-      test('enable type checks', () {
-        CommandLineOptions options = CommandLineOptions
-            .parse(['--dart-sdk', '.', '--enable_type_checks', 'foo.dart']);
-        expect(options.enableTypeChecks, isTrue);
-      });
-
       test('hintsAreFatal', () {
         CommandLineOptions options = CommandLineOptions
             .parse(['--dart-sdk', '.', '--fatal-hints', 'foo.dart']);
@@ -195,12 +188,6 @@
         expect(options.sourceFiles, equals(['foo.dart']));
       });
 
-      test('strong mode', () {
-        CommandLineOptions options =
-            CommandLineOptions.parse(['--strong', 'foo.dart']);
-        expect(options.strongMode, isTrue);
-      });
-
       test('hintsAreFatal', () {
         CommandLineOptions options = CommandLineOptions
             .parse(['--dart-sdk', '.', '--fatal-lints', 'foo.dart']);
diff --git a/pkg/analyzer_cli/test/strong_mode_test.dart b/pkg/analyzer_cli/test/strong_mode_test.dart
index 51c647c..30f7815 100644
--- a/pkg/analyzer_cli/test/strong_mode_test.dart
+++ b/pkg/analyzer_cli/test/strong_mode_test.dart
@@ -16,7 +16,7 @@
   defineReflectiveTests(StrongModeTest);
 }
 
-/// End-to-end test for --strong checking.
+/// End-to-end test for strong checking.
 ///
 /// Most strong mode tests are in Analyzer, but this verifies the option is
 /// working and producing extra errors as expected.
@@ -26,7 +26,7 @@
 @reflectiveTest
 class StrongModeTest extends BaseTest {
   test_producesStricterErrors() async {
-    await drive('data/strong_example.dart', args: ['--strong']);
+    await drive('data/strong_example.dart');
 
     expect(exitCode, 3);
     var stdout = bulletToDash(outSink);
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index d5fc4db..361b9f8 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -137,7 +137,6 @@
     PerformanceLog log = new PerformanceLog(_logBuffer);
     AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
     AnalysisOptionsImpl options = new AnalysisOptionsImpl()
-      ..strongMode = enableStrongMode
       ..previewDart2 = enablePreviewDart2;
     _driver = new AnalysisDriver(
         scheduler,
diff --git a/pkg/async_helper/pubspec.yaml b/pkg/async_helper/pubspec.yaml
index 2dc33fd..ceb2634 100644
--- a/pkg/async_helper/pubspec.yaml
+++ b/pkg/async_helper/pubspec.yaml
@@ -1,12 +1,9 @@
 name: async_helper
-version: 0.9.0
-author: "Dart Team <misc@dartlang.org>"
-homepage: http://www.dartlang.org
-description: >
+# This package is not intended to be published
+publish_to: none
+description: >-
  Async_helper is used for asynchronous tests that do not want to
  make use of the Dart unittest library - for example, the core
  language tests.
  Third parties are discouraged from using this, and should use
- the facilities provided in the unittest library.
-environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+ the facilities provided in package:test.
diff --git a/pkg/compiler/lib/src/backend_strategy.dart b/pkg/compiler/lib/src/backend_strategy.dart
index be1764c..cced759 100644
--- a/pkg/compiler/lib/src/backend_strategy.dart
+++ b/pkg/compiler/lib/src/backend_strategy.dart
@@ -43,7 +43,8 @@
       SelectorConstraintsStrategy selectorConstraintsStrategy);
 
   /// Creates the [WorkItemBuilder] used by the codegen enqueuer.
-  WorkItemBuilder createCodegenWorkItemBuilder(JClosedWorld closedWorld);
+  WorkItemBuilder createCodegenWorkItemBuilder(JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults);
 
   /// Creates the [SsaBuilder] used for the element model.
   SsaBuilder createSsaBuilder(CompilerTask task, JavaScriptBackend backend,
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index 18cfdc3..3247c80 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:kernel/ast.dart' as ir;
 import 'common/tasks.dart' show CompilerTask, Measurer;
 import 'common.dart';
 import 'elements/entities.dart';
@@ -9,8 +10,8 @@
 
 // TODO(johnniwinther,efortuna): Split [ClosureConversionTask] from
 // [ClosureDataLookup].
-abstract class ClosureConversionTask<T> extends CompilerTask
-    implements ClosureDataLookup<T> {
+abstract class ClosureConversionTask extends CompilerTask
+    implements ClosureDataLookup {
   ClosureConversionTask(Measurer measurer) : super(measurer);
 }
 
@@ -18,16 +19,16 @@
 /// to preserve Dart semantics when compiled to JavaScript. Given a particular
 /// node to look up, it returns a information about the internal representation
 /// of how closure conversion is implemented. T is an ir.Node or Node.
-abstract class ClosureDataLookup<T> {
+abstract class ClosureDataLookup {
   /// Look up information about the variables that have been mutated and are
   /// used inside the scope of [node].
   ScopeInfo getScopeInfo(MemberEntity member);
 
-  ClosureRepresentationInfo getClosureInfo(T localFunction);
+  ClosureRepresentationInfo getClosureInfo(ir.Node localFunction);
 
   /// Look up information about a loop, in case any variables it declares need
   /// to be boxed/snapshotted.
-  CapturedLoopScope getCapturedLoopScope(T loopNode);
+  CapturedLoopScope getCapturedLoopScope(ir.Node loopNode);
 
   /// Accessor to the information about scopes that closures capture. Used by
   /// the SSA builder.
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 42d6b0c..2dc90ba 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -8,10 +8,6 @@
 class Flags {
   static const String allowMockCompilation = '--allow-mock-compilation';
   static const String allowNativeExtensions = '--allow-native-extensions';
-  static const String analyzeAll = '--analyze-all';
-  static const String analyzeMain = '--analyze-main';
-  static const String analyzeOnly = '--analyze-only';
-  static const String analyzeSignaturesOnly = '--analyze-signatures-only';
   static const String disableInlining = '--disable-inlining';
   static const String disableProgramSplit = '--disable-program-split';
   static const String disableDiagnosticColors = '--disable-diagnostic-colors';
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 5c75e93..1da17a1 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.dart
@@ -60,7 +60,7 @@
   /// Perform [action] and measure its runtime (including any asynchronous
   /// callbacks, such as, [Future.then], but excluding code measured by other
   /// tasks).
-  measure(action()) => _isDisabled ? action() : _measureZoned(action);
+  T measure<T>(T action()) => _isDisabled ? action() : _measureZoned(action);
 
   /// Helper method that starts measuring with this [CompilerTask], that is,
   /// make this task the currently measured task.
@@ -91,7 +91,7 @@
     measurer.currentTask = previous;
   }
 
-  _measureZoned(action()) {
+  T _measureZoned<T>(T action()) {
     // Using zones, we're able to track asynchronous operations correctly, as
     // our zone will be asked to invoke `then` blocks. Then blocks (the closure
     // passed to runZoned, and other closures) are run via the `run` functions
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index c54b666..8a39e86 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -1051,9 +1051,6 @@
   FunctionEntity get getRuntimeTypeArgumentIntercepted =>
       _findHelperFunction('getRuntimeTypeArgumentIntercepted');
 
-  FunctionEntity get runtimeTypeToString =>
-      _findHelperFunction('runtimeTypeToString');
-
   FunctionEntity get assertIsSubtype => _findHelperFunction('assertIsSubtype');
 
   FunctionEntity get checkSubtype => _findHelperFunction('checkSubtype');
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 8f31433..f0ebe13 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -37,11 +37,11 @@
 import 'options.dart' show CompilerOptions, DiagnosticOptions;
 import 'ssa/nodes.dart' show HInstruction;
 import 'types/abstract_value_domain.dart' show AbstractValueStrategy;
-import 'types/types.dart' show GlobalTypeInferenceTask;
+import 'types/types.dart'
+    show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
 import 'universe/selector.dart' show Selector;
 import 'universe/world_builder.dart'
     show ResolutionWorldBuilder, CodegenWorldBuilder;
-import 'universe/use.dart' show StaticUse, TypeUse;
 import 'universe/world_impact.dart'
     show ImpactStrategy, WorldImpact, WorldImpactBuilderImpl;
 import 'world.dart' show JClosedWorld, KClosedWorld;
@@ -76,8 +76,6 @@
 
   api.CompilerOutput get outputProvider => _outputProvider;
 
-  List<Uri> librariesToAnalyzeWhenRun;
-
   Uri mainLibraryUri;
 
   JClosedWorld backendClosedWorldForTesting;
@@ -205,10 +203,6 @@
     return _codegenWorldBuilder;
   }
 
-  bool get analyzeAll => options.analyzeAll || compileAll;
-
-  bool get compileAll => false;
-
   bool get disableTypeInference =>
       options.disableTypeInference || compilationFailed;
 
@@ -269,23 +263,11 @@
           .add(selector);
     }
 
-    assert(uri != null || options.analyzeOnly);
+    assert(uri != null);
     // As far as I can tell, this branch is only used by test code.
-    if (librariesToAnalyzeWhenRun != null) {
-      await Future.forEach(librariesToAnalyzeWhenRun, (libraryUri) async {
-        reporter.log('Analyzing $libraryUri (${options.buildId})');
-        LoadedLibraries loadedLibraries =
-            await libraryLoader.loadLibrary(libraryUri);
-        processLoadedLibraries(loadedLibraries);
-      });
-    }
     LibraryEntity mainApp;
     if (uri != null) {
-      if (options.analyzeOnly) {
-        reporter.log('Analyzing $uri (${options.buildId})');
-      } else {
-        reporter.log('Compiling $uri (${options.buildId})');
-      }
+      reporter.log('Compiling $uri (${options.buildId})');
       LoadedLibraries libraries = await libraryLoader.loadLibrary(uri);
       // Note: libraries may be null because of errors trying to find files or
       // parse-time errors (when using `package:front_end` as a loader).
@@ -312,106 +294,104 @@
     return resolutionEnqueuer;
   }
 
+  JClosedWorld computeClosedWorld(LibraryEntity rootLibrary) {
+    ResolutionEnqueuer resolutionEnqueuer = startResolution();
+    WorldImpactBuilderImpl mainImpact = new WorldImpactBuilderImpl();
+    FunctionEntity mainFunction =
+        frontendStrategy.computeMain(rootLibrary, mainImpact);
+
+    // In order to see if a library is deferred, we must compute the
+    // compile-time constants that are metadata.  This means adding
+    // something to the resolution queue.  So we cannot wait with
+    // this until after the resolution queue is processed.
+    deferredLoadTask.beforeResolution(rootLibrary);
+    impactStrategy = backend.createImpactStrategy(
+        supportDeferredLoad: deferredLoadTask.isProgramSplit,
+        supportDumpInfo: options.dumpInfo);
+
+    phase = PHASE_RESOLVING;
+    resolutionEnqueuer.applyImpact(mainImpact);
+    reporter.log('Resolving...');
+
+    processQueue(frontendStrategy.elementEnvironment, resolutionEnqueuer,
+        mainFunction, libraryLoader.libraries,
+        onProgress: showResolutionProgress);
+    backend.onResolutionEnd();
+    resolutionEnqueuer.logSummary(reporter.log);
+
+    _reporter.reportSuppressedMessagesSummary();
+
+    if (compilationFailed) {
+      if (!options.generateCodeWithCompileTimeErrors) {
+        return null;
+      }
+      if (mainFunction == null) return null;
+      if (!backend.enableCodegenWithErrorsIfSupported(NO_LOCATION_SPANNABLE)) {
+        return null;
+      }
+    }
+
+    assert(mainFunction != null);
+
+    JClosedWorld closedWorld = closeResolution(mainFunction);
+    backendClosedWorldForTesting = closedWorld;
+    return closedWorld;
+  }
+
+  GlobalTypeInferenceResults performGlobalTypeInference(
+      JClosedWorld closedWorld) {
+    FunctionEntity mainFunction = closedWorld.elementEnvironment.mainFunction;
+    reporter.log('Inferring types...');
+    InferredDataBuilder inferredDataBuilder = new InferredDataBuilderImpl();
+    backend.processAnnotations(closedWorld, inferredDataBuilder);
+    return globalInference.runGlobalTypeInference(
+        mainFunction, closedWorld, inferredDataBuilder);
+  }
+
+  Enqueuer generateJavaScriptCode(JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
+    FunctionEntity mainFunction = closedWorld.elementEnvironment.mainFunction;
+    reporter.log('Compiling...');
+    phase = PHASE_COMPILING;
+
+    Enqueuer codegenEnqueuer =
+        startCodegen(closedWorld, globalInferenceResults);
+    processQueue(closedWorld.elementEnvironment, codegenEnqueuer, mainFunction,
+        libraryLoader.libraries,
+        onProgress: showCodegenProgress);
+    codegenEnqueuer.logSummary(reporter.log);
+
+    int programSize = backend.assembleProgram(
+        closedWorld, globalInferenceResults.inferredData);
+
+    if (options.dumpInfo) {
+      dumpInfoTask.reportSize(programSize);
+      dumpInfoTask.dumpInfo(closedWorld, globalInferenceResults);
+    }
+
+    backend.onCodegenEnd();
+
+    return codegenEnqueuer;
+  }
+
   /// Performs the compilation when all libraries have been loaded.
   void compileLoadedLibraries(LibraryEntity rootLibrary) =>
       selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
-        ResolutionEnqueuer resolutionEnqueuer = startResolution();
-        WorldImpactBuilderImpl mainImpact = new WorldImpactBuilderImpl();
-        FunctionEntity mainFunction =
-            frontendStrategy.computeMain(rootLibrary, mainImpact);
-
-        // In order to see if a library is deferred, we must compute the
-        // compile-time constants that are metadata.  This means adding
-        // something to the resolution queue.  So we cannot wait with
-        // this until after the resolution queue is processed.
-        deferredLoadTask.beforeResolution(rootLibrary);
-        impactStrategy = backend.createImpactStrategy(
-            supportDeferredLoad: deferredLoadTask.isProgramSplit,
-            supportDumpInfo: options.dumpInfo);
-
-        phase = PHASE_RESOLVING;
-        resolutionEnqueuer.applyImpact(mainImpact);
-        if (analyzeAll) {
-          libraryLoader.libraries.forEach((LibraryEntity library) {
-            reporter.log('Enqueuing ${library.canonicalUri}');
-            resolutionEnqueuer.applyImpact(computeImpactForLibrary(library));
-          });
-        } else if (options.analyzeMain) {
-          if (rootLibrary != null) {
-            resolutionEnqueuer
-                .applyImpact(computeImpactForLibrary(rootLibrary));
-          }
-          if (librariesToAnalyzeWhenRun != null) {
-            for (Uri libraryUri in librariesToAnalyzeWhenRun) {
-              resolutionEnqueuer.applyImpact(computeImpactForLibrary(
-                  libraryLoader.lookupLibrary(libraryUri)));
-            }
-          }
+        JClosedWorld closedWorld = computeClosedWorld(rootLibrary);
+        if (closedWorld != null) {
+          GlobalTypeInferenceResults globalInferenceResults =
+              performGlobalTypeInference(closedWorld);
+          if (stopAfterTypeInference) return;
+          Enqueuer codegenEnqueuer =
+              generateJavaScriptCode(closedWorld, globalInferenceResults);
+          checkQueues(enqueuer.resolution, codegenEnqueuer);
         }
-        reporter.log('Resolving...');
-
-        processQueue(frontendStrategy.elementEnvironment, resolutionEnqueuer,
-            mainFunction, libraryLoader.libraries,
-            onProgress: showResolutionProgress);
-        backend.onResolutionEnd();
-        resolutionEnqueuer.logSummary(reporter.log);
-
-        _reporter.reportSuppressedMessagesSummary();
-
-        if (compilationFailed) {
-          if (!options.generateCodeWithCompileTimeErrors) {
-            return;
-          }
-          if (mainFunction == null) return;
-          if (!backend
-              .enableCodegenWithErrorsIfSupported(NO_LOCATION_SPANNABLE)) {
-            return;
-          }
-        }
-
-        if (options.analyzeOnly) return;
-        assert(mainFunction != null);
-
-        JClosedWorld closedWorld = closeResolution(mainFunction);
-        backendClosedWorldForTesting = closedWorld;
-        mainFunction = closedWorld.elementEnvironment.mainFunction;
-
-        reporter.log('Inferring types...');
-        InferredDataBuilder inferredDataBuilder = new InferredDataBuilderImpl();
-        backend.processAnnotations(closedWorld, inferredDataBuilder);
-        globalInference.runGlobalTypeInference(
-            mainFunction, closedWorld, inferredDataBuilder);
-
-        if (stopAfterTypeInference) return;
-
-        reporter.log('Compiling...');
-        phase = PHASE_COMPILING;
-
-        Enqueuer codegenEnqueuer = startCodegen(closedWorld);
-        if (compileAll) {
-          libraryLoader.libraries.forEach((LibraryEntity library) {
-            codegenEnqueuer.applyImpact(computeImpactForLibrary(library));
-          });
-        }
-        processQueue(closedWorld.elementEnvironment, codegenEnqueuer,
-            mainFunction, libraryLoader.libraries,
-            onProgress: showCodegenProgress);
-        codegenEnqueuer.logSummary(reporter.log);
-
-        int programSize = backend.assembleProgram(closedWorld);
-
-        if (options.dumpInfo) {
-          dumpInfoTask.reportSize(programSize);
-          dumpInfoTask.dumpInfo(closedWorld);
-        }
-
-        backend.onCodegenEnd();
-
-        checkQueues(resolutionEnqueuer, codegenEnqueuer);
       });
 
-  Enqueuer startCodegen(JClosedWorld closedWorld) {
-    Enqueuer codegenEnqueuer = enqueuer.createCodegenEnqueuer(closedWorld);
+  Enqueuer startCodegen(JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
+    Enqueuer codegenEnqueuer =
+        enqueuer.createCodegenEnqueuer(closedWorld, globalInferenceResults);
     _codegenWorldBuilder = codegenEnqueuer.worldBuilder;
     codegenEnqueuer.applyImpact(backend.onCodegenStart(
         closedWorld, _codegenWorldBuilder, backendStrategy.sorter));
@@ -432,25 +412,6 @@
     return closedWorldRefiner;
   }
 
-  /// Compute the [WorldImpact] for accessing all elements in [library].
-  WorldImpact computeImpactForLibrary(LibraryEntity library) {
-    WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
-
-    void registerStaticUse(MemberEntity element) {
-      impactBuilder.registerStaticUse(new StaticUse.directUse(element));
-    }
-
-    ElementEnvironment elementEnvironment = frontendStrategy.elementEnvironment;
-
-    elementEnvironment.forEachLibraryMember(library, registerStaticUse);
-    elementEnvironment.forEachClass(library, (ClassEntity cls) {
-      impactBuilder.registerTypeUse(
-          new TypeUse.instantiation(elementEnvironment.getRawType(cls)));
-      elementEnvironment.forEachLocalClassMember(cls, registerStaticUse);
-    });
-    return impactBuilder;
-  }
-
   /**
    * Empty the [enqueuer] queue.
    */
@@ -585,10 +546,6 @@
     if (mainLibraryUri != null) {
       userCodeLocations.add(new CodeLocation(mainLibraryUri));
     }
-    if (librariesToAnalyzeWhenRun != null) {
-      userCodeLocations.addAll(
-          librariesToAnalyzeWhenRun.map((Uri uri) => new CodeLocation(uri)));
-    }
     if (userCodeLocations.isEmpty && assumeInUserCode) {
       // Assume in user code since [mainApp] has not been set yet.
       userCodeLocations.add(const AnyLocation());
diff --git a/pkg/compiler/lib/src/constants/constructors.dart b/pkg/compiler/lib/src/constants/constructors.dart
index 7924b20..e575b5a 100644
--- a/pkg/compiler/lib/src/constants/constructors.dart
+++ b/pkg/compiler/lib/src/constants/constructors.dart
@@ -195,8 +195,9 @@
       List<ConstantExpression> arguments, CallStructure callStructure) {
     NormalizedArguments args =
         new NormalizedArguments(defaultValues, callStructure, arguments);
-    InstanceData appliedInstanceData = GenerativeConstantConstructor
-        .applyInstanceData(environment, args, thisConstructorInvocation);
+    InstanceData appliedInstanceData =
+        GenerativeConstantConstructor.applyInstanceData(
+            environment, args, thisConstructorInvocation);
     return appliedInstanceData;
   }
 
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index fe5a7c0..0bde91f 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -121,11 +121,10 @@
   List<String> options = new List<String>();
   bool wantHelp = false;
   bool wantVersion = false;
-  bool analyzeOnly = false;
   bool trustTypeAnnotations = false;
   bool checkedMode = false;
   bool strongMode = true;
-  bool forceStrongMode = true;
+  bool forceStrongMode = false;
   List<String> hints = <String>[];
   bool verbose;
   bool throwOnError;
@@ -196,11 +195,6 @@
     return filenames.join("\n");
   }
 
-  void setAnalyzeOnly(String argument) {
-    analyzeOnly = true;
-    passThrough(argument);
-  }
-
   void setAllowNativeExtensions(String argument) {
     helpAndFail("Option '${Flags.allowNativeExtensions}' is not supported.");
   }
@@ -342,13 +336,10 @@
     new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
     new OptionHandler('--packages=.+', setPackageConfig),
     new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
-    new OptionHandler(Flags.analyzeAll, passThrough),
-    new OptionHandler(Flags.analyzeOnly, setAnalyzeOnly),
     new OptionHandler(Flags.noSourceMaps, passThrough),
     new OptionHandler(Option.resolutionInput, ignoreOption),
     new OptionHandler(Option.bazelPaths, setBazelPaths),
     new OptionHandler(Flags.resolveOnly, ignoreOption),
-    new OptionHandler(Flags.analyzeSignaturesOnly, setAnalyzeOnly),
     new OptionHandler(Flags.disableNativeLiveTypeAnalysis, passThrough),
     new OptionHandler('--categories=.*', setCategories),
     new OptionHandler(Flags.disableInlining, passThrough),
@@ -480,7 +471,6 @@
           onInfo: diagnosticHandler.info, onFailure: fail);
 
   api.CompilationResult compilationDone(api.CompilationResult result) {
-    if (analyzeOnly) return result;
     if (!result.isSuccess) {
       fail('Compilation failed.');
     }
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 54daa5c..fa9b677 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -361,6 +361,9 @@
                 _collectTypeDependencies(type, dependencies);
               }
               break;
+            case TypeUseKind.RTI_VALUE:
+              failedAt(element, "Unexpected type use: $typeUse.");
+              break;
           }
         }, visitDynamicUse: (DynamicUse dynamicUse) {
           // TODO(johnniwinther): Use rti need data to skip unneeded type
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 7abea41..385a7ab 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -22,7 +22,10 @@
 import 'js_backend/js_backend.dart' show JavaScriptBackend;
 import 'types/abstract_value_domain.dart';
 import 'types/types.dart'
-    show GlobalTypeInferenceElementResult, GlobalTypeInferenceMemberResult;
+    show
+        GlobalTypeInferenceElementResult,
+        GlobalTypeInferenceMemberResult,
+        GlobalTypeInferenceResults;
 import 'universe/world_builder.dart' show CodegenWorldBuilder;
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
@@ -31,6 +34,7 @@
 class ElementInfoCollector {
   final Compiler compiler;
   final JClosedWorld closedWorld;
+  final GlobalTypeInferenceResults _globalInferenceResults;
 
   ElementEnvironment get environment => closedWorld.elementEnvironment;
   CodegenWorldBuilder get codegenWorldBuilder => compiler.codegenWorldBuilder;
@@ -40,7 +44,8 @@
   final Map<ConstantValue, Info> _constantToInfo = <ConstantValue, Info>{};
   final Map<OutputUnit, OutputUnitInfo> _outputToInfo = {};
 
-  ElementInfoCollector(this.compiler, this.closedWorld);
+  ElementInfoCollector(
+      this.compiler, this.closedWorld, this._globalInferenceResults);
 
   void run() {
     compiler.dumpInfoTask._constantToNode.forEach((constant, node) {
@@ -105,15 +110,16 @@
   }
 
   GlobalTypeInferenceMemberResult _resultOfMember(MemberEntity e) =>
-      compiler.globalInference.results.resultOfMember(e);
+      _globalInferenceResults.resultOfMember(e);
 
   GlobalTypeInferenceElementResult _resultOfParameter(Local e) =>
-      compiler.globalInference.results.resultOfParameter(e);
+      _globalInferenceResults.resultOfParameter(e);
 
   FieldInfo visitField(FieldEntity field, {ClassEntity containingClass}) {
     var isInInstantiatedClass = false;
     if (containingClass != null) {
-      isInInstantiatedClass = closedWorld.isInstantiated(containingClass);
+      isInInstantiatedClass =
+          closedWorld.classHierarchy.isInstantiated(containingClass);
     }
     if (!isInInstantiatedClass && !_hasBeenResolved(field)) {
       return null;
@@ -286,8 +292,9 @@
     String returnType = '${functionType.returnType}';
 
     String inferredReturnType = '${_resultOfMember(function).returnType}';
-    String sideEffects =
-        '${compiler.globalInference.inferredData.getSideEffectsOfElement(function)}';
+    String sideEffects = '${compiler
+        .globalInference.resultsForTesting.inferredData
+        .getSideEffectsOfElement(function)}';
 
     int inlinedCount = compiler.dumpInfoTask.inlineCount[function];
     if (inlinedCount == null) inlinedCount = 0;
@@ -541,9 +548,12 @@
     return sb.toString();
   }
 
-  void dumpInfo(JClosedWorld closedWorld) {
+  void dumpInfo(JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
     measure(() {
-      infoCollector = new ElementInfoCollector(compiler, closedWorld)..run();
+      infoCollector = new ElementInfoCollector(
+          compiler, closedWorld, globalInferenceResults)
+        ..run();
       StringBuffer jsonBuffer = new StringBuffer();
       dumpInfoJson(jsonBuffer, closedWorld);
       compiler.outputProvider.createOutputSink(
diff --git a/pkg/compiler/lib/src/elements/jumps.dart b/pkg/compiler/lib/src/elements/jumps.dart
index b179daa..05a25e7 100644
--- a/pkg/compiler/lib/src/elements/jumps.dart
+++ b/pkg/compiler/lib/src/elements/jumps.dart
@@ -7,9 +7,9 @@
 import 'entities.dart';
 
 /// The label entity defined by a labeled statement.
-abstract class LabelDefinition<T> extends Entity {
+abstract class LabelDefinition extends Entity {
   String get labelName;
-  JumpTarget<T> get target;
+  JumpTarget get target;
 
   bool get isTarget => isBreakTarget || isContinueTarget;
 
@@ -19,20 +19,19 @@
 
 /// A jump target is the reference point of a statement or switch-case,
 /// either by label or as the default target of a break or continue.
-abstract class JumpTarget<T> extends Local {
+abstract class JumpTarget extends Local {
   String get name => 'target';
 
   bool get isTarget => isBreakTarget || isContinueTarget;
 
-  T get statement;
   int get nestingLevel;
-  List<LabelDefinition<T>> get labels;
+  List<LabelDefinition> get labels;
 
   bool get isBreakTarget;
   bool get isContinueTarget;
   bool get isSwitch;
   bool get isSwitchCase;
 
-  LabelDefinition<T> addLabel(covariant T label, String labelName,
+  LabelDefinition addLabel(String labelName,
       {bool isBreakTarget: false, bool isContinueTarget: false});
 }
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index dc244d9..231c558 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -264,8 +264,9 @@
 class TypedefType extends DartType {
   final TypedefEntity element;
   final List<DartType> typeArguments;
+  final FunctionType unaliased;
 
-  TypedefType(this.element, this.typeArguments);
+  TypedefType(this.element, this.typeArguments, this.unaliased);
 
   bool get isTypedef => true;
 
@@ -291,9 +292,11 @@
     }
     List<DartType> newTypeArguments =
         _substTypes(typeArguments, arguments, parameters);
-    if (!identical(typeArguments, newTypeArguments)) {
+    FunctionType newUnaliased = unaliased.subst(arguments, parameters);
+    if (!identical(typeArguments, newTypeArguments) ||
+        !identical(unaliased, newUnaliased)) {
       // Create a new type only if necessary.
-      return new TypedefType(element, newTypeArguments);
+      return new TypedefType(element, newTypeArguments, newUnaliased);
     }
     return this;
   }
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index c4b5b90c..7e1492e 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -16,6 +16,7 @@
 import 'elements/entities.dart';
 import 'elements/types.dart';
 import 'js_backend/enqueuer.dart';
+import 'types/types.dart';
 import 'universe/world_builder.dart';
 import 'universe/use.dart'
     show
@@ -60,10 +61,11 @@
           ..onEmptyForTesting = compiler.onResolutionQueueEmptyForTesting;
   }
 
-  Enqueuer createCodegenEnqueuer(JClosedWorld closedWorld) {
-    return codegenEnqueuerForTesting = compiler.backend
-        .createCodegenEnqueuer(this, compiler, closedWorld)
-          ..onEmptyForTesting = compiler.onCodegenQueueEmptyForTesting;
+  Enqueuer createCodegenEnqueuer(JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
+    return codegenEnqueuerForTesting = compiler.backend.createCodegenEnqueuer(
+        this, compiler, closedWorld, globalInferenceResults)
+      ..onEmptyForTesting = compiler.onCodegenQueueEmptyForTesting;
   }
 }
 
@@ -378,6 +380,9 @@
           _worldBuilder.registerTypeVariableTypeLiteral(type);
         }
         break;
+      case TypeUseKind.RTI_VALUE:
+        failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
+        break;
     }
   }
 
@@ -496,16 +501,6 @@
   }
 }
 
-/// Strategy that only enqueues directly used elements.
-class DirectEnqueuerStrategy extends EnqueuerStrategy {
-  const DirectEnqueuerStrategy();
-  void processStaticUse(EnqueuerImpl enqueuer, StaticUse staticUse) {
-    if (staticUse.kind == StaticUseKind.DIRECT_USE) {
-      enqueuer.processStaticUse(staticUse);
-    }
-  }
-}
-
 /// Strategy used for tree-shaking.
 class TreeShakingEnqueuerStrategy extends EnqueuerStrategy {
   const TreeShakingEnqueuerStrategy();
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index f6b8293..45f1261 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -23,7 +23,7 @@
 import 'library_loader.dart';
 import 'native/enqueue.dart' show NativeResolutionEnqueuer;
 import 'native/resolver.dart';
-import 'universe/class_hierarchy_builder.dart';
+import 'universe/class_hierarchy.dart';
 import 'universe/world_builder.dart';
 import 'universe/world_impact.dart';
 
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index a6e885a1..7fbd876 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -41,22 +41,22 @@
 class KernelTypeGraphBuilder extends ir.Visitor<TypeInformation> {
   final CompilerOptions _options;
   final JClosedWorld _closedWorld;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
-  final InferrerEngine<ir.Node> _inferrer;
-  final TypeSystem<ir.Node> _types;
+  final ClosureDataLookup _closureDataLookup;
+  final InferrerEngine _inferrer;
+  final TypeSystem _types;
   final MemberEntity _analyzedMember;
   final ir.Node _analyzedNode;
   final KernelToElementMapForBuilding _elementMap;
   final KernelToLocalsMap _localsMap;
-  final GlobalTypeInferenceElementData<ir.Node> _memberData;
+  final GlobalTypeInferenceElementData _memberData;
   final bool _inGenerativeConstructor;
 
-  LocalsHandler<ir.Node> _locals;
+  LocalsHandler _locals;
   final SideEffectsBuilder _sideEffectsBuilder;
-  final Map<JumpTarget, List<LocalsHandler<ir.Node>>> _breaksFor =
-      <JumpTarget, List<LocalsHandler<ir.Node>>>{};
-  final Map<JumpTarget, List<LocalsHandler<ir.Node>>> _continuesFor =
-      <JumpTarget, List<LocalsHandler<ir.Node>>>{};
+  final Map<JumpTarget, List<LocalsHandler>> _breaksFor =
+      <JumpTarget, List<LocalsHandler>>{};
+  final Map<JumpTarget, List<LocalsHandler>> _continuesFor =
+      <JumpTarget, List<LocalsHandler>>{};
   TypeInformation _returnType;
   final Set<Local> _capturedVariables = new Set<Local>();
 
@@ -91,9 +91,9 @@
         this._inGenerativeConstructor = _analyzedNode is ir.Constructor {
     if (_locals != null) return;
 
-    FieldInitializationScope<ir.Node> fieldScope =
+    FieldInitializationScope fieldScope =
         _inGenerativeConstructor ? new FieldInitializationScope(_types) : null;
-    _locals = new LocalsHandler<ir.Node>(
+    _locals = new LocalsHandler(
         _inferrer, _types, _options, _analyzedNode, fieldScope);
   }
 
@@ -116,7 +116,7 @@
   bool _isInClassOrSubclass(MemberEntity member) {
     ClassEntity cls = _elementMap.getMemberThisType(_analyzedMember)?.element;
     if (cls == null) return false;
-    return _closedWorld.isSubclassOf(member.enclosingClass, cls);
+    return _closedWorld.classHierarchy.isSubclassOf(member.enclosingClass, cls);
   }
 
   /// Checks whether the access or update of [selector] on [mask] potentially
@@ -180,7 +180,7 @@
       _locals.setCapturedAndBoxed(variable, field);
     });
 
-    return _analyzedNode.accept(this);
+    return visit(_analyzedNode);
   }
 
   bool isIncompatibleInvoke(FunctionEntity function, ArgumentsTypes arguments) {
@@ -216,8 +216,12 @@
     }
   }
 
-  TypeInformation visit(ir.Node node) {
-    return node == null ? null : node.accept(this);
+  TypeInformation visit(ir.Node node, {bool conditionContext: false}) {
+    var oldAccumulateIsChecks = _accumulateIsChecks;
+    _accumulateIsChecks = conditionContext;
+    var result = node?.accept(this);
+    _accumulateIsChecks = oldAccumulateIsChecks;
+    return result;
   }
 
   void visitList(List<ir.Node> nodes) {
@@ -270,7 +274,7 @@
     _inferrer.recordExposesThis(_analyzedMember, _isThisExposed);
 
     if (cls.isAbstract) {
-      if (_closedWorld.isInstantiated(cls)) {
+      if (_closedWorld.classHierarchy.isInstantiated(cls)) {
         _returnType = _types.nonNullSubclass(cls);
       } else {
         // TODO(johnniwinther): Avoid analyzing [_analyzedMember] in this
@@ -419,7 +423,7 @@
   @override
   visitBlock(ir.Block block) {
     for (ir.Statement statement in block.statements) {
-      statement.accept(this);
+      visit(statement);
       if (_locals.aborts) break;
     }
   }
@@ -525,7 +529,7 @@
       continueTargets.forEach(_clearBreaksAndContinues);
     } else {
       LocalsHandler saved = _locals;
-      List<LocalsHandler<ir.Node>> localsToMerge = <LocalsHandler<ir.Node>>[];
+      List<LocalsHandler> localsToMerge = <LocalsHandler>[];
       bool hasDefaultCase = false;
 
       for (ir.SwitchCase switchCase in node.cases) {
@@ -564,7 +568,7 @@
       TypeInformation elementType;
       int length = 0;
       for (ir.Expression element in listLiteral.expressions) {
-        TypeInformation type = element.accept(this);
+        TypeInformation type = visit(element);
         elementType = elementType == null
             ? _types.allocatePhi(null, null, type, isTry: false)
             : _types.addPhiInput(null, elementType, type);
@@ -601,8 +605,7 @@
   @override
   TypeInformation visitReturnStatement(ir.ReturnStatement node) {
     ir.Node expression = node.expression;
-    recordReturnType(
-        expression == null ? _types.nullType : expression.accept(this));
+    recordReturnType(expression == null ? _types.nullType : visit(expression));
     _locals.seenReturnOrThrow = true;
     initializationIsIndefinite();
     return null;
@@ -711,7 +714,7 @@
       if (argument is ir.ThisExpression) {
         _markThisAsExposed();
       }
-      positional.add(argument.accept(this));
+      positional.add(visit(argument));
     }
     for (ir.NamedExpression argument in arguments.named) {
       named ??= <String, TypeInformation>{};
@@ -721,7 +724,7 @@
       if (value is ir.ThisExpression) {
         _markThisAsExposed();
       }
-      named[argument.name] = value.accept(this);
+      named[argument.name] = visit(value);
     }
 
     return new ArgumentsTypes(positional, named);
@@ -962,10 +965,10 @@
   void _setupBreaksAndContinues(JumpTarget target) {
     if (target == null) return;
     if (target.isContinueTarget) {
-      _continuesFor[target] = <LocalsHandler<ir.Node>>[];
+      _continuesFor[target] = <LocalsHandler>[];
     }
     if (target.isBreakTarget) {
-      _breaksFor[target] = <LocalsHandler<ir.Node>>[];
+      _breaksFor[target] = <LocalsHandler>[];
     }
   }
 
@@ -974,15 +977,15 @@
     _breaksFor.remove(element);
   }
 
-  List<LocalsHandler<ir.Node>> _getBreaks(JumpTarget target) {
-    List<LocalsHandler<ir.Node>> list = <LocalsHandler<ir.Node>>[_locals];
+  List<LocalsHandler> _getBreaks(JumpTarget target) {
+    List<LocalsHandler> list = <LocalsHandler>[_locals];
     if (target == null) return list;
     if (!target.isBreakTarget) return list;
     return list..addAll(_breaksFor[target]);
   }
 
-  List<LocalsHandler<ir.Node>> _getLoopBackEdges(JumpTarget target) {
-    List<LocalsHandler<ir.Node>> list = <LocalsHandler<ir.Node>>[_locals];
+  List<LocalsHandler> _getLoopBackEdges(JumpTarget target) {
+    List<LocalsHandler> list = <LocalsHandler>[_locals];
     if (target == null) return list;
     if (!target.isContinueTarget) return list;
     return list..addAll(_continuesFor[target]);
@@ -1045,9 +1048,10 @@
     ClassEntity cls = constructor.enclosingClass;
     return cls.library.canonicalUri == Uris.dart__native_typed_data &&
         _closedWorld.nativeData.isNativeClass(cls) &&
-        _closedWorld.isSubtypeOf(
-            cls, _closedWorld.commonElements.typedDataClass) &&
-        _closedWorld.isSubtypeOf(cls, _closedWorld.commonElements.listClass) &&
+        _closedWorld.classHierarchy
+            .isSubtypeOf(cls, _closedWorld.commonElements.typedDataClass) &&
+        _closedWorld.classHierarchy
+            .isSubtypeOf(cls, _closedWorld.commonElements.listClass) &&
         constructor.name == '';
   }
 
@@ -1298,7 +1302,7 @@
     _conditionIsSimple = true;
     _positiveIsChecks = positiveTests;
     _negativeIsChecks = negativeTests;
-    visit(node);
+    visit(node, conditionContext: true);
     bool simpleCondition = _conditionIsSimple;
     _accumulateIsChecks = oldAccumulateIsChecks;
     _positiveIsChecks = oldPositiveIsChecks;
@@ -1380,7 +1384,7 @@
     List<IsCheck> temp = _positiveIsChecks;
     _positiveIsChecks = _negativeIsChecks;
     _negativeIsChecks = temp;
-    visit(node.operand);
+    visit(node.operand, conditionContext: _accumulateIsChecks);
     temp = _positiveIsChecks;
     _positiveIsChecks = _negativeIsChecks;
     _negativeIsChecks = temp;
@@ -1399,7 +1403,7 @@
         _positiveIsChecks = <IsCheck>[];
         _negativeIsChecks = <IsCheck>[];
       }
-      visit(node.left);
+      visit(node.left, conditionContext: _accumulateIsChecks);
       LocalsHandler saved = _locals;
       _locals = new LocalsHandler.from(_locals, node);
       _updateIsChecks(_positiveIsChecks, _negativeIsChecks);
@@ -1411,7 +1415,7 @@
         _positiveIsChecks = oldPositiveIsChecks;
         _negativeIsChecks = oldNegativeIsChecks;
       }
-      visit(node.right);
+      visit(node.right, conditionContext: _accumulateIsChecks);
       if (oldAccumulateIsChecks) {
         bool invalidatedInRightHandSide(IsCheck check) {
           return narrowed.locals[check.local] != _locals.locals[check.local];
@@ -1434,10 +1438,7 @@
       if (isSimple) {
         _updateIsChecks(negativeIsChecks, positiveIsChecks);
       }
-      bool oldAccumulateIsChecks = _accumulateIsChecks;
-      _accumulateIsChecks = false;
-      visit(node.right);
-      _accumulateIsChecks = oldAccumulateIsChecks;
+      visit(node.right, conditionContext: false);
       saved.mergeDiamondFlow(_locals, null);
       _locals = saved;
       return _types.boolType;
@@ -1506,7 +1507,7 @@
     // We don't put the closure in the work queue of the
     // inferrer, because it will share information with its enclosing
     // method, like for example the types of local variables.
-    LocalsHandler<ir.Node> closureLocals =
+    LocalsHandler closureLocals =
         new LocalsHandler.from(_locals, node, useOtherTryBlock: false);
     KernelTypeGraphBuilder visitor = new KernelTypeGraphBuilder(
         _options,
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 74e9360..03be5ac 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -38,7 +38,7 @@
 /// An inferencing engine that computes a call graph of [TypeInformation] nodes
 /// by visiting the AST of the application, and then does the inferencing on the
 /// graph.
-abstract class InferrerEngine<T> {
+abstract class InferrerEngine {
   /// A set of selector names that [List] implements, that we know return their
   /// element type.
   final Set<Selector> returnsListElementTypeSet =
@@ -64,8 +64,8 @@
   // [ClosureWorldRefiner].
   NoSuchMethodData get noSuchMethodData => closedWorld.noSuchMethodData;
 
-  TypeSystem<T> get types;
-  Map<T, TypeInformation> get concreteTypes;
+  TypeSystem get types;
+  Map<ir.Node, TypeInformation> get concreteTypes;
   InferredDataBuilder get inferredDataBuilder;
 
   FunctionEntity get mainElement;
@@ -115,9 +115,9 @@
   Iterable<MemberEntity> getCallersOfForTesting(MemberEntity element);
 
   // TODO(johnniwinther): Make this private again.
-  GlobalTypeInferenceElementData<T> dataOfMember(MemberEntity element);
+  GlobalTypeInferenceElementData dataOfMember(MemberEntity element);
 
-  GlobalTypeInferenceElementData<T> lookupDataOfMember(MemberEntity element);
+  GlobalTypeInferenceElementData lookupDataOfMember(MemberEntity element);
 
   bool checkIfExposesThis(ConstructorEntity element);
 
@@ -131,11 +131,11 @@
 
   /// Registers a call to await with an expression of type [argumentType] as
   /// argument.
-  TypeInformation registerAwait(T node, TypeInformation argument);
+  TypeInformation registerAwait(ir.Node node, TypeInformation argument);
 
   /// Registers a call to yield with an expression of type [argumentType] as
   /// argument.
-  TypeInformation registerYield(T node, TypeInformation argument);
+  TypeInformation registerYield(ir.Node node, TypeInformation argument);
 
   /// Registers that [caller] calls [closure] with [arguments].
   ///
@@ -144,7 +144,7 @@
   ///
   /// [inLoop] tells whether the call happens in a loop.
   TypeInformation registerCalledClosure(
-      T node,
+      ir.Node node,
       Selector selector,
       AbstractValue mask,
       TypeInformation closure,
@@ -180,7 +180,7 @@
   /// [inLoop] tells whether the call happens in a loop.
   TypeInformation registerCalledSelector(
       CallType callType,
-      T node,
+      ir.Node node,
       Selector selector,
       AbstractValue mask,
       TypeInformation receiverType,
@@ -197,8 +197,8 @@
       ArgumentsTypes arguments, Selector selector, AbstractValue mask,
       {bool remove, bool addToQueue: true});
 
-  void updateSelectorInMember(MemberEntity owner, CallType callType, T node,
-      Selector selector, AbstractValue mask);
+  void updateSelectorInMember(MemberEntity owner, CallType callType,
+      ir.Node node, Selector selector, AbstractValue mask);
 
   /// Returns the return type of [element].
   TypeInformation returnTypeOfMember(MemberEntity element);
@@ -246,7 +246,7 @@
   bool assumeDynamic(MemberEntity member);
 }
 
-abstract class InferrerEngineImpl<T> extends InferrerEngine<T> {
+abstract class InferrerEngineImpl extends InferrerEngine {
   static bool retainDataForTesting = false;
 
   final Map<Local, TypeInformation> defaultTypeOfParameter =
@@ -272,8 +272,9 @@
   final JClosedWorld closedWorld;
   final InferredDataBuilder inferredDataBuilder;
 
-  final TypeSystem<T> types;
-  final Map<T, TypeInformation> concreteTypes = new Map<T, TypeInformation>();
+  final TypeSystem types;
+  final Map<ir.Node, TypeInformation> concreteTypes =
+      new Map<ir.Node, TypeInformation>();
 
   final Map<ir.Node, TypeInformation> concreteKernelTypes =
       new Map<ir.Node, TypeInformation>();
@@ -299,8 +300,8 @@
       this.mainElement,
       this.sorter,
       this.inferredDataBuilder,
-      TypeSystemStrategy<T> typeSystemStrategy)
-      : this.types = new TypeSystem<T>(closedWorld, typeSystemStrategy);
+      TypeSystemStrategy typeSystemStrategy)
+      : this.types = new TypeSystem(closedWorld, typeSystemStrategy);
 
   void forEachElementMatching(
       Selector selector, AbstractValue mask, bool f(MemberEntity element)) {
@@ -310,13 +311,13 @@
     }
   }
 
-  GlobalTypeInferenceElementData<T> createElementData();
+  GlobalTypeInferenceElementData createElementData();
 
   // TODO(johnniwinther): Make this private again.
-  GlobalTypeInferenceElementData<T> dataOfMember(MemberEntity element) =>
+  GlobalTypeInferenceElementData dataOfMember(MemberEntity element) =>
       _memberData.putIfAbsent(element, createElementData);
 
-  GlobalTypeInferenceElementData<T> lookupDataOfMember(MemberEntity element) =>
+  GlobalTypeInferenceElementData lookupDataOfMember(MemberEntity element) =>
       _memberData[element];
 
   /**
@@ -389,8 +390,8 @@
     return returnType;
   }
 
-  void updateSelectorInMember(MemberEntity owner, CallType callType, T node,
-      Selector selector, AbstractValue mask) {
+  void updateSelectorInMember(MemberEntity owner, CallType callType,
+      ir.Node node, Selector selector, AbstractValue mask) {
     GlobalTypeInferenceElementData data = dataOfMember(owner);
     assert(validCallType(callType, node));
     switch (callType) {
@@ -535,7 +536,7 @@
           if (debug.VERBOSE) {
             print("traced closure $element as "
                 "${inferredDataBuilder
-                .getCurrentlyKnownMightBePassedToApply(element)}");
+                    .getCurrentlyKnownMightBePassedToApply(element)}");
           }
         });
       }
@@ -673,7 +674,7 @@
   int computeMemberSize(MemberEntity member);
 
   /// Returns the body node for [member].
-  T computeMemberBody(MemberEntity member);
+  ir.Node computeMemberBody(MemberEntity member);
 
   /// Returns the `call` method on [cls] or the `noSuchMethod` if [cls] doesn't
   /// implement `call`.
@@ -683,7 +684,7 @@
     if (analyzedElements.contains(element)) return;
     analyzedElements.add(element);
 
-    T body = computeMemberBody(element);
+    ir.Node body = computeMemberBody(element);
 
     TypeInformation type;
     reporter.withCurrentElement(element, () {
@@ -745,11 +746,13 @@
   }
 
   /// Visits [body] to compute the [TypeInformation] node for [member].
-  TypeInformation computeMemberTypeInformation(MemberEntity member, T body);
+  TypeInformation computeMemberTypeInformation(
+      MemberEntity member, ir.Node body);
 
   /// Returns `true` if the [initializer] of the non-const static or top-level
   /// [field] is potentially `null`.
-  bool isFieldInitializerPotentiallyNull(FieldEntity field, T initializer);
+  bool isFieldInitializerPotentiallyNull(
+      FieldEntity field, ir.Node initializer);
 
   /// Returns the [ConstantValue] for the initial value of [field], or
   /// `null` if the initializer is not a constant value.
@@ -1002,7 +1005,7 @@
 
   TypeInformation registerCalledSelector(
       CallType callType,
-      T node,
+      ir.Node node,
       Selector selector,
       AbstractValue mask,
       TypeInformation receiverType,
@@ -1042,16 +1045,16 @@
     return info;
   }
 
-  TypeInformation registerAwait(T node, TypeInformation argument) {
-    AwaitTypeInformation info = new AwaitTypeInformation<T>(
+  TypeInformation registerAwait(ir.Node node, TypeInformation argument) {
+    AwaitTypeInformation info = new AwaitTypeInformation(
         abstractValueDomain, types.currentMember, node);
     info.addAssignment(argument);
     types.allocatedTypes.add(info);
     return info;
   }
 
-  TypeInformation registerYield(T node, TypeInformation argument) {
-    YieldTypeInformation info = new YieldTypeInformation<T>(
+  TypeInformation registerYield(ir.Node node, TypeInformation argument) {
+    YieldTypeInformation info = new YieldTypeInformation(
         abstractValueDomain, types.currentMember, node);
     info.addAssignment(argument);
     types.allocatedTypes.add(info);
@@ -1059,7 +1062,7 @@
   }
 
   TypeInformation registerCalledClosure(
-      T node,
+      ir.Node node,
       Selector selector,
       AbstractValue mask,
       TypeInformation closure,
diff --git a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
index 07d745f..eccd514 100644
--- a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
@@ -28,11 +28,11 @@
 import 'type_graph_nodes.dart';
 import 'type_system.dart';
 
-class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> {
+class KernelTypeGraphInferrer extends TypeGraphInferrer {
   final Compiler _compiler;
   final KernelToElementMapForBuilding _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final ClosureDataLookup _closureDataLookup;
   final InferredDataBuilder _inferredDataBuilder;
 
   KernelTypeGraphInferrer(
@@ -46,7 +46,7 @@
       : super(closedWorld, disableTypeInference: disableTypeInference);
 
   @override
-  InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) {
+  InferrerEngine createInferrerEngineFor(FunctionEntity main) {
     return new KernelInferrerEngine(
         _compiler.options,
         _compiler.progress,
@@ -61,42 +61,12 @@
         _compiler.backendStrategy.sorter,
         _inferredDataBuilder);
   }
-
-  @override
-  GlobalTypeInferenceResults createResults() {
-    return new KernelGlobalTypeInferenceResults(this, closedWorld);
-  }
 }
 
-class KernelGlobalTypeInferenceResults
-    extends GlobalTypeInferenceResults<ir.Node> {
-  KernelGlobalTypeInferenceResults(
-      TypesInferrer<ir.Node> inferrer, JClosedWorld closedWorld)
-      : super(inferrer, closedWorld);
-
-  GlobalTypeInferenceMemberResult<ir.Node> createMemberResult(
-      TypeGraphInferrer<ir.Node> inferrer, MemberEntity member,
-      {bool isJsInterop: false}) {
-    return new GlobalTypeInferenceMemberResultImpl<ir.Node>(
-        member,
-        // We store data in the context of the enclosing method, even
-        // for closure elements.
-        inferrer.inferrer.lookupDataOfMember(member),
-        inferrer,
-        isJsInterop);
-  }
-
-  GlobalTypeInferenceParameterResult<ir.Node> createParameterResult(
-      TypeGraphInferrer<ir.Node> inferrer, Local parameter) {
-    return new GlobalTypeInferenceParameterResultImpl<ir.Node>(
-        parameter, inferrer);
-  }
-}
-
-class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
+class KernelInferrerEngine extends InferrerEngineImpl {
   final KernelToElementMapForBuilding _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final ClosureDataLookup _closureDataLookup;
 
   KernelInferrerEngine(
       CompilerOptions options,
@@ -225,7 +195,7 @@
   }
 
   @override
-  GlobalTypeInferenceElementData<ir.Node> createElementData() {
+  GlobalTypeInferenceElementData createElementData() {
     return new KernelGlobalTypeInferenceElementData();
   }
 
@@ -237,10 +207,10 @@
   }
 }
 
-class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> {
+class KernelTypeSystemStrategy implements TypeSystemStrategy {
   KernelToElementMapForBuilding _elementMap;
   GlobalLocalsMap _globalLocalsMap;
-  ClosureDataLookup<ir.Node> _closureDataLookup;
+  ClosureDataLookup _closureDataLookup;
 
   KernelTypeSystemStrategy(
       this._elementMap, this._globalLocalsMap, this._closureDataLookup);
@@ -271,7 +241,7 @@
   ParameterTypeInformation createParameterTypeInformation(
       AbstractValueDomain abstractValueDomain,
       covariant JLocal parameter,
-      TypeSystem<ir.Node> types) {
+      TypeSystem types) {
     MemberEntity context = parameter.memberContext;
     KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(context);
     ir.FunctionNode functionNode =
@@ -340,7 +310,7 @@
 }
 
 class KernelGlobalTypeInferenceElementData
-    extends GlobalTypeInferenceElementData<ir.Node> {
+    extends GlobalTypeInferenceElementData {
   // TODO(johnniwinther): Rename this together with [typeOfSend].
   Map<ir.Node, AbstractValue> _sendMap;
 
diff --git a/pkg/compiler/lib/src/inferrer/locals_handler.dart b/pkg/compiler/lib/src/inferrer/locals_handler.dart
index 26b41c7..ae92797 100644
--- a/pkg/compiler/lib/src/inferrer/locals_handler.dart
+++ b/pkg/compiler/lib/src/inferrer/locals_handler.dart
@@ -21,14 +21,14 @@
  * The inferrer makes sure updates get merged into the parent scope,
  * once the control flow block has been visited.
  */
-class VariableScope<T> {
+class VariableScope {
   Map<Local, TypeInformation> variables;
 
   /// The parent of this scope. Null for the root scope.
   final VariableScope parent;
 
-  /// The [Node] that created this scope.
-  final T block;
+  /// The [ir.Node] that created this scope.
+  final ir.Node block;
 
   /// `true` if this scope is for a try block.
   final bool isTry;
@@ -40,7 +40,7 @@
         "Unexpected block $block for isTry=$isTry");
   }
 
-  VariableScope.deepCopyOf(VariableScope<T> other)
+  VariableScope.deepCopyOf(VariableScope other)
       : variables = other.variables == null
             ? null
             : new Map<Local, TypeInformation>.from(other.variables),
@@ -50,7 +50,7 @@
             ? null
             : new VariableScope.deepCopyOf(other.parent);
 
-  VariableScope.topLevelCopyOf(VariableScope<T> other)
+  VariableScope.topLevelCopyOf(VariableScope other)
       : variables = other.variables == null
             ? null
             : new Map<Local, TypeInformation>.from(other.variables),
@@ -80,7 +80,7 @@
   }
 
   void forEachLocalUntilNode(
-      T node, void f(Local variable, TypeInformation type),
+      ir.Node node, void f(Local variable, TypeInformation type),
       [Setlet<Local> seenLocals]) {
     if (seenLocals == null) seenLocals = new Setlet<Local>();
     if (variables != null) {
@@ -110,8 +110,8 @@
 }
 
 /// Tracks initializers via initializations and assignments.
-class FieldInitializationScope<T> {
-  final TypeSystem<T> types;
+class FieldInitializationScope {
+  final TypeSystem types;
   Map<FieldEntity, TypeInformation> fields;
   bool isThisExposed;
 
@@ -123,14 +123,14 @@
       : isThisExposed = false,
         isIndefinite = false;
 
-  FieldInitializationScope.internalFrom(FieldInitializationScope<T> other)
+  FieldInitializationScope.internalFrom(FieldInitializationScope other)
       : types = other.types,
         isThisExposed = other.isThisExposed,
         isIndefinite = other.isIndefinite;
 
-  factory FieldInitializationScope.from(FieldInitializationScope<T> other) {
+  factory FieldInitializationScope.from(FieldInitializationScope other) {
     if (other == null) return null;
-    return new FieldInitializationScope<T>.internalFrom(other);
+    return new FieldInitializationScope.internalFrom(other);
   }
 
   void updateField(FieldEntity field, TypeInformation type) {
@@ -148,14 +148,14 @@
     fields?.forEach(f);
   }
 
-  void mergeDiamondFlow(FieldInitializationScope<T> thenScope,
-      FieldInitializationScope<T> elseScope) {
+  void mergeDiamondFlow(
+      FieldInitializationScope thenScope, FieldInitializationScope elseScope) {
     // Quick bailout check. If [isThisExposed] or [isIndefinite] is true, we
     // know the code following won'TypeInformation do anything.
     if (isThisExposed) return;
     if (isIndefinite) return;
 
-    FieldInitializationScope<T> otherScope =
+    FieldInitializationScope otherScope =
         (elseScope == null || elseScope.fields == null) ? this : elseScope;
 
     thenScope.forEach((FieldEntity field, TypeInformation type) {
@@ -248,14 +248,14 @@
 /**
  * Placeholder for inferred types of local variables.
  */
-class LocalsHandler<T> {
+class LocalsHandler {
   final CompilerOptions options;
-  final TypeSystem<T> types;
-  final InferrerEngine<T> inferrer;
-  final VariableScope<T> locals;
+  final TypeSystem types;
+  final InferrerEngine inferrer;
+  final VariableScope locals;
   final Map<Local, FieldEntity> _capturedAndBoxed;
-  final FieldInitializationScope<T> fieldScope;
-  LocalsHandler<T> tryBlock;
+  final FieldInitializationScope fieldScope;
+  LocalsHandler tryBlock;
   bool seenReturnOrThrow = false;
   bool seenBreakOrContinue = false;
 
@@ -265,17 +265,16 @@
 
   bool get inTryBlock => tryBlock != null;
 
-  LocalsHandler(this.inferrer, this.types, this.options, T block,
+  LocalsHandler(this.inferrer, this.types, this.options, ir.Node block,
       [this.fieldScope])
-      : locals = new VariableScope<T>(block, isTry: false),
+      : locals = new VariableScope(block, isTry: false),
         _capturedAndBoxed = new Map<Local, FieldEntity>(),
         tryBlock = null;
 
-  LocalsHandler.from(LocalsHandler<T> other, T block,
+  LocalsHandler.from(LocalsHandler other, ir.Node block,
       {bool isTry: false, bool useOtherTryBlock: true})
-      : locals =
-            new VariableScope<T>(block, isTry: isTry, parent: other.locals),
-        fieldScope = new FieldInitializationScope<T>.from(other.fieldScope),
+      : locals = new VariableScope(block, isTry: isTry, parent: other.locals),
+        fieldScope = new FieldInitializationScope.from(other.fieldScope),
         _capturedAndBoxed = other._capturedAndBoxed,
         types = other.types,
         inferrer = other.inferrer,
@@ -283,18 +282,18 @@
     tryBlock = useOtherTryBlock ? other.tryBlock : this;
   }
 
-  LocalsHandler.deepCopyOf(LocalsHandler<T> other)
-      : locals = new VariableScope<T>.deepCopyOf(other.locals),
-        fieldScope = new FieldInitializationScope<T>.from(other.fieldScope),
+  LocalsHandler.deepCopyOf(LocalsHandler other)
+      : locals = new VariableScope.deepCopyOf(other.locals),
+        fieldScope = new FieldInitializationScope.from(other.fieldScope),
         _capturedAndBoxed = other._capturedAndBoxed,
         tryBlock = other.tryBlock,
         types = other.types,
         inferrer = other.inferrer,
         options = other.options;
 
-  LocalsHandler.topLevelCopyOf(LocalsHandler<T> other)
-      : locals = new VariableScope<T>.topLevelCopyOf(other.locals),
-        fieldScope = new FieldInitializationScope<T>.from(other.fieldScope),
+  LocalsHandler.topLevelCopyOf(LocalsHandler other)
+      : locals = new VariableScope.topLevelCopyOf(other.locals),
+        fieldScope = new FieldInitializationScope.from(other.fieldScope),
         _capturedAndBoxed = other._capturedAndBoxed,
         tryBlock = other.tryBlock,
         types = other.types,
@@ -310,7 +309,8 @@
     }
   }
 
-  void update(Local local, TypeInformation type, T node, DartType staticType,
+  void update(
+      Local local, TypeInformation type, ir.Node node, DartType staticType,
       {bool isSetIfNull: false}) {
     assert(type != null);
     if (!options.assignmentCheckPolicy.isIgnored) {
@@ -356,7 +356,8 @@
     }
   }
 
-  void narrow(Local local, DartType type, T node, {bool isSetIfNull: false}) {
+  void narrow(Local local, DartType type, ir.Node node,
+      {bool isSetIfNull: false}) {
     TypeInformation existing = use(local);
     TypeInformation newType =
         types.narrowType(existing, type, isNullable: false);
@@ -367,8 +368,7 @@
     _capturedAndBoxed[local] = field;
   }
 
-  void mergeDiamondFlow(
-      LocalsHandler<T> thenBranch, LocalsHandler<T> elseBranch) {
+  void mergeDiamondFlow(LocalsHandler thenBranch, LocalsHandler elseBranch) {
     if (fieldScope != null && elseBranch != null) {
       fieldScope.mergeDiamondFlow(thenBranch.fieldScope, elseBranch.fieldScope);
     }
@@ -380,7 +380,7 @@
         elseBranch.seenBreakOrContinue;
     if (aborts) return;
 
-    void mergeOneBranch(LocalsHandler<T> other) {
+    void mergeOneBranch(LocalsHandler other) {
       other.locals.forEachOwnLocal((Local local, TypeInformation type) {
         TypeInformation myType = locals[local];
         if (myType == null) return; // Variable is only defined in [other].
@@ -389,7 +389,7 @@
       });
     }
 
-    void inPlaceUpdateOneBranch(LocalsHandler<T> other) {
+    void inPlaceUpdateOneBranch(LocalsHandler other) {
       other.locals.forEachOwnLocal((Local local, TypeInformation type) {
         TypeInformation myType = locals[local];
         if (myType == null) return; // Variable is only defined in [other].
@@ -459,18 +459,18 @@
    * where [:this:] is the [LocalsHandler] for the paths through the
    * labeled statement that do not break out.
    */
-  void mergeAfterBreaks(List<LocalsHandler<T>> handlers,
+  void mergeAfterBreaks(List<LocalsHandler> handlers,
       {bool keepOwnLocals: true}) {
-    T level = locals.block;
+    ir.Node level = locals.block;
     // Use a separate locals handler to perform the merge in, so that Phi
     // creation does not invalidate previous type knowledge while we might
     // still look it up.
-    LocalsHandler<T> merged =
-        new LocalsHandler<T>.from(this, level, isTry: locals.isTry);
+    LocalsHandler merged =
+        new LocalsHandler.from(this, level, isTry: locals.isTry);
     Set<Local> seenLocals = new Setlet<Local>();
     bool allBranchesAbort = true;
     // Merge all other handlers.
-    for (LocalsHandler<T> handler in handlers) {
+    for (LocalsHandler handler in handlers) {
       allBranchesAbort = allBranchesAbort && handler.seenReturnOrThrow;
       merged.mergeHandler(handler, seenLocals);
     }
@@ -500,7 +500,7 @@
    * unless the local is already present in the set [seen]. This effectively
    * overwrites the current type knowledge in this handler.
    */
-  bool mergeHandler(LocalsHandler<T> other, [Set<Local> seen]) {
+  bool mergeHandler(LocalsHandler other, [Set<Local> seen]) {
     if (other.seenReturnOrThrow) return false;
     bool changed = false;
     other.locals.forEachLocalUntilNode(locals.block, (local, otherType) {
@@ -535,7 +535,7 @@
     return changed;
   }
 
-  void startLoop(T loop) {
+  void startLoop(ir.Node loop) {
     locals.forEachLocal((Local variable, TypeInformation type) {
       TypeInformation newType =
           types.allocateLoopPhi(loop, variable, type, isTry: false);
@@ -545,7 +545,7 @@
     });
   }
 
-  void endLoop(T loop) {
+  void endLoop(ir.Node loop) {
     locals.forEachLocal((Local variable, TypeInformation type) {
       TypeInformation newType = types.simplifyPhi(loop, variable, type);
       if (newType != type) {
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index e07ddc6..ca3860a 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -6,6 +6,7 @@
 
 import 'dart:collection' show Queue;
 
+import 'package:kernel/ast.dart' as ir;
 import '../elements/entities.dart';
 import '../types/abstract_value_domain.dart';
 import '../types/types.dart';
@@ -45,8 +46,8 @@
   int get length => queue.length;
 }
 
-abstract class TypeGraphInferrer<T> implements TypesInferrer<T> {
-  InferrerEngine<T> inferrer;
+abstract class TypeGraphInferrer implements TypesInferrer {
+  InferrerEngine inferrer;
   final bool _disableTypeInference;
   final JClosedWorld closedWorld;
 
@@ -66,7 +67,7 @@
     inferrer.runOverAllElements();
   }
 
-  InferrerEngine<T> createInferrerEngineFor(FunctionEntity main);
+  InferrerEngine createInferrerEngineFor(FunctionEntity main);
 
   AbstractValue getReturnTypeOfMember(MemberEntity element) {
     if (_disableTypeInference) return _dynamicType;
@@ -95,12 +96,12 @@
     return inferrer.types.getInferredTypeOfParameter(element).type;
   }
 
-  AbstractValue getTypeForNewList(T node) {
+  AbstractValue getTypeForNewList(ir.Node node) {
     if (_disableTypeInference) return _dynamicType;
     return inferrer.types.allocatedLists[node].type;
   }
 
-  bool isFixedArrayCheckedForGrowable(T node) {
+  bool isFixedArrayCheckedForGrowable(ir.Node node) {
     if (_disableTypeInference) return true;
     ListTypeInformation info = inferrer.types.allocatedLists[node];
     return info.checksGrowable;
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index dc903fc..fa962df 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -1844,8 +1844,8 @@
  * A [PhiElementTypeInformation] is an union of
  * [ElementTypeInformation], that is local to a method.
  */
-class PhiElementTypeInformation<T> extends TypeInformation {
-  final T branchNode;
+class PhiElementTypeInformation extends TypeInformation {
+  final ir.Node branchNode;
   final Local variable;
   final bool isTry;
 
@@ -1949,8 +1949,8 @@
   }
 }
 
-class AwaitTypeInformation<T> extends TypeInformation {
-  final T _node;
+class AwaitTypeInformation extends TypeInformation {
+  final ir.Node _node;
 
   AwaitTypeInformation(AbstractValueDomain abstractValueDomain,
       MemberTypeInformation context, this._node)
@@ -1968,8 +1968,8 @@
   }
 }
 
-class YieldTypeInformation<T> extends TypeInformation {
-  final T _node;
+class YieldTypeInformation extends TypeInformation {
+  final ir.Node _node;
 
   YieldTypeInformation(AbstractValueDomain abstractValueDomain,
       MemberTypeInformation context, this._node)
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index 6fa9191..75e4ee3 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:kernel/ast.dart' as ir;
 import '../common.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
@@ -12,7 +13,7 @@
 
 /// Strategy for creating type information from members and parameters and type
 /// information for nodes.
-abstract class TypeSystemStrategy<T> {
+abstract class TypeSystemStrategy {
   /// Creates [MemberTypeInformation] for [member].
   MemberTypeInformation createMemberTypeInformation(
       AbstractValueDomain abstractValueDomain, MemberEntity member);
@@ -21,22 +22,22 @@
   ParameterTypeInformation createParameterTypeInformation(
       AbstractValueDomain abstractValueDomain,
       Local parameter,
-      TypeSystem<T> types);
+      TypeSystem types);
 
   /// Calls [f] for each parameter in [function].
   void forEachParameter(FunctionEntity function, void f(Local parameter));
 
   /// Returns whether [node] is valid as a general phi node.
-  bool checkPhiNode(T node);
+  bool checkPhiNode(ir.Node node);
 
   /// Returns whether [node] is valid as a loop phi node.
-  bool checkLoopPhiNode(T node);
+  bool checkLoopPhiNode(ir.Node node);
 
   /// Returns whether [node] is valid as a list allocation node.
-  bool checkListNode(T node);
+  bool checkListNode(ir.Node node);
 
   /// Returns whether [node] is valid as a map allocation node.
-  bool checkMapNode(T node);
+  bool checkMapNode(ir.Node node);
 
   /// Returns whether [cls] is valid as a type mask base class.
   bool checkClassEntity(ClassEntity cls);
@@ -45,9 +46,9 @@
 /**
  * The class [SimpleInferrerVisitor] will use when working on types.
  */
-class TypeSystem<T> {
+class TypeSystem {
   final JClosedWorld _closedWorld;
-  final TypeSystemStrategy<T> strategy;
+  final TypeSystemStrategy strategy;
 
   /// [parameterTypeInformations] and [memberTypeInformations] ordered by
   /// creation time. This is used as the inference enqueueing order.
@@ -62,10 +63,12 @@
       new Map<MemberEntity, TypeInformation>();
 
   /// [ListTypeInformation] for allocated lists.
-  final Map<T, TypeInformation> allocatedLists = new Map<T, TypeInformation>();
+  final Map<ir.Node, TypeInformation> allocatedLists =
+      new Map<ir.Node, TypeInformation>();
 
   /// [MapTypeInformation] for allocated Maps.
-  final Map<T, TypeInformation> allocatedMaps = new Map<T, TypeInformation>();
+  final Map<ir.Node, TypeInformation> allocatedMaps =
+      new Map<ir.Node, TypeInformation>();
 
   /// Closures found during the analysis.
   final Set<TypeInformation> allocatedClosures = new Set<TypeInformation>();
@@ -453,12 +456,12 @@
   }
 
   TypeInformation allocateList(
-      TypeInformation type, T node, MemberEntity enclosing,
+      TypeInformation type, ir.Node node, MemberEntity enclosing,
       [TypeInformation elementType, int length]) {
     assert(strategy.checkListNode(node));
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
     bool isTypedArray = typedDataClass != null &&
-        _closedWorld.isInstantiated(typedDataClass) &&
+        _closedWorld.classHierarchy.isInstantiated(typedDataClass) &&
         _abstractValueDomain.isInstanceOfOrNull(type.type, typedDataClass);
     bool isConst = (type.type == _abstractValueDomain.constListType);
     bool isFixed = (type.type == _abstractValueDomain.fixedListType) ||
@@ -492,7 +495,7 @@
   }
 
   TypeInformation allocateMap(
-      ConcreteTypeInformation type, T node, MemberEntity element,
+      ConcreteTypeInformation type, ir.Node node, MemberEntity element,
       [List<TypeInformation> keyTypes, List<TypeInformation> valueTypes]) {
     assert(strategy.checkMapNode(node));
     assert(keyTypes.length == valueTypes.length);
@@ -546,7 +549,7 @@
    */
   TypeInformation allocateDiamondPhi(
       TypeInformation firstInput, TypeInformation secondInput) {
-    PhiElementTypeInformation<T> result = new PhiElementTypeInformation<T>(
+    PhiElementTypeInformation result = new PhiElementTypeInformation(
         _abstractValueDomain, currentMember, null, null,
         isTry: false);
     result.addAssignment(firstInput);
@@ -555,9 +558,9 @@
     return result;
   }
 
-  PhiElementTypeInformation<T> _addPhi(
-      T node, Local variable, TypeInformation inputType, bool isTry) {
-    PhiElementTypeInformation<T> result = new PhiElementTypeInformation<T>(
+  PhiElementTypeInformation _addPhi(
+      ir.Node node, Local variable, TypeInformation inputType, bool isTry) {
+    PhiElementTypeInformation result = new PhiElementTypeInformation(
         _abstractValueDomain, currentMember, node, variable,
         isTry: isTry);
     allocatedTypes.add(result);
@@ -569,8 +572,8 @@
    * Returns a new type for holding the potential types of [element].
    * [inputType] is the first incoming type of the phi.
    */
-  PhiElementTypeInformation<T> allocatePhi(
-      T node, Local variable, TypeInformation inputType,
+  PhiElementTypeInformation allocatePhi(
+      ir.Node node, Local variable, TypeInformation inputType,
       {bool isTry}) {
     assert(strategy.checkPhiNode(node));
     // Check if [inputType] is a phi for a local updated in
@@ -591,8 +594,8 @@
    * implementation of [TypeSystem] to differentiate Phi nodes due to loops
    * from other merging uses.
    */
-  PhiElementTypeInformation<T> allocateLoopPhi(
-      T node, Local variable, TypeInformation inputType,
+  PhiElementTypeInformation allocateLoopPhi(
+      ir.Node node, Local variable, TypeInformation inputType,
       {bool isTry}) {
     assert(strategy.checkLoopPhiNode(node));
     return _addPhi(node, variable, inputType, isTry);
@@ -605,7 +608,7 @@
    * input type.
    */
   TypeInformation simplifyPhi(
-      T node, Local variable, PhiElementTypeInformation<T> phiType) {
+      ir.Node node, Local variable, PhiElementTypeInformation phiType) {
     assert(phiType.branchNode == node);
     if (phiType.assignments.length == 1) return phiType.assignments.first;
     return phiType;
@@ -614,8 +617,8 @@
   /**
    * Adds [newType] as an input of [phiType].
    */
-  PhiElementTypeInformation<T> addPhiInput(Local variable,
-      PhiElementTypeInformation<T> phiType, TypeInformation newType) {
+  PhiElementTypeInformation addPhiInput(Local variable,
+      PhiElementTypeInformation phiType, TypeInformation newType) {
     phiType.addAssignment(newType);
     return phiType;
   }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 644cfd2..20150d5 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -55,11 +55,13 @@
       return new FlatTypeMask.internal(base, flags);
     }
     if ((flags >> 1) == SUBTYPE) {
-      if (!world.hasAnyStrictSubtype(base) || world.hasOnlySubclasses(base)) {
+      if (!world.classHierarchy.hasAnyStrictSubtype(base) ||
+          world.classHierarchy.hasOnlySubclasses(base)) {
         flags = (flags & 0x1) | (SUBCLASS << 1);
       }
     }
-    if (((flags >> 1) == SUBCLASS) && !world.hasAnyStrictSubclass(base)) {
+    if (((flags >> 1) == SUBCLASS) &&
+        !world.classHierarchy.hasAnyStrictSubclass(base)) {
       flags = (flags & 0x1) | (EXACT << 1);
     }
     CommonMasks commonMasks = world.abstractValueDomain;
@@ -102,10 +104,10 @@
     } else if (isExact) {
       return false;
     } else if (isSubclass) {
-      return closedWorld.isSubclassOf(other, base);
+      return closedWorld.classHierarchy.isSubclassOf(other, base);
     } else {
       assert(isSubtype);
-      return closedWorld.isSubtypeOf(other, base);
+      return closedWorld.classHierarchy.isSubtypeOf(other, base);
     }
   }
 
@@ -164,7 +166,7 @@
     if (flatOther.isSubclass) {
       if (isSubtype)
         return (otherBase == closedWorld.commonElements.objectClass);
-      return closedWorld.isSubclassOf(base, otherBase);
+      return closedWorld.classHierarchy.isSubclassOf(base, otherBase);
     }
     assert(flatOther.isSubtype);
     // Check whether this TypeMask satisfies otherBase's interface.
@@ -212,7 +214,7 @@
 
   bool satisfies(ClassEntity cls, JClosedWorld closedWorld) {
     if (isEmptyOrNull) return false;
-    if (closedWorld.isSubtypeOf(base, cls)) return true;
+    if (closedWorld.classHierarchy.isSubtypeOf(base, cls)) return true;
     return false;
   }
 
@@ -224,7 +226,9 @@
     if (isExact) {
       return base;
     } else if (isSubclass) {
-      return closedWorld.hasAnyStrictSubclass(base) ? null : base;
+      return closedWorld.classHierarchy.hasAnyStrictSubclass(base)
+          ? null
+          : base;
     } else {
       assert(isSubtype);
       return null;
@@ -251,13 +255,13 @@
       return flatOther.isNullable ? nullable() : this;
     } else if (base == flatOther.base) {
       return unionSame(flatOther, closedWorld);
-    } else if (closedWorld.isSubclassOf(flatOther.base, base)) {
+    } else if (closedWorld.classHierarchy.isSubclassOf(flatOther.base, base)) {
       return unionStrictSubclass(flatOther, closedWorld);
-    } else if (closedWorld.isSubclassOf(base, flatOther.base)) {
+    } else if (closedWorld.classHierarchy.isSubclassOf(base, flatOther.base)) {
       return flatOther.unionStrictSubclass(this, closedWorld);
-    } else if (closedWorld.isSubtypeOf(flatOther.base, base)) {
+    } else if (closedWorld.classHierarchy.isSubtypeOf(flatOther.base, base)) {
       return unionStrictSubtype(flatOther, closedWorld);
-    } else if (closedWorld.isSubtypeOf(base, flatOther.base)) {
+    } else if (closedWorld.classHierarchy.isSubtypeOf(base, flatOther.base)) {
       return flatOther.unionStrictSubtype(this, closedWorld);
     } else {
       return new UnionTypeMask._internal(<FlatTypeMask>[this, flatOther]);
@@ -286,7 +290,7 @@
 
   TypeMask unionStrictSubclass(FlatTypeMask other, JClosedWorld closedWorld) {
     assert(base != other.base);
-    assert(closedWorld.isSubclassOf(other.base, base));
+    assert(closedWorld.classHierarchy.isSubclassOf(other.base, base));
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     int combined;
@@ -313,8 +317,8 @@
 
   TypeMask unionStrictSubtype(FlatTypeMask other, JClosedWorld closedWorld) {
     assert(base != other.base);
-    assert(!closedWorld.isSubclassOf(other.base, base));
-    assert(closedWorld.isSubtypeOf(other.base, base));
+    assert(!closedWorld.classHierarchy.isSubclassOf(other.base, base));
+    assert(closedWorld.classHierarchy.isSubtypeOf(other.base, base));
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     // Since the other mask is a subtype of this mask, we need the
@@ -334,22 +338,70 @@
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     FlatTypeMask flatOther = other;
+
+    ClassEntity otherBase = flatOther.base;
+
+    bool includeNull = isNullable && flatOther.isNullable;
+
     if (isEmptyOrNull) {
-      return flatOther.isNullable ? this : nonNullable();
+      return includeNull ? this : nonNullable();
     } else if (flatOther.isEmptyOrNull) {
-      return isNullable ? flatOther : other.nonNullable();
-    } else if (base == flatOther.base) {
-      return intersectionSame(flatOther, closedWorld);
-    } else if (closedWorld.isSubclassOf(flatOther.base, base)) {
-      return intersectionStrictSubclass(flatOther, closedWorld);
-    } else if (closedWorld.isSubclassOf(base, flatOther.base)) {
-      return flatOther.intersectionStrictSubclass(this, closedWorld);
-    } else if (closedWorld.isSubtypeOf(flatOther.base, base)) {
-      return intersectionStrictSubtype(flatOther, closedWorld);
-    } else if (closedWorld.isSubtypeOf(base, flatOther.base)) {
-      return flatOther.intersectionStrictSubtype(this, closedWorld);
-    } else {
-      return intersectionDisjoint(flatOther, closedWorld);
+      return includeNull ? other : other.nonNullable();
+    }
+
+    SubclassResult result = closedWorld.classHierarchy
+        .commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
+
+    switch (result.kind) {
+      case SubclassResultKind.EMPTY:
+        return includeNull
+            ? closedWorld.abstractValueDomain.nullType
+            : closedWorld.abstractValueDomain.emptyType;
+      case SubclassResultKind.EXACT1:
+        assert(isExact);
+        return includeNull ? this : nonNullable();
+      case SubclassResultKind.EXACT2:
+        assert(other.isExact);
+        return includeNull ? other : other.nonNullable();
+      case SubclassResultKind.SUBCLASS1:
+        assert(isSubclass);
+        return includeNull ? this : nonNullable();
+      case SubclassResultKind.SUBCLASS2:
+        assert(flatOther.isSubclass);
+        return includeNull ? other : other.nonNullable();
+      case SubclassResultKind.SUBTYPE1:
+        assert(isSubtype);
+        return includeNull ? this : nonNullable();
+      case SubclassResultKind.SUBTYPE2:
+        assert(flatOther.isSubtype);
+        return includeNull ? other : other.nonNullable();
+      case SubclassResultKind.SET:
+      default:
+        if (result.classes.isEmpty) {
+          return includeNull
+              ? closedWorld.abstractValueDomain.nullType
+              : closedWorld.abstractValueDomain.emptyType;
+        } else if (result.classes.length == 1) {
+          ClassEntity cls = result.classes.first;
+          return includeNull
+              ? new TypeMask.subclass(cls, closedWorld)
+              : new TypeMask.nonNullSubclass(cls, closedWorld);
+        }
+
+        List<FlatTypeMask> masks = <FlatTypeMask>[];
+        if (includeNull) {
+          for (ClassEntity cls in result.classes) {
+            masks.add(new TypeMask.subclass(cls, closedWorld));
+          }
+        } else {
+          for (ClassEntity cls in result.classes) {
+            masks.add(new TypeMask.nonNullSubclass(cls, closedWorld));
+          }
+        }
+        if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
+          return UnionTypeMask.flatten(masks, closedWorld);
+        }
+        return new UnionTypeMask._internal(masks);
     }
   }
 
@@ -368,8 +420,12 @@
     // Normalization guarantees that isExact === !isSubclass && !isSubtype.
     // Both are subclass or subtype masks, so if there is a subclass
     // relationship, they are not disjoint.
-    if (closedWorld.isSubclassOf(flatOther.base, base)) return false;
-    if (closedWorld.isSubclassOf(base, flatOther.base)) return false;
+    if (closedWorld.classHierarchy.isSubclassOf(flatOther.base, base)) {
+      return false;
+    }
+    if (closedWorld.classHierarchy.isSubclassOf(base, flatOther.base)) {
+      return false;
+    }
 
     // Two different base classes have no common subclass unless one is a
     // subclass of the other (checked above).
@@ -386,10 +442,10 @@
     assert(a.isSubclass || a.isSubtype);
     assert(b.isSubtype);
     var elements = a.isSubclass
-        ? closedWorld.strictSubclassesOf(a.base)
-        : closedWorld.strictSubtypesOf(a.base);
+        ? closedWorld.classHierarchy.strictSubclassesOf(a.base)
+        : closedWorld.classHierarchy.strictSubtypesOf(a.base);
     for (var element in elements) {
-      if (closedWorld.isSubtypeOf(element, b.base)) return false;
+      if (closedWorld.classHierarchy.isSubtypeOf(element, b.base)) return false;
     }
     return true;
   }
@@ -415,7 +471,7 @@
   TypeMask intersectionStrictSubclass(
       FlatTypeMask other, JClosedWorld closedWorld) {
     assert(base != other.base);
-    assert(closedWorld.isSubclassOf(other.base, base));
+    assert(closedWorld.classHierarchy.isSubclassOf(other.base, base));
     // If this mask isn't at least a subclass mask, then the
     // intersection with the other mask is empty.
     if (isExact) return intersectionEmpty(other);
@@ -432,54 +488,6 @@
     }
   }
 
-  TypeMask intersectionStrictSubtype(
-      FlatTypeMask other, JClosedWorld closedWorld) {
-    assert(base != other.base);
-    assert(closedWorld.isSubtypeOf(other.base, base));
-    if (!isSubtype) return intersectionHelper(other, closedWorld);
-    // Only the other mask puts constraints on the intersection mask,
-    // so base the combined flags on the other mask. Only if both
-    // masks are nullable, will the result be nullable too.
-    // The result is guaranteed to be normalized, as the other type
-    // was normalized.
-    int combined = other.flags & ((flags & 1) | ~1);
-    if (other.flags == combined) {
-      return other;
-    } else {
-      return new FlatTypeMask.normalized(other.base, combined, closedWorld);
-    }
-  }
-
-  TypeMask intersectionDisjoint(FlatTypeMask other, JClosedWorld closedWorld) {
-    assert(base != other.base);
-    assert(!closedWorld.isSubtypeOf(base, other.base));
-    assert(!closedWorld.isSubtypeOf(other.base, base));
-    return intersectionHelper(other, closedWorld);
-  }
-
-  TypeMask intersectionHelper(FlatTypeMask other, JClosedWorld closedWorld) {
-    assert(base != other.base);
-    assert(!closedWorld.isSubclassOf(base, other.base));
-    assert(!closedWorld.isSubclassOf(other.base, base));
-    // If one of the masks are exact or if both of them are subclass
-    // masks, then the intersection is empty.
-    if (isExact || other.isExact) return intersectionEmpty(other);
-    if (isSubclass && other.isSubclass) return intersectionEmpty(other);
-    assert(isSubtype || other.isSubtype);
-    int kind = (isSubclass || other.isSubclass) ? SUBCLASS : SUBTYPE;
-    Iterable<ClassEntity> candidates = closedWorld.commonSubclasses(
-        base, _classQuery, other.base, other._classQuery);
-    if (candidates.isEmpty) return intersectionEmpty(other);
-    // Run through the list of candidates and compute the union. The
-    // result will only be nullable if both masks are nullable. We have
-    // to normalize here, as we generate types based on new base classes.
-    int combined = (kind << 1) | (flags & other.flags & 1);
-    Iterable<TypeMask> masks = candidates.map((ClassEntity cls) {
-      return new FlatTypeMask.normalized(cls, combined, closedWorld);
-    });
-    return UnionTypeMask.unionOf(masks, closedWorld);
-  }
-
   TypeMask intersectionEmpty(FlatTypeMask other) {
     return isNullable && other.isNullable
         ? new TypeMask.empty()
@@ -508,12 +516,12 @@
       return closedWorld.hasElementIn(base, selector, element);
     } else if (isSubclass) {
       return closedWorld.hasElementIn(base, selector, element) ||
-          closedWorld.isSubclassOf(other, base) ||
+          closedWorld.classHierarchy.isSubclassOf(other, base) ||
           closedWorld.hasAnySubclassThatMixes(base, other);
     } else {
       assert(isSubtype);
       bool result = closedWorld.hasElementIn(base, selector, element) ||
-          closedWorld.isSubtypeOf(other, base) ||
+          closedWorld.classHierarchy.isSubtypeOf(other, base) ||
           closedWorld.hasAnySubclassThatImplements(other, base) ||
           closedWorld.hasAnySubclassOfMixinUseThatImplements(other, base);
       if (result) return true;
@@ -522,7 +530,7 @@
       Iterable<ClassEntity> mixinUses = closedWorld.mixinUsesOf(base);
       return mixinUses.any((mixinApplication) =>
           closedWorld.hasElementIn(mixinApplication, selector, element) ||
-          closedWorld.isSubclassOf(other, mixinApplication) ||
+          closedWorld.classHierarchy.isSubclassOf(other, mixinApplication) ||
           closedWorld.hasAnySubclassThatMixes(mixinApplication, other));
     }
   }
@@ -560,7 +568,9 @@
       //}
       return null;
     } else {
-      if (closedWorld.isSubclassOf(base, enclosing)) return result;
+      if (closedWorld.classHierarchy.isSubclassOf(base, enclosing)) {
+        return result;
+      }
       if (closedWorld.isSubclassOfMixinUseOf(base, enclosing)) return result;
     }
     return null;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 2b6ae66..df920fc 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -9,12 +9,13 @@
 import '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
 import '../../elements/entities.dart';
 import '../../types/abstract_value_domain.dart';
+import '../../universe/class_hierarchy.dart';
 import '../../universe/selector.dart' show Selector;
 import '../../universe/use.dart' show DynamicUse;
 import '../../universe/world_builder.dart'
     show UniverseSelectorConstraints, SelectorConstraintsStrategy;
 import '../../util/util.dart';
-import '../../world.dart' show ClassQuery, JClosedWorld;
+import '../../world.dart' show JClosedWorld;
 import '../type_graph_inferrer.dart' show TypeGraphInferrer;
 import 'constants.dart';
 
@@ -197,7 +198,7 @@
     // interface `JavaScriptIndexingBehavior`.
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
     return typedDataClass != null &&
-        _closedWorld.isInstantiated(typedDataClass) &&
+        _closedWorld.classHierarchy.isInstantiated(typedDataClass) &&
         mask.satisfies(typedDataClass, _closedWorld) &&
         mask.satisfies(_closedWorld.commonElements.jsIndexingBehaviorInterface,
             _closedWorld);
@@ -211,7 +212,7 @@
     //               jsIndexingBehaviourInterface.
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
     return typedDataClass != null &&
-        _closedWorld.isInstantiated(typedDataClass) &&
+        _closedWorld.classHierarchy.isInstantiated(typedDataClass) &&
         intersects(mask, new TypeMask.subtype(typedDataClass, _closedWorld)) &&
         intersects(
             mask,
@@ -253,13 +254,14 @@
 
   @override
   bool containsType(TypeMask typeMask, ClassEntity cls) {
-    return _closedWorld.isInstantiated(cls) &&
+    return _closedWorld.classHierarchy.isInstantiated(cls) &&
         typeMask.contains(cls, _closedWorld);
   }
 
   @override
   bool containsOnlyType(TypeMask typeMask, ClassEntity cls) {
-    return _closedWorld.isInstantiated(cls) && typeMask.containsOnly(cls);
+    return _closedWorld.classHierarchy.isInstantiated(cls) &&
+        typeMask.containsOnly(cls);
   }
 
   @override
@@ -549,7 +551,7 @@
 
   @override
   AbstractValue computeReceiver(Iterable<MemberEntity> members) {
-    assert(_closedWorld
+    assert(_closedWorld.classHierarchy
         .hasAnyStrictSubclass(_closedWorld.commonElements.objectClass));
     return new TypeMask.unionOf(
         members.expand((MemberEntity element) {
@@ -558,7 +560,7 @@
         }).map((cls) {
           if (_closedWorld.commonElements.jsNullClass == cls) {
             return const TypeMask.empty();
-          } else if (_closedWorld.isInstantiated(cls)) {
+          } else if (_closedWorld.classHierarchy.isInstantiated(cls)) {
             return new TypeMask.nonNullSubclass(cls, _closedWorld);
           } else {
             // TODO(johnniwinther): Avoid the need for this case.
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index ee7d4b2..225f21c 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -107,30 +107,31 @@
 
   factory TypeMask.exact(ClassEntity base, JClosedWorld closedWorld) {
     assert(
-        closedWorld.isInstantiated(base),
+        closedWorld.classHierarchy.isInstantiated(base),
         failedAt(
             base ?? CURRENT_ELEMENT_SPANNABLE,
             "Cannot create exact type mask for uninstantiated "
-            "class $base.\n${closedWorld.dump(base)}"));
+            "class $base.\n${closedWorld.classHierarchy.dump(base)}"));
     return new FlatTypeMask.exact(base);
   }
 
   factory TypeMask.exactOrEmpty(ClassEntity base, JClosedWorld closedWorld) {
-    if (closedWorld.isInstantiated(base)) return new FlatTypeMask.exact(base);
+    if (closedWorld.classHierarchy.isInstantiated(base))
+      return new FlatTypeMask.exact(base);
     return const TypeMask.empty();
   }
 
   factory TypeMask.subclass(ClassEntity base, JClosedWorld closedWorld) {
     assert(
-        closedWorld.isInstantiated(base),
+        closedWorld.classHierarchy.isInstantiated(base),
         failedAt(
             base ?? CURRENT_ELEMENT_SPANNABLE,
             "Cannot create subclass type mask for uninstantiated "
-            "class $base.\n${closedWorld.dump(base)}"));
+            "class $base.\n${closedWorld.classHierarchy.dump(base)}"));
     ClassEntity topmost = closedWorld.getLubOfInstantiatedSubclasses(base);
     if (topmost == null) {
       return new TypeMask.empty();
-    } else if (closedWorld.hasAnyStrictSubclass(topmost)) {
+    } else if (closedWorld.classHierarchy.hasAnyStrictSubclass(topmost)) {
       return new FlatTypeMask.subclass(topmost);
     } else {
       return new TypeMask.exact(topmost, closedWorld);
@@ -142,10 +143,10 @@
     if (topmost == null) {
       return new TypeMask.empty();
     }
-    if (closedWorld.hasOnlySubclasses(topmost)) {
+    if (closedWorld.classHierarchy.hasOnlySubclasses(topmost)) {
       return new TypeMask.subclass(topmost, closedWorld);
     }
-    if (closedWorld.hasAnyStrictSubtype(topmost)) {
+    if (closedWorld.classHierarchy.hasAnyStrictSubtype(topmost)) {
       return new FlatTypeMask.subtype(topmost);
     } else {
       return new TypeMask.exact(topmost, closedWorld);
@@ -156,17 +157,17 @@
 
   factory TypeMask.nonNullExact(ClassEntity base, JClosedWorld closedWorld) {
     assert(
-        closedWorld.isInstantiated(base),
+        closedWorld.classHierarchy.isInstantiated(base),
         failedAt(
             base ?? CURRENT_ELEMENT_SPANNABLE,
             "Cannot create exact type mask for uninstantiated "
-            "class $base.\n${closedWorld.dump(base)}"));
+            "class $base.\n${closedWorld.classHierarchy.dump(base)}"));
     return new FlatTypeMask.nonNullExact(base);
   }
 
   factory TypeMask.nonNullExactOrEmpty(
       ClassEntity base, JClosedWorld closedWorld) {
-    if (closedWorld.isInstantiated(base)) {
+    if (closedWorld.classHierarchy.isInstantiated(base)) {
       return new FlatTypeMask.nonNullExact(base);
     }
     return const TypeMask.nonNullEmpty();
@@ -174,15 +175,15 @@
 
   factory TypeMask.nonNullSubclass(ClassEntity base, JClosedWorld closedWorld) {
     assert(
-        closedWorld.isInstantiated(base),
+        closedWorld.classHierarchy.isInstantiated(base),
         failedAt(
             base ?? CURRENT_ELEMENT_SPANNABLE,
             "Cannot create subclass type mask for uninstantiated "
-            "class $base.\n${closedWorld.dump(base)}"));
+            "class $base.\n${closedWorld.classHierarchy.dump(base)}"));
     ClassEntity topmost = closedWorld.getLubOfInstantiatedSubclasses(base);
     if (topmost == null) {
       return new TypeMask.nonNullEmpty();
-    } else if (closedWorld.hasAnyStrictSubclass(topmost)) {
+    } else if (closedWorld.classHierarchy.hasAnyStrictSubclass(topmost)) {
       return new FlatTypeMask.nonNullSubclass(topmost);
     } else {
       return new TypeMask.nonNullExact(topmost, closedWorld);
@@ -194,10 +195,10 @@
     if (topmost == null) {
       return new TypeMask.nonNullEmpty();
     }
-    if (closedWorld.hasOnlySubclasses(topmost)) {
+    if (closedWorld.classHierarchy.hasOnlySubclasses(topmost)) {
       return new TypeMask.nonNullSubclass(topmost, closedWorld);
     }
-    if (closedWorld.hasAnyStrictSubtype(topmost)) {
+    if (closedWorld.classHierarchy.hasAnyStrictSubtype(topmost)) {
       return new FlatTypeMask.nonNullSubtype(topmost);
     } else {
       return new TypeMask.nonNullExact(topmost, closedWorld);
@@ -239,22 +240,22 @@
     if (mask is FlatTypeMask) {
       if (mask.isEmptyOrNull) return null;
       if (mask.isExact) {
-        if (!closedWorld.isInstantiated(mask.base)) {
+        if (!closedWorld.classHierarchy.isInstantiated(mask.base)) {
           return 'Exact ${mask.base} is not instantiated.';
         }
         return null;
       }
       if (mask.isSubclass) {
-        if (!closedWorld.hasAnyStrictSubclass(mask.base)) {
+        if (!closedWorld.classHierarchy.hasAnyStrictSubclass(mask.base)) {
           return 'Subclass ${mask.base} does not have any subclasses.';
         }
         return null;
       }
       assert(mask.isSubtype);
-      if (!closedWorld.hasAnyStrictSubtype(mask.base)) {
+      if (!closedWorld.classHierarchy.hasAnyStrictSubtype(mask.base)) {
         return 'Subtype ${mask.base} does not have any subclasses.';
       }
-      if (closedWorld.hasOnlySubclasses(mask.base)) {
+      if (closedWorld.classHierarchy.hasOnlySubclasses(mask.base)) {
         return 'Subtype ${mask.base} only has subclasses.';
       }
       return null;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index 6121c08..0da519c 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -107,8 +107,8 @@
     for (ClassEntity candidate in candidates) {
       bool isInstantiatedStrictSubclass(cls) =>
           cls != candidate &&
-          closedWorld.isExplicitlyInstantiated(cls) &&
-          closedWorld.isSubclassOf(cls, candidate);
+          closedWorld.classHierarchy.isExplicitlyInstantiated(cls) &&
+          closedWorld.classHierarchy.isSubclassOf(cls, candidate);
 
       int size;
       int kind;
@@ -121,11 +121,12 @@
         // TODO(sigmund, johnniwinther): computing length here (and below) is
         // expensive. If we can't prevent `flatten` from being called a lot, it
         // might be worth caching results.
-        size = closedWorld.strictSubclassCount(candidate);
-        assert(size <= closedWorld.strictSubtypeCount(candidate));
+        size = closedWorld.classHierarchy.strictSubclassCount(candidate);
+        assert(
+            size <= closedWorld.classHierarchy.strictSubtypeCount(candidate));
       } else {
         kind = FlatTypeMask.SUBTYPE;
-        size = closedWorld.strictSubtypeCount(candidate);
+        size = closedWorld.classHierarchy.strictSubtypeCount(candidate);
       }
       // Update the best candidate if the new one is better.
       if (bestElement == null || size < bestSize) {
@@ -237,10 +238,10 @@
     // Check for other members.
     Iterable<ClassEntity> members;
     if (flat.isSubclass) {
-      members = closedWorld.strictSubclassesOf(flat.base);
+      members = closedWorld.classHierarchy.strictSubclassesOf(flat.base);
     } else {
       assert(flat.isSubtype);
-      members = closedWorld.strictSubtypesOf(flat.base);
+      members = closedWorld.classHierarchy.strictSubtypesOf(flat.base);
     }
     return members.every((ClassEntity cls) => this.contains(cls, closedWorld));
   }
diff --git a/pkg/compiler/lib/src/io/kernel_source_information.dart b/pkg/compiler/lib/src/io/kernel_source_information.dart
index 1b85861..6a7addf 100644
--- a/pkg/compiler/lib/src/io/kernel_source_information.dart
+++ b/pkg/compiler/lib/src/io/kernel_source_information.dart
@@ -16,14 +16,13 @@
 import 'position_information.dart';
 
 class KernelSourceInformationStrategy
-    extends AbstractPositionSourceInformationStrategy<ir.Node> {
+    extends AbstractPositionSourceInformationStrategy {
   final JsBackendStrategy _backendStrategy;
 
   const KernelSourceInformationStrategy(this._backendStrategy);
 
   @override
-  SourceInformationBuilder<ir.Node> createBuilderForContext(
-      MemberEntity member) {
+  SourceInformationBuilder createBuilderForContext(MemberEntity member) {
     return new KernelSourceInformationBuilder(
         _backendStrategy.elementMap, member);
   }
@@ -70,8 +69,7 @@
 
 /// [SourceInformationBuilder] that generates [PositionSourceInformation] from
 /// Kernel nodes.
-class KernelSourceInformationBuilder
-    implements SourceInformationBuilder<ir.Node> {
+class KernelSourceInformationBuilder implements SourceInformationBuilder {
   final KernelToElementMapForBuilding _elementMap;
   final MemberEntity _member;
   final String _name;
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 939c1c3..2356a8b 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -92,8 +92,8 @@
   }
 }
 
-abstract class AbstractPositionSourceInformationStrategy<T>
-    implements JavaScriptSourceInformationStrategy<T> {
+abstract class AbstractPositionSourceInformationStrategy
+    implements JavaScriptSourceInformationStrategy {
   const AbstractPositionSourceInformationStrategy();
 
   @override
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index 59e9b2e..5520b6d 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -4,7 +4,7 @@
 
 library dart2js.source_information;
 
-import 'package:kernel/ast.dart' show Location;
+import 'package:kernel/ast.dart' as ir;
 import '../common.dart';
 import '../elements/entities.dart';
 import '../js/js.dart' show JavaScriptNodeSourceInformation;
@@ -37,13 +37,13 @@
 }
 
 /// Strategy for creating, processing and applying [SourceInformation].
-class SourceInformationStrategy<T> {
+class SourceInformationStrategy {
   const SourceInformationStrategy();
 
   /// Create a [SourceInformationBuilder] for [member].
-  SourceInformationBuilder<T> createBuilderForContext(
+  SourceInformationBuilder createBuilderForContext(
       covariant MemberEntity member) {
-    return new SourceInformationBuilder<T>();
+    return new SourceInformationBuilder();
   }
 
   /// Generate [SourceInformation] marker for non-preamble code.
@@ -54,7 +54,7 @@
 }
 
 /// Interface for generating [SourceInformation].
-class SourceInformationBuilder<T> {
+class SourceInformationBuilder {
   const SourceInformationBuilder();
 
   /// Create a [SourceInformationBuilder] for [member].
@@ -70,51 +70,51 @@
 
   /// Generate [SourceInformation] for the generic [node].
   @deprecated
-  SourceInformation buildGeneric(T node) => null;
+  SourceInformation buildGeneric(ir.Node node) => null;
 
   /// Generate [SourceInformation] for an instantiation of a class using [node]
   /// for the source position.
-  SourceInformation buildCreate(T node) => null;
+  SourceInformation buildCreate(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the return [node].
-  SourceInformation buildReturn(T node) => null;
+  SourceInformation buildReturn(ir.Node node) => null;
 
   /// Generate [SourceInformation] for an implicit return in [element].
   SourceInformation buildImplicitReturn(covariant MemberEntity element) => null;
 
   /// Generate [SourceInformation] for the loop [node].
-  SourceInformation buildLoop(T node) => null;
+  SourceInformation buildLoop(ir.Node node) => null;
 
   /// Generate [SourceInformation] for a read access like `a.b` where in
   /// [receiver] points to the left-most part of the access, `a` in the example,
   /// and [property] points to the 'name' of accessed property, `b` in the
   /// example.
-  SourceInformation buildGet(T node) => null;
+  SourceInformation buildGet(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the read access in [node].
-  SourceInformation buildCall(T receiver, T call) => null;
+  SourceInformation buildCall(ir.Node receiver, ir.Node call) => null;
 
   /// Generate [SourceInformation] for the if statement in [node].
-  SourceInformation buildIf(T node) => null;
+  SourceInformation buildIf(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the constructor invocation in [node].
-  SourceInformation buildNew(T node) => null;
+  SourceInformation buildNew(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the throw in [node].
-  SourceInformation buildThrow(T node) => null;
+  SourceInformation buildThrow(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the assignment in [node].
-  SourceInformation buildAssignment(T node) => null;
+  SourceInformation buildAssignment(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the variable declaration inserted as
   /// first statement of a function.
   SourceInformation buildVariableDeclaration() => null;
 
   /// Generate [SourceInformation] for the await [node].
-  SourceInformation buildAwait(T node) => null;
+  SourceInformation buildAwait(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the yield or yield* [node].
-  SourceInformation buildYield(T node) => null;
+  SourceInformation buildYield(ir.Node node) => null;
 
   /// Generate [SourceInformation] for async/await boiler plate code.
   SourceInformation buildAsyncBody() => null;
@@ -123,58 +123,58 @@
   SourceInformation buildAsyncExit() => null;
 
   /// Generate [SourceInformation] for an invocation of a foreign method.
-  SourceInformation buildForeignCode(T node) => null;
+  SourceInformation buildForeignCode(ir.Node node) => null;
 
   /// Generate [SourceInformation] for a string interpolation of [node].
-  SourceInformation buildStringInterpolation(T node) => null;
+  SourceInformation buildStringInterpolation(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the for-in `iterator` access in [node].
-  SourceInformation buildForInIterator(T node) => null;
+  SourceInformation buildForInIterator(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the for-in `moveNext` call in [node].
-  SourceInformation buildForInMoveNext(T node) => null;
+  SourceInformation buildForInMoveNext(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the for-in `current` access in [node].
-  SourceInformation buildForInCurrent(T node) => null;
+  SourceInformation buildForInCurrent(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the for-in variable assignment in [node].
-  SourceInformation buildForInSet(T node) => null;
+  SourceInformation buildForInSet(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the operator `[]` access in [node].
-  SourceInformation buildIndex(T node) => null;
+  SourceInformation buildIndex(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the operator `[]=` assignment in [node].
-  SourceInformation buildIndexSet(T node) => null;
+  SourceInformation buildIndexSet(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the binary operation in [node].
-  SourceInformation buildBinary(T node) => null;
+  SourceInformation buildBinary(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the unary operation in [node].
-  SourceInformation buildUnary(T node) => null;
+  SourceInformation buildUnary(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the try statement in [node].
-  SourceInformation buildTry(T node) => null;
+  SourceInformation buildTry(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the unary operator in [node].
-  SourceInformation buildCatch(T node) => null;
+  SourceInformation buildCatch(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the is-test in [node].
-  SourceInformation buildIs(T node) => null;
+  SourceInformation buildIs(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the as-cast in [node].
-  SourceInformation buildAs(T node) => null;
+  SourceInformation buildAs(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the switch statement [node].
-  SourceInformation buildSwitch(T node) => null;
+  SourceInformation buildSwitch(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the switch case in [node].
-  SourceInformation buildSwitchCase(T node) => null;
+  SourceInformation buildSwitchCase(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the list literal in [node].
-  SourceInformation buildListLiteral(T node) => null;
+  SourceInformation buildListLiteral(ir.Node node) => null;
 
   /// Generate [SourceInformation] for the break/continue in [node].
-  SourceInformation buildGoto(T node) => null;
+  SourceInformation buildGoto(ir.Node node) => null;
 }
 
 /// A location in a source file.
@@ -221,7 +221,7 @@
 /// A location in a source file.
 abstract class AbstractSourceLocation extends SourceLocation {
   final SourceFile _sourceFile;
-  Location _location;
+  ir.Location _location;
 
   AbstractSourceLocation(this._sourceFile) {
     assert(
diff --git a/pkg/compiler/lib/src/js/js_source_mapping.dart b/pkg/compiler/lib/src/js/js_source_mapping.dart
index 4293efe..bef8c19 100644
--- a/pkg/compiler/lib/src/js/js_source_mapping.dart
+++ b/pkg/compiler/lib/src/js/js_source_mapping.dart
@@ -12,8 +12,7 @@
 
 /// [SourceInformationStrategy] that can associate source information with
 /// JavaScript output.
-class JavaScriptSourceInformationStrategy<T>
-    extends SourceInformationStrategy<T> {
+class JavaScriptSourceInformationStrategy extends SourceInformationStrategy {
   const JavaScriptSourceInformationStrategy();
 
   /// Creates a processor that can associate source information on [Node] with
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 8b424b6..116f542 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -18,12 +18,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../enqueue.dart'
-    show
-        DirectEnqueuerStrategy,
-        Enqueuer,
-        EnqueueTask,
-        ResolutionEnqueuer,
-        TreeShakingEnqueuerStrategy;
+    show Enqueuer, EnqueueTask, ResolutionEnqueuer, TreeShakingEnqueuerStrategy;
 import '../frontend_strategy.dart';
 import '../io/source_information.dart'
     show SourceInformation, SourceInformationStrategy;
@@ -37,8 +32,9 @@
 import '../native/native.dart' as native;
 import '../ssa/ssa.dart' show SsaFunctionCompiler;
 import '../tracer.dart';
+import '../types/types.dart';
 import '../universe/call_structure.dart' show CallStructure;
-import '../universe/class_hierarchy_builder.dart'
+import '../universe/class_hierarchy.dart'
     show ClassHierarchyBuilder, ClassQueries;
 import '../universe/selector.dart' show Selector;
 import '../universe/use.dart' show StaticUse;
@@ -72,7 +68,8 @@
   void onCodegenStart();
 
   /// Generates JavaScript code for `work.element`.
-  jsAst.Fun compile(CodegenWorkItem work, JClosedWorld closedWorld);
+  jsAst.Fun compile(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults);
 
   Iterable get tasks;
 }
@@ -596,9 +593,7 @@
         task,
         compiler.options,
         compiler.reporter,
-        compiler.options.analyzeOnly && compiler.options.analyzeMain
-            ? const DirectEnqueuerStrategy()
-            : const TreeShakingEnqueuerStrategy(),
+        const TreeShakingEnqueuerStrategy(),
         new ResolutionEnqueuerListener(
             compiler.options,
             elementEnvironment,
@@ -635,7 +630,10 @@
 
   /// Creates an [Enqueuer] for code generation specific to this backend.
   CodegenEnqueuer createCodegenEnqueuer(
-      CompilerTask task, Compiler compiler, JClosedWorld closedWorld) {
+      CompilerTask task,
+      Compiler compiler,
+      JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     CommonElements commonElements = closedWorld.commonElements;
     BackendImpacts impacts =
@@ -661,7 +659,8 @@
             closedWorld.nativeData,
             closedWorld,
             compiler.abstractValueStrategy.createSelectorStrategy()),
-        compiler.backendStrategy.createCodegenWorkItemBuilder(closedWorld),
+        compiler.backendStrategy
+            .createCodegenWorkItemBuilder(closedWorld, globalInferenceResults),
         new CodegenEnqueuerListener(
             elementEnvironment,
             commonElements,
@@ -675,7 +674,8 @@
   static bool cacheCodegenImpactForTesting = false;
   Map<MemberEntity, WorldImpact> codegenImpactsForTesting;
 
-  WorldImpact codegen(CodegenWorkItem work, JClosedWorld closedWorld) {
+  WorldImpact codegen(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
     MemberEntity element = work.element;
     if (compiler.elementHasCompileTimeError(element)) {
       DiagnosticMessage message =
@@ -696,7 +696,8 @@
       return const WorldImpact();
     }
 
-    jsAst.Fun function = functionCompiler.compile(work, closedWorld);
+    jsAst.Fun function =
+        functionCompiler.compile(work, closedWorld, globalInferenceResults);
     if (function != null) {
       if (function.sourceInformation == null) {
         function = function.withSourceInformation(
@@ -730,8 +731,8 @@
   }
 
   /// Generates the output and returns the total size of the generated code.
-  int assembleProgram(JClosedWorld closedWorld) {
-    int programSize = emitter.assembleProgram(namer, closedWorld);
+  int assembleProgram(JClosedWorld closedWorld, InferredData inferredData) {
+    int programSize = emitter.assembleProgram(namer, closedWorld, inferredData);
     closedWorld.noSuchMethodData.emitDiagnostic(reporter);
     return programSize;
   }
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 9adf701..361ac44 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -448,7 +448,6 @@
     return _typeVariableExpression ??= new BackendImpact(staticUses: [
       _commonElements.setRuntimeTypeInfo,
       _commonElements.getRuntimeTypeInfo,
-      _commonElements.runtimeTypeToString,
       _commonElements.createRuntimeType
     ], otherImpacts: [
       listValues,
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 0ce6141..f3e8913 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -16,7 +16,6 @@
 import 'allocator_analysis.dart' show JAllocatorAnalysis;
 import 'constant_system_javascript.dart';
 import 'js_backend.dart';
-import 'namer.dart';
 import 'runtime_types.dart';
 
 typedef jsAst.Expression _ConstantReferenceGenerator(ConstantValue constant);
@@ -42,7 +41,6 @@
   final RuntimeTypesNeed _rtiNeed;
   final RuntimeTypesEncoder _rtiEncoder;
   final JAllocatorAnalysis _allocatorAnalysis;
-  final Namer _namer;
   final CodeEmitterTask _task;
   final _ConstantReferenceGenerator constantReferenceGenerator;
   final _ConstantListGenerator makeConstantList;
@@ -59,7 +57,6 @@
       this._rtiNeed,
       this._rtiEncoder,
       this._allocatorAnalysis,
-      this._namer,
       this._task,
       this.constantReferenceGenerator,
       this.makeConstantList);
@@ -280,19 +277,21 @@
 
   @override
   jsAst.Expression visitType(TypeConstantValue constant, [_]) {
-    DartType type = constant.representedType;
-    jsAst.Name typeName;
-    Entity element;
-    if (type is InterfaceType) {
-      element = type.element;
-    } else if (type is TypedefType) {
-      element = type.element;
-    } else {
-      assert(type is DynamicType);
+    DartType type = constant.representedType.unaliased;
+
+    jsAst.Expression unexpected(TypeVariableType _variable) {
+      TypeVariableType variable = _variable;
+      throw failedAt(
+          NO_LOCATION_SPANNABLE,
+          "Unexpected type variable '${variable}'"
+          " in constant '${constant.toDartText()}'");
     }
-    typeName = _namer.runtimeTypeName(element);
-    return new jsAst.Call(getHelperProperty(_commonElements.createRuntimeType),
-        [js.quoteName(typeName)]);
+
+    jsAst.Expression rti =
+        _rtiEncoder.getTypeRepresentation(_emitter, type, unexpected);
+
+    return new jsAst.Call(
+        getHelperProperty(_commonElements.createRuntimeType), [rti]);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 4e72531..7d9d0b3 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -210,6 +210,9 @@
           _worldBuilder.registerTypeVariableTypeLiteral(type);
         }
         break;
+      case TypeUseKind.RTI_VALUE:
+        _worldBuilder.registerTypeArgument(type);
+        break;
     }
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index a438262..a4fb279 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -4,7 +4,7 @@
 
 library js_backend.backend.impact_transformer;
 
-import '../universe/class_hierarchy_builder.dart' show ClassHierarchyBuilder;
+import '../universe/class_hierarchy.dart' show ClassHierarchyBuilder;
 
 import '../common.dart';
 import '../common_elements.dart';
@@ -202,6 +202,9 @@
           }
           hasTypeLiteral = true;
           break;
+        case TypeUseKind.RTI_VALUE:
+          failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
+          break;
       }
     }
 
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index abed251..f621411 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -182,7 +182,8 @@
     Iterable<ClassEntity> uses = closedWorld.mixinUsesOf(mixin);
     Set<ClassEntity> result = null;
     for (ClassEntity use in uses) {
-      closedWorld.forEachStrictSubclassOf(use, (ClassEntity subclass) {
+      closedWorld.classHierarchy.forEachStrictSubclassOf(use,
+          (ClassEntity subclass) {
         if (_nativeData.isNativeOrExtendsNative(subclass)) {
           if (result == null) result = new Set<ClassEntity>();
           result.add(subclass);
@@ -212,7 +213,7 @@
     InterfaceType interfaceType = type;
     ClassEntity classElement = interfaceType.element;
     if (isInterceptedClass(classElement)) return false;
-    return closedWorld.hasOnlySubclasses(classElement);
+    return closedWorld.classHierarchy.hasOnlySubclasses(classElement);
   }
 }
 
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index a449b52..00dd8de 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -13,10 +13,11 @@
 import '../js/js.dart' show js;
 import '../js_emitter/js_emitter.dart' show Emitter;
 import '../options.dart';
+import '../universe/class_hierarchy.dart';
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
-import '../world.dart' show ClassQuery, JClosedWorld, KClosedWorld;
+import '../world.dart' show JClosedWorld, KClosedWorld;
 import 'backend_usage.dart';
 import 'namer.dart';
 import 'native_data.dart';
@@ -241,7 +242,7 @@
     rtiChecksBuilderClosed = true;
 
     Map<ClassEntity, ClassUse> classUseMap = <ClassEntity, ClassUse>{};
-    for (ClassEntity cls in _closedWorld
+    for (ClassEntity cls in _closedWorld.classHierarchy
         .getClassSet(_closedWorld.commonElements.objectClass)
         .subtypes()) {
       ClassUse classUse = new ClassUse()
@@ -249,6 +250,7 @@
         ..checkedInstance = true
         ..typeArgument = true
         ..checkedTypeArgument = true
+        ..typeLiteral = true
         ..functionType = _computeFunctionType(_elementEnvironment, cls,
             strongMode: options.strongMode);
       classUseMap[cls] = classUse;
@@ -260,7 +262,7 @@
 
   Set<ClassEntity> computeCheckedClasses(
       CodegenWorldBuilder codegenWorldBuilder, Set<DartType> implicitIsChecks) {
-    return _closedWorld
+    return _closedWorld.classHierarchy
         .getClassSet(_closedWorld.commonElements.objectClass)
         .subtypes()
         .toSet();
@@ -339,10 +341,12 @@
 
       bool isNativeClass = _closedWorld.nativeData.isNativeClass(cls);
       if (classUse.typeArgument ||
+          classUse.typeLiteral ||
           (isNativeClass && classUse.checkedInstance)) {
         Substitution substitution = computeSubstitution(cls, cls);
         // We need [cls] at runtime - even if [cls] is not instantiated. Either
-        // as a type argument or for an is-test if [cls] is native.
+        // as a type argument, for a type literal or for an is-test if [cls] is
+        // native.
         checks.add(new TypeCheck(cls, substitution, needsIs: isNativeClass));
       }
 
@@ -491,7 +495,7 @@
 
     for (ClassEntity cls in classUseMap.keys) {
       ClassUse classUse = classUseMap[cls] ?? emptyUse;
-      if (classUse.instance || classUse.typeArgument) {
+      if (classUse.instance || classUse.typeArgument || classUse.typeLiteral) {
         // Add checks only for classes that are live either as instantiated
         // classes or type arguments passed at runtime.
         computeChecks(cls);
@@ -1469,7 +1473,8 @@
         classesNeedingTypeArguments.add(cls);
 
         // TODO(ngeoffray): This should use subclasses, not subtypes.
-        closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity sub) {
+        closedWorld.classHierarchy.forEachStrictSubtypeOf(cls,
+            (ClassEntity sub) {
           potentiallyNeedTypeArguments(sub);
         });
       } else if (entity is FunctionEntity) {
@@ -1694,19 +1699,31 @@
                 impliedClass(runtimeTypeUse.argumentType);
 
             // TODO(johnniwinther): Special case use of `this.runtimeType`.
-            if (closedWorld.isSubtypeOf(receiverClass, argumentClass)) {
-              addClass(receiverClass);
-            } else if (closedWorld.isSubtypeOf(argumentClass, receiverClass)) {
-              addClass(argumentClass);
+            SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
+                receiverClass,
+                ClassQuery.SUBTYPE,
+                argumentClass,
+                ClassQuery.SUBTYPE);
+            switch (result.kind) {
+              case SubclassResultKind.EMPTY:
+                break;
+              case SubclassResultKind.EXACT1:
+              case SubclassResultKind.SUBCLASS1:
+              case SubclassResultKind.SUBTYPE1:
+                addClass(receiverClass);
+                break;
+              case SubclassResultKind.EXACT2:
+              case SubclassResultKind.SUBCLASS2:
+              case SubclassResultKind.SUBTYPE2:
+                addClass(argumentClass);
+                break;
+              case SubclassResultKind.SET:
+                for (ClassEntity cls in result.classes) {
+                  addClass(cls);
+                  if (neededOnAll) break;
+                }
+                break;
             }
-            if (neededOnAll) break;
-            // TODO(johnniwinther): Special case use of `this.runtimeType`.
-            // TODO(johnniwinther): Rename [commonSubclasses] to something like
-            // [strictCommonClasses] and support the non-strict case directly.
-            // Since we do a subclassesOf
-            classesDirectlyNeedingRuntimeType.addAll(
-                closedWorld.commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
-                    argumentClass, ClassQuery.SUBTYPE));
             break;
           case RuntimeTypeUseKind.unknown:
             addClass(impliedClass(runtimeTypeUse.receiverType));
@@ -1717,15 +1734,17 @@
       Set<ClassEntity> allClassesNeedingRuntimeType;
       if (neededOnAll) {
         neededOnFunctions = true;
-        allClassesNeedingRuntimeType =
-            closedWorld.subclassesOf(commonElements.objectClass).toSet();
+        allClassesNeedingRuntimeType = closedWorld.classHierarchy
+            .subclassesOf(commonElements.objectClass)
+            .toSet();
       } else {
         allClassesNeedingRuntimeType = new Set<ClassEntity>();
         // TODO(johnniwinther): Support this operation directly in
         // [ClosedWorld] using the [ClassSet]s.
         for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
           if (!allClassesNeedingRuntimeType.contains(cls)) {
-            allClassesNeedingRuntimeType.addAll(closedWorld.subtypesOf(cls));
+            allClassesNeedingRuntimeType
+                .addAll(closedWorld.classHierarchy.subtypesOf(cls));
           }
         }
       }
@@ -1919,54 +1938,69 @@
     Set<FunctionType> checkedFunctionTypes = new Set<FunctionType>();
 
     TypeVisitor liveTypeVisitor =
-        new TypeVisitor(onClass: (ClassEntity cls, {bool inTypeArgument}) {
+        new TypeVisitor(onClass: (ClassEntity cls, {TypeVisitorState state}) {
       ClassUse classUse = classUseMap.putIfAbsent(cls, () => new ClassUse());
-      if (inTypeArgument) {
-        classUse.typeArgument = true;
+      switch (state) {
+        case TypeVisitorState.typeArgument:
+          classUse.typeArgument = true;
+          break;
+        case TypeVisitorState.typeLiteral:
+          classUse.typeLiteral = true;
+          break;
+        case TypeVisitorState.direct:
+          break;
       }
     });
 
     TypeVisitor testedTypeVisitor =
-        new TypeVisitor(onClass: (ClassEntity cls, {bool inTypeArgument}) {
+        new TypeVisitor(onClass: (ClassEntity cls, {TypeVisitorState state}) {
       ClassUse classUse = classUseMap.putIfAbsent(cls, () => new ClassUse());
-      if (inTypeArgument) {
-        classUse.typeArgument = true;
-        classUse.checkedTypeArgument = true;
-      } else {
-        classUse.checkedInstance = true;
+      switch (state) {
+        case TypeVisitorState.typeArgument:
+          classUse.typeArgument = true;
+          classUse.checkedTypeArgument = true;
+          break;
+        case TypeVisitorState.typeLiteral:
+          break;
+        case TypeVisitorState.direct:
+          classUse.checkedInstance = true;
+          break;
       }
     });
 
     codegenWorldBuilder.instantiatedTypes.forEach((InterfaceType type) {
-      liveTypeVisitor.visitType(type, false);
+      liveTypeVisitor.visitType(type, TypeVisitorState.direct);
       ClassUse classUse =
           classUseMap.putIfAbsent(type.element, () => new ClassUse());
       classUse.instance = true;
       FunctionType callType = _types.getCallType(type);
       if (callType != null) {
-        testedTypeVisitor.visitType(callType, false);
+        testedTypeVisitor.visitType(callType, TypeVisitorState.direct);
       }
     });
 
     for (FunctionEntity element
         in codegenWorldBuilder.staticFunctionsNeedingGetter) {
       FunctionType functionType = _elementEnvironment.getFunctionType(element);
-      testedTypeVisitor.visitType(functionType, false);
+      testedTypeVisitor.visitType(functionType, TypeVisitorState.direct);
     }
 
     for (FunctionEntity element in codegenWorldBuilder.closurizedMembers) {
       FunctionType functionType = _elementEnvironment.getFunctionType(element);
-      testedTypeVisitor.visitType(functionType, false);
+      testedTypeVisitor.visitType(functionType, TypeVisitorState.direct);
     }
 
     void processMethodTypeArguments(_, Set<DartType> typeArguments) {
       for (DartType typeArgument in typeArguments) {
-        liveTypeVisitor.visit(typeArgument, true);
+        liveTypeVisitor.visit(typeArgument, TypeVisitorState.typeArgument);
       }
     }
 
     codegenWorldBuilder.forEachStaticTypeArgument(processMethodTypeArguments);
     codegenWorldBuilder.forEachDynamicTypeArgument(processMethodTypeArguments);
+    codegenWorldBuilder.constTypeLiterals.forEach((DartType type) {
+      liveTypeVisitor.visitType(type, TypeVisitorState.typeLiteral);
+    });
 
     bool isFunctionChecked = false;
 
@@ -1977,7 +2011,7 @@
         isFunctionChecked =
             isFunctionChecked || t.element == _commonElements.functionClass;
       }
-      testedTypeVisitor.visitType(t, false);
+      testedTypeVisitor.visitType(t, TypeVisitorState.direct);
     }
 
     explicitIsChecks.forEach(processCheckedType);
@@ -2041,7 +2075,7 @@
             DartType bound =
                 _elementEnvironment.getTypeVariableBound(typeVariable.element);
             processCheckedType(bound);
-            liveTypeVisitor.visit(bound, true);
+            liveTypeVisitor.visit(bound, TypeVisitorState.typeArgument);
           }
         }
       }
@@ -2318,6 +2352,7 @@
   final NativeBasicData _nativeData;
   // If true, compile using strong mode.
   final bool _strongMode;
+
   OnVariableCallback onVariable;
   ShouldEncodeTypedefCallback shouldEncodeTypedef;
   Map<TypeVariableType, jsAst.Expression> typedefBindings;
@@ -2397,7 +2432,7 @@
   jsAst.Expression visitInterfaceType(InterfaceType type, Emitter emitter) {
     jsAst.Expression name = getJavaScriptClassName(type.element, emitter);
     jsAst.Expression result;
-    if (type.treatAsRaw) {
+    if ((!_strongMode && type.treatAsRaw) || type.typeArguments.isEmpty) {
       result = name;
     } else {
       // Visit all type arguments. This is done even for jsinterop classes to
@@ -2754,64 +2789,73 @@
       'TypeCheck(cls=$cls,needsIs=$needsIs,substitution=$substitution)';
 }
 
-class TypeVisitor extends DartTypeVisitor<void, bool> {
+enum TypeVisitorState { direct, typeArgument, typeLiteral }
+
+class TypeVisitor extends DartTypeVisitor<void, TypeVisitorState> {
   Set<FunctionTypeVariable> _visitedFunctionTypeVariables =
       new Set<FunctionTypeVariable>();
 
-  final void Function(ClassEntity entity, {bool inTypeArgument}) onClass;
-  final void Function(TypeVariableEntity entity, {bool inTypeArgument})
+  final void Function(ClassEntity entity, {TypeVisitorState state}) onClass;
+  final void Function(TypeVariableEntity entity, {TypeVisitorState state})
       onTypeVariable;
-  final void Function(FunctionType type, {bool inTypeArgument}) onFunctionType;
+  final void Function(FunctionType type, {TypeVisitorState state})
+      onFunctionType;
 
   TypeVisitor({this.onClass, this.onTypeVariable, this.onFunctionType});
 
-  visitType(DartType type, bool inTypeArgument) =>
-      type.accept(this, inTypeArgument);
+  visitType(DartType type, TypeVisitorState state) => type.accept(this, state);
 
-  visitTypes(List<DartType> types, bool inTypeArgument) {
+  visitTypes(List<DartType> types, TypeVisitorState state) {
     for (DartType type in types) {
-      visitType(type, inTypeArgument);
+      visitType(type, state);
     }
   }
 
   @override
-  void visitTypeVariableType(TypeVariableType type, bool inTypeArgument) {
+  void visitTypeVariableType(TypeVariableType type, TypeVisitorState state) {
     if (onTypeVariable != null) {
-      onTypeVariable(type.element, inTypeArgument: inTypeArgument);
+      onTypeVariable(type.element, state: state);
     }
   }
 
   @override
-  visitInterfaceType(InterfaceType type, bool inTypeArgument) {
+  visitInterfaceType(InterfaceType type, TypeVisitorState state) {
     if (onClass != null) {
-      onClass(type.element, inTypeArgument: inTypeArgument);
+      onClass(type.element, state: state);
     }
-    visitTypes(type.typeArguments, true);
+    visitTypes(
+        type.typeArguments,
+        state == TypeVisitorState.typeLiteral
+            ? state
+            : TypeVisitorState.typeArgument);
   }
 
   @override
-  visitFunctionType(FunctionType type, bool inTypeArgument) {
+  visitFunctionType(FunctionType type, TypeVisitorState state) {
     if (onFunctionType != null) {
-      onFunctionType(type, inTypeArgument: inTypeArgument);
+      onFunctionType(type, state: state);
     }
     // Visit all nested types as type arguments; these types are not runtime
     // instances but runtime type representations.
-    visitType(type.returnType, true);
-    visitTypes(type.parameterTypes, true);
-    visitTypes(type.optionalParameterTypes, true);
-    visitTypes(type.namedParameterTypes, true);
+    state = state == TypeVisitorState.typeLiteral
+        ? state
+        : TypeVisitorState.typeArgument;
+    visitType(type.returnType, state);
+    visitTypes(type.parameterTypes, state);
+    visitTypes(type.optionalParameterTypes, state);
+    visitTypes(type.namedParameterTypes, state);
     _visitedFunctionTypeVariables.removeAll(type.typeVariables);
   }
 
   @override
-  visitTypedefType(TypedefType type, bool inTypeArgument) {
-    visitType(type.unaliased, inTypeArgument);
+  visitTypedefType(TypedefType type, TypeVisitorState state) {
+    visitType(type.unaliased, state);
   }
 
   @override
-  visitFunctionTypeVariable(FunctionTypeVariable type, bool inTypeArgument) {
+  visitFunctionTypeVariable(FunctionTypeVariable type, TypeVisitorState state) {
     if (_visitedFunctionTypeVariables.add(type)) {
-      visitType(type.bound, inTypeArgument);
+      visitType(type.bound, state);
     }
   }
 }
@@ -2898,6 +2942,17 @@
   ///
   bool checkedTypeArgument = false;
 
+  /// Whether the class is used in a constant type literal.
+  ///
+  /// For instance `A`, `B` and `C` in:
+  ///
+  ///     class A {}
+  ///     class B<T> {}
+  ///     class C {}
+  ///     main() => A == B<C>;
+  ///
+  bool typeLiteral = false;
+
   /// The function type of the class, if any.
   ///
   /// This is only set if the function type is needed at runtime. For instance,
@@ -2926,6 +2981,9 @@
     if (checkedTypeArgument) {
       properties.add('checkedTypeArgument');
     }
+    if (typeLiteral) {
+      properties.add('rtiValue');
+    }
     if (functionType != null) {
       properties.add('functionType');
     }
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index c72190e..d51e23b 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -14,6 +14,7 @@
 import '../elements/entities.dart';
 import '../js/js.dart' as jsAst;
 import '../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
+import '../js_backend/inferred_data.dart';
 import '../universe/world_builder.dart' show CodegenWorldBuilder;
 import '../world.dart' show JClosedWorld;
 import 'full_emitter/emitter.dart' as full_js_emitter;
@@ -169,7 +170,8 @@
     });
   }
 
-  int assembleProgram(Namer namer, JClosedWorld closedWorld) {
+  int assembleProgram(
+      Namer namer, JClosedWorld closedWorld, InferredData inferredData) {
     return measure(() {
       _finalizeRti();
       ProgramBuilder programBuilder = new ProgramBuilder(
@@ -199,7 +201,7 @@
           this,
           closedWorld,
           closedWorld.allocatorAnalysis,
-          compiler.globalInference.inferredData,
+          inferredData,
           backend.sourceInformationStrategy,
           compiler.backendStrategy.sorter,
           typeTestRegistry.rtiNeededClasses,
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 19692ba..d9910c9 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -167,7 +167,6 @@
         _closedWorld.rtiNeed,
         compiler.backend.rtiEncoder,
         _closedWorld.allocatorAnalysis,
-        namer,
         task,
         this.constantReference,
         constantListGenerator);
@@ -656,8 +655,8 @@
   buildMain(jsAst.Statement invokeMain) {
     List<jsAst.Statement> parts = <jsAst.Statement>[];
 
-    if (NativeGenerator
-        .needsIsolateAffinityTagInitialization(_closedWorld.backendUsage)) {
+    if (NativeGenerator.needsIsolateAffinityTagInitialization(
+        _closedWorld.backendUsage)) {
       parts.add(NativeGenerator.generateIsolateAffinityTagInitialization(
           _closedWorld.backendUsage, generateEmbeddedGlobalAccess, js("""
         // On V8, the 'intern' function converts a string to a symbol, which
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index f5d7ab1..547f81d 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -301,8 +301,8 @@
       bool containsJsIndexable = _closedWorld
               .isImplemented(_commonElements.jsIndexingBehaviorInterface) &&
           classes.any((cls) {
-            return _closedWorld.isSubtypeOf(
-                cls, _commonElements.jsIndexingBehaviorInterface);
+            return _closedWorld.classHierarchy
+                .isSubtypeOf(cls, _commonElements.jsIndexingBehaviorInterface);
           });
       // The index set operator requires a check on its set value in
       // checked mode, so we don't optimize the interceptor if the
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 2fc04b0..26ac418 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
@@ -1564,8 +1564,8 @@
 
     // The isolate-affinity tag must only be initialized once per program.
     if (fragment.isMainFragment &&
-        NativeGenerator
-            .needsIsolateAffinityTagInitialization(_closedWorld.backendUsage)) {
+        NativeGenerator.needsIsolateAffinityTagInitialization(
+            _closedWorld.backendUsage)) {
       statements.add(NativeGenerator.generateIsolateAffinityTagInitialization(
           _closedWorld.backendUsage, generateEmbeddedGlobalAccess, js.js("""
         // On V8, the 'intern' function converts a string to a symbol, which
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 46bce90..2f22884 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
@@ -84,7 +84,6 @@
         _closedWorld.rtiNeed,
         compiler.backend.rtiEncoder,
         _closedWorld.allocatorAnalysis,
-        namer,
         task,
         this.generateConstantReference,
         constantListGenerator);
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index e6cd967..f4d37d7 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -74,7 +74,7 @@
 // TODO(efortuna): Change inheritance hierarchy so that the
 // ClosureConversionTask doesn't inherit from ClosureTask because it's just a
 // glorified timer.
-class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
+class KernelClosureConversionTask extends ClosureConversionTask {
   final KernelToElementMapForBuilding _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
   final CompilerOptions _options;
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 5f2a4a1..17de922 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -9,6 +9,7 @@
 import '../elements/names.dart';
 import '../elements/types.dart';
 import '../kernel/indexed.dart';
+import '../universe/class_set.dart' show ClassHierarchyNodesMapKey;
 
 /// Map from 'frontend' to 'backend' elements.
 ///
@@ -275,7 +276,9 @@
   @override
   DartType visitTypedefType(TypedefType type, EntityConverter converter) {
     return new TypedefType(
-        converter(type.element), visitList(type.typeArguments, converter));
+        converter(type.element),
+        visitList(type.typeArguments, converter),
+        visit(type.unaliased, converter));
   }
 
   @override
@@ -323,7 +326,7 @@
   String toString() => '${jsElementPrefix}library($name)';
 }
 
-class JClass extends IndexedClass {
+class JClass extends IndexedClass with ClassHierarchyNodesMapKey {
   final JLibrary library;
 
   final String name;
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 6b68731..a613ed6 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -181,7 +181,7 @@
   @override
   SourceInformationStrategy get sourceInformationStrategy {
     if (!_compiler.options.generateSourceMap) {
-      return const JavaScriptSourceInformationStrategy<ir.Node>();
+      return const JavaScriptSourceInformationStrategy();
     }
     return new KernelSourceInformationStrategy(this);
   }
@@ -194,8 +194,10 @@
   }
 
   @override
-  WorkItemBuilder createCodegenWorkItemBuilder(JClosedWorld closedWorld) {
-    return new KernelCodegenWorkItemBuilder(_compiler.backend, closedWorld);
+  WorkItemBuilder createCodegenWorkItemBuilder(JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
+    return new KernelCodegenWorkItemBuilder(
+        _compiler.backend, closedWorld, globalInferenceResults);
   }
 
   @override
@@ -230,7 +232,7 @@
 class JsClosedWorldBuilder {
   final JsKernelToElementMap _elementMap;
   final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes =
-      <ClassEntity, ClassHierarchyNode>{};
+      new ClassHierarchyNodesMap();
   final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{};
   final KernelClosureConversionTask _closureConversionTask;
   final CompilerOptions _options;
@@ -289,10 +291,10 @@
       });
     }
 
-    closedWorld
+    closedWorld.classHierarchy
         .getClassHierarchyNode(closedWorld.commonElements.objectClass)
         .forEachSubclass((ClassEntity cls) {
-      convertClassSet(closedWorld.getClassSet(cls));
+      convertClassSet(closedWorld.classHierarchy.getClassSet(cls));
     }, ClassHierarchyNode.ALL);
 
     Set<MemberEntity> liveInstanceMembers =
@@ -674,11 +676,6 @@
   AbstractValueDomain get abstractValueDomain {
     return _abstractValueDomain;
   }
-
-  @override
-  void registerClosureClass(ClassEntity cls) {
-    throw new UnsupportedError('JsClosedWorld.registerClosureClass');
-  }
 }
 
 class ConstantConverter implements ConstantValueVisitor<ConstantValue, Null> {
@@ -830,7 +827,8 @@
   DartType visitTypedefType(TypedefType type, _) {
     var element = toBackendEntity(type.element);
     var args = _visitList(type.typeArguments);
-    return new TypedefType(element, args);
+    var unaliased = convert(type.unaliased);
+    return new TypedefType(element, args, unaliased);
   }
 
   List<DartType> _visitList(List<DartType> list) =>
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index 1c1d2f6..efd2e7f 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -194,9 +194,9 @@
     });
   }
 
-  JLabelDefinition _getOrCreateLabel(JJumpTarget target, ir.Node node) {
+  JLabelDefinition _getOrCreateLabel(JJumpTarget target) {
     if (target.labels.isEmpty) {
-      return target.addLabel(node, 'label${labelIndex++}');
+      return target.addLabel('label${labelIndex++}');
     } else {
       return target.labels.single;
     }
@@ -268,7 +268,7 @@
         search = search.parent;
       }
       if (needsLabel) {
-        JLabelDefinition label = _getOrCreateLabel(target, node.target);
+        JLabelDefinition label = _getOrCreateLabel(target);
         label.isBreakTarget = true;
       }
     } else if (canBeContinueTarget(parent)) {
@@ -292,7 +292,7 @@
         search = search.parent;
       }
       if (needsLabel) {
-        JLabelDefinition label = _getOrCreateLabel(target, node.target);
+        JLabelDefinition label = _getOrCreateLabel(target);
         label.isContinueTarget = true;
       }
     } else {
@@ -305,7 +305,7 @@
       // and label is therefore always needed.
       target = _getJumpTarget(node.target);
       target.isBreakTarget = true;
-      JLabelDefinition label = _getOrCreateLabel(target, node.target);
+      JLabelDefinition label = _getOrCreateLabel(target);
       label.isBreakTarget = true;
     }
     jumpTargetMap[node] = target;
@@ -317,7 +317,7 @@
     JJumpTarget target = _getJumpTarget(node.target);
     target.isContinueTarget = true;
     jumpTargetMap[node] = target;
-    JLabelDefinition label = _getOrCreateLabel(target, node.target);
+    JLabelDefinition label = _getOrCreateLabel(target);
     label.isContinueTarget = true;
     super.visitContinueSwitchStatement(node);
   }
@@ -335,10 +335,10 @@
   }
 }
 
-class JJumpTarget extends JumpTarget<ir.Node> {
+class JJumpTarget extends JumpTarget {
   final MemberEntity memberContext;
   final int nestingLevel;
-  List<LabelDefinition<ir.Node>> _labels;
+  List<LabelDefinition> _labels;
   final bool isSwitch;
   final bool isSwitchCase;
 
@@ -349,24 +349,18 @@
   bool isContinueTarget = false;
 
   @override
-  LabelDefinition<ir.Node> addLabel(ir.Node label, String labelName,
+  LabelDefinition addLabel(String labelName,
       {bool isBreakTarget: false, bool isContinueTarget: false}) {
-    _labels ??= <LabelDefinition<ir.Node>>[];
-    LabelDefinition<ir.Node> labelDefinition = new JLabelDefinition(
-        this, labelName,
+    _labels ??= <LabelDefinition>[];
+    LabelDefinition labelDefinition = new JLabelDefinition(this, labelName,
         isBreakTarget: isBreakTarget, isContinueTarget: isContinueTarget);
     _labels.add(labelDefinition);
     return labelDefinition;
   }
 
   @override
-  List<LabelDefinition<ir.Node>> get labels {
-    return _labels ?? const <LabelDefinition<ir.Node>>[];
-  }
-
-  @override
-  ir.Node get statement {
-    throw new UnimplementedError('JJumpTarget.statement');
+  List<LabelDefinition> get labels {
+    return _labels ?? const <LabelDefinition>[];
   }
 
   String toString() {
@@ -389,8 +383,8 @@
   }
 }
 
-class JLabelDefinition extends LabelDefinition<ir.Node> {
-  final JumpTarget<ir.Node> target;
+class JLabelDefinition extends LabelDefinition {
+  final JumpTarget target;
   final String labelName;
   bool isBreakTarget;
   bool isContinueTarget;
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 1af442c..cdbfe78 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -43,7 +43,7 @@
 import '../ordered_typeset.dart';
 import '../ssa/kernel_impact.dart';
 import '../ssa/type_builder.dart';
-import '../universe/class_hierarchy_builder.dart';
+import '../universe/class_hierarchy.dart';
 import '../universe/class_set.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
@@ -983,7 +983,8 @@
     TypedefType typedefType = new TypedefType(
         typedef,
         new List<DartType>.filled(
-            node.typeParameters.length, const DynamicType()));
+            node.typeParameters.length, const DynamicType()),
+        getDartType(node.type));
     return _typedefs.register(
         typedef, new TypedefData(node, typedef, typedefType));
   }
@@ -1820,6 +1821,11 @@
             elementMap.getTypeVariable(node.parameter));
       }
     }
+    if (node.parameter.parent is ir.Typedef) {
+      // Typedefs are only used in type literals so we never need their type
+      // variables.
+      return const DynamicType();
+    }
     return new TypeVariableType(elementMap.getTypeVariable(node.parameter));
   }
 
@@ -2013,8 +2019,8 @@
   @override
   bool hasConcreteMatch(ClassEntity cls, Selector selector,
       {ClassEntity stopAtSuperclass}) {
-    assert(
-        isInstantiated(cls), failedAt(cls, '$cls has not been instantiated.'));
+    assert(classHierarchy.isInstantiated(cls),
+        failedAt(cls, '$cls has not been instantiated.'));
     MemberEntity element = elementEnvironment
         .lookupClassMember(cls, selector.name, setter: selector.isSetter);
     if (element == null) return false;
@@ -2057,13 +2063,6 @@
   OrderedTypeSet getOrderedTypeSet(ClassEntity cls) {
     return elementMap._getOrderedTypeSet(cls);
   }
-
-  @override
-  bool checkInvariants(ClassEntity cls, {bool mustBeInstantiated: true}) =>
-      true;
-
-  @override
-  bool checkEntity(Entity element) => true;
 }
 
 class KClosedWorldImpl extends ClosedWorldRtiNeedMixin implements KClosedWorld {
@@ -2080,9 +2079,6 @@
 
   final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
 
-  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
-  final Map<ClassEntity, ClassSet> _classSets;
-
   // TODO(johnniwinther): Can this be derived from [ClassSet]s?
   final Set<ClassEntity> _implementedClasses;
 
@@ -2096,6 +2092,8 @@
 
   final Iterable<MemberEntity> processedMembers;
 
+  final ClassHierarchy classHierarchy;
+
   KClosedWorldImpl(this.elementMap,
       {CompilerOptions options,
       this.elementEnvironment,
@@ -2118,8 +2116,8 @@
       Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
       Map<ClassEntity, ClassSet> classSets})
       : _implementedClasses = implementedClasses,
-        _classHierarchyNodes = classHierarchyNodes,
-        _classSets = classSets {
+        classHierarchy = new ClassHierarchyImpl(
+            commonElements, classHierarchyNodes, classSets) {
     computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
   }
 
@@ -2127,152 +2125,6 @@
   bool isImplemented(ClassEntity cls) {
     return _implementedClasses.contains(cls);
   }
-
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
-    return _classHierarchyNodes[cls];
-  }
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls) {
-    return _classSets[cls];
-  }
-
-  // TODO(johnniwinther): Share the methods based on [ClassSet] and
-  // [ClassHierarchyNode] between KClosedWorld and JClosedWorld.
-  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
-  /// instance of [y].
-  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
-    ClassSet classSet = _classSets[y];
-    assert(classSet != null,
-        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
-    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
-    assert(classHierarchyNode != null,
-        failedAt(x, "No ClassHierarchyNode for $x"));
-    return classSet.hasSubtype(classHierarchyNode);
-  }
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      return const <ClassEntity>[];
-    } else {
-      return classSet
-          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-    }
-  }
-
-  /// Returns an iterable over the directly instantiated classes that extend
-  /// [cls] possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
-    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
-    if (hierarchy == null) return const <ClassEntity>[];
-    return hierarchy
-        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-  }
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// _not_ including [cls].
-  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      return const <ClassEntity>[];
-    } else {
-      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-          strict: true);
-    }
-  }
-
-  Iterable<ClassEntity> getInterfaces(ClassEntity cls) {
-    return elementMap._getInterfaces(cls).map((t) => t.element);
-  }
-
-  ClassEntity getSuperClass(ClassEntity cls) {
-    return elementMap._getSuperType(cls)?.element;
-  }
-
-  /// Returns an iterable over the directly instantiated classes that extend
-  /// [cls] _not_ including [cls] itself.
-  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return const <ClassEntity>[];
-    return subclasses.subclassesByMask(
-        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
-      ClassEntity cls2, ClassQuery query2) {
-    Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
-    if (xSubset == null) return null;
-    Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
-    if (ySubset == null) return null;
-    return xSubset.toSet().intersection(ySubset.toSet());
-  }
-
-  Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
-    switch (query) {
-      case ClassQuery.EXACT:
-        return null;
-      case ClassQuery.SUBCLASS:
-        return strictSubclassesOf(cls);
-      case ClassQuery.SUBTYPE:
-        return strictSubtypesOf(cls);
-    }
-    throw new ArgumentError('Unexpected query: $query.');
-  }
-
-  Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
-      ClassEntity cls2, ClassQuery query2) {
-    // TODO(johnniwinther): Use [ClassSet] to compute this.
-    // Compute the set of classes that are contained in both class subsets.
-    Set<ClassEntity> common =
-        _commonContainedClasses(cls1, query1, cls2, query2);
-    if (common == null || common.isEmpty) return const <ClassEntity>[];
-    // Narrow down the candidates by only looking at common classes
-    // that do not have a superclass or supertype that will be a
-    // better candidate.
-    return common.where((ClassEntity each) {
-      bool containsSuperclass = common.contains(getSuperClass(each));
-      // If the superclass is also a candidate, then we don't want to
-      // deal with this class. If we're only looking for a subclass we
-      // know we don't have to look at the list of interfaces because
-      // they can never be in the common set.
-      if (containsSuperclass ||
-          query1 == ClassQuery.SUBCLASS ||
-          query2 == ClassQuery.SUBCLASS) {
-        return !containsSuperclass;
-      }
-      // Run through the direct supertypes of the class. If the common
-      // set contains the direct supertype of the class, we ignore the
-      // the class because the supertype is a better candidate.
-
-      for (ClassEntity interface in getInterfaces(each)) {
-        if (common.contains(interface)) return false;
-      }
-      return true;
-    });
-  }
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) return;
-    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
 }
 
 // Interface for testing equivalence of Kernel-based entities.
@@ -2473,7 +2325,8 @@
               new TypedefType(
                   newTypedef,
                   new List<DartType>.filled(
-                      data.node.typeParameters.length, const DynamicType()))));
+                      data.node.typeParameters.length, const DynamicType()),
+                  getDartType(data.node.type))));
       assert(newTypedef.typedefIndex == oldTypedef.typedefIndex);
     }
     for (int memberIndex = 0;
@@ -3143,10 +2996,4 @@
   ClassEntity getAppliedMixin(ClassEntity cls) {
     return elementMap._getAppliedMixin(cls);
   }
-
-  @override
-  bool validateClass(ClassEntity cls) => true;
-
-  @override
-  bool checkClass(ClassEntity cls) => true;
 }
diff --git a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
index b77533f..09ecdca 100644
--- a/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_backend_strategy.dart
@@ -44,8 +44,10 @@
 class KernelCodegenWorkItemBuilder implements WorkItemBuilder {
   final JavaScriptBackend _backend;
   final JClosedWorld _closedWorld;
+  final GlobalTypeInferenceResults _globalInferenceResults;
 
-  KernelCodegenWorkItemBuilder(this._backend, this._closedWorld);
+  KernelCodegenWorkItemBuilder(
+      this._backend, this._closedWorld, this._globalInferenceResults);
 
   CompilerOptions get _options => _backend.compiler.options;
 
@@ -61,7 +63,8 @@
       }
     }
 
-    return new KernelCodegenWorkItem(_backend, _closedWorld, entity);
+    return new KernelCodegenWorkItem(
+        _backend, _closedWorld, _globalInferenceResults, entity);
   }
 }
 
@@ -70,14 +73,16 @@
   final JClosedWorld _closedWorld;
   final MemberEntity element;
   final CodegenRegistry registry;
+  final GlobalTypeInferenceResults _globalInferenceResults;
 
-  KernelCodegenWorkItem(this._backend, this._closedWorld, this.element)
+  KernelCodegenWorkItem(this._backend, this._closedWorld,
+      this._globalInferenceResults, this.element)
       : registry =
             new CodegenRegistry(_closedWorld.elementEnvironment, element);
 
   @override
   WorldImpact run() {
-    return _backend.codegen(this, _closedWorld);
+    return _backend.codegen(this, _closedWorld, _globalInferenceResults);
   }
 }
 
@@ -92,14 +97,15 @@
       this.task, this._compiler, this._elementMap, this._globalLocalsMap);
 
   @override
-  HGraph build(CodegenWorkItem work, JClosedWorld closedWorld) {
+  HGraph build(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults results) {
     return task.measure(() {
       KernelSsaGraphBuilder builder = new KernelSsaGraphBuilder(
           work.element,
           _elementMap.getMemberThisType(work.element),
           _compiler,
           _elementMap,
-          _compiler.globalInference.results,
+          results,
           _globalLocalsMap,
           closedWorld,
           _compiler.codegenWorldBuilder,
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 19e2aa3..9e91d03 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -31,7 +31,7 @@
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../native/resolver.dart';
 import '../options.dart';
-import '../universe/class_hierarchy_builder.dart';
+import '../universe/class_hierarchy.dart';
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart';
 import 'deferred_load.dart';
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index fc870e9..04b3841 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -70,26 +70,6 @@
   /// dart:html for unit testing purposes.
   bool allowMockCompilation = false;
 
-  /// Whether to resolve all functions in the program, not just those reachable
-  /// from main. This implies [analyzeOnly] is true as well.
-  bool analyzeAll = false;
-
-  /// Whether to disable tree-shaking for the main script. This marks all
-  /// functions in the main script as reachable (not just a function named
-  /// `main`).
-  // TODO(sigmund): rename. The current name seems to indicate that only the
-  // main function is retained, which is the opposite of what this does.
-  bool analyzeMain = false;
-
-  /// Whether to run the compiler just for the purpose of analysis. That is, to
-  /// run resolution and type-checking alone, but otherwise do not generate any
-  /// code.
-  bool analyzeOnly = false;
-
-  /// Whether to skip analysis of method bodies and field initializers. Implies
-  /// [analyzeOnly].
-  bool analyzeSignaturesOnly = false;
-
   /// Sets a combination of flags for benchmarking 'production' mode.
   bool benchmarkingProduction = false;
 
@@ -282,10 +262,6 @@
     return new CompilerOptions()
       ..libraryRoot = libraryRoot
       ..allowMockCompilation = _hasOption(options, Flags.allowMockCompilation)
-      ..analyzeAll = _hasOption(options, Flags.analyzeAll)
-      ..analyzeMain = _hasOption(options, Flags.analyzeMain)
-      ..analyzeOnly = _hasOption(options, Flags.analyzeOnly)
-      ..analyzeSignaturesOnly = _hasOption(options, Flags.analyzeSignaturesOnly)
       ..benchmarkingProduction =
           _hasOption(options, Flags.benchmarkingProduction)
       ..buildId =
@@ -370,7 +346,6 @@
   }
 
   void deriveOptions() {
-    if (analyzeSignaturesOnly || analyzeAll) analyzeOnly = true;
     if (benchmarkingProduction) {
       useStartupEmitter = true;
       trustPrimitives = true;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 40d863f..78867a0 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -62,7 +62,7 @@
   final AsyncMarker asyncMarker;
   final KernelToLocalsMap localsMap;
   final KernelToTypeInferenceMap typeInferenceMap;
-  final SourceInformationBuilder<ir.Node> sourceInformationBuilder;
+  final SourceInformationBuilder sourceInformationBuilder;
 
   StackFrame(this.parent, this.member, this.asyncMarker, this.localsMap,
       this.typeInferenceMap, this.sourceInformationBuilder);
@@ -98,11 +98,11 @@
   @override
   JavaScriptBackend get backend => compiler.backend;
 
-  final SourceInformationStrategy<ir.Node> _sourceInformationStrategy;
+  final SourceInformationStrategy _sourceInformationStrategy;
   final KernelToElementMapForBuilding _elementMap;
-  final GlobalTypeInferenceResults _globalInferenceResults;
+  final GlobalTypeInferenceResults globalInferenceResults;
   final GlobalLocalsMap _globalLocalsMap;
-  LoopHandler<ir.Node> loopHandler;
+  LoopHandler loopHandler;
   TypeBuilder typeBuilder;
 
   final NativeEmitter nativeEmitter;
@@ -123,19 +123,19 @@
   StackFrame _currentFrame;
 
   KernelSsaGraphBuilder(
-      this.initialTargetElement,
-      InterfaceType instanceType,
-      this.compiler,
-      this._elementMap,
-      this._globalInferenceResults,
-      this._globalLocalsMap,
-      this.closedWorld,
-      this._worldBuilder,
-      this.registry,
-      this.closureDataLookup,
-      this.nativeEmitter,
-      this._sourceInformationStrategy)
-      : this.targetElement = _effectiveTargetElementFor(initialTargetElement),
+    this.initialTargetElement,
+    InterfaceType instanceType,
+    this.compiler,
+    this._elementMap,
+    this.globalInferenceResults,
+    this._globalLocalsMap,
+    this.closedWorld,
+    this._worldBuilder,
+    this.registry,
+    this.closureDataLookup,
+    this.nativeEmitter,
+    this._sourceInformationStrategy,
+  )   : this.targetElement = _effectiveTargetElementFor(initialTargetElement),
         _infoReporter = compiler.dumpInfoTask,
         _allocatorAnalysis = closedWorld.allocatorAnalysis {
     _enterFrame(targetElement);
@@ -174,7 +174,7 @@
         member,
         asyncMarker,
         _globalLocalsMap.getLocalsMap(member),
-        new KernelToTypeInferenceMapImpl(member, _globalInferenceResults),
+        new KernelToTypeInferenceMapImpl(member, globalInferenceResults),
         _currentFrame != null
             ? _currentFrame.sourceInformationBuilder.forContext(member)
             : _sourceInformationStrategy.createBuilderForContext(member));
@@ -2009,8 +2009,7 @@
         // to the body.
         SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
         JumpTarget target = localsMap.getJumpTargetForDo(node);
-        LabelDefinition label =
-            target.addLabel(null, 'loop', isBreakTarget: true);
+        LabelDefinition label = target.addLabel('loop', isBreakTarget: true);
         HLabeledBlockInformation info = new HLabeledBlockInformation(
             new HSubGraphBlockInformation(bodyGraph), <LabelDefinition>[label]);
         loopEntryBlock.setBlockFlow(info, current);
@@ -2854,14 +2853,8 @@
         dartType, sourceElement,
         sourceInformation: sourceInformation);
     _pushStaticInvocation(
-        _commonElements.runtimeTypeToString,
-        <HInstruction>[value],
-        abstractValueDomain.stringType,
-        const <DartType>[],
-        sourceInformation: sourceInformation);
-    _pushStaticInvocation(
         _commonElements.createRuntimeType,
-        <HInstruction>[pop()],
+        <HInstruction>[value],
         _typeInferenceMap.getReturnTypeOf(_commonElements.createRuntimeType),
         const <DartType>[],
         sourceInformation: sourceInformation);
@@ -4144,10 +4137,10 @@
         Selector selector, MemberEntity element) {
       bool isLength = selector.isGetter && selector.name == "length";
       if (isLength || selector.isIndex) {
-        return closedWorld.isSubtypeOf(
+        return closedWorld.classHierarchy.isSubtypeOf(
             element.enclosingClass, commonElements.jsIndexableClass);
       } else if (selector.isIndexSet) {
-        return closedWorld.isSubtypeOf(
+        return closedWorld.classHierarchy.isSubtypeOf(
             element.enclosingClass, commonElements.jsMutableIndexableClass);
       } else {
         return false;
@@ -4830,11 +4823,12 @@
       js.Name operator = namer.operatorIs(element);
       HInstruction isFieldName =
           graph.addConstantStringFromName(operator, closedWorld);
-      HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element) ||
-              closedWorld.nativeData.isJsInteropClass(element)
-          ? graph.addConstantStringFromName(
-              namer.substitutionName(element), closedWorld)
-          : graph.addConstantNull(closedWorld);
+      HInstruction asFieldName =
+          closedWorld.classHierarchy.hasAnyStrictSubtype(element) ||
+                  closedWorld.nativeData.isJsInteropClass(element)
+              ? graph.addConstantStringFromName(
+                  namer.substitutionName(element), closedWorld)
+              : graph.addConstantNull(closedWorld);
       List<HInstruction> inputs = <HInstruction>[
         expression,
         isFieldName,
@@ -5581,8 +5575,8 @@
       // constructor's factory.  A simplified version is to check this is a
       // constructor body for a leaf class.
       ClassEntity class_ = element.enclosingClass;
-      if (closedWorld.isDirectlyInstantiated(class_)) {
-        return !closedWorld.isIndirectlyInstantiated(class_);
+      if (closedWorld.classHierarchy.isDirectlyInstantiated(class_)) {
+        return !closedWorld.classHierarchy.isIndirectlyInstantiated(class_);
       }
       return false;
     }
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 3d08315..947432d 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1835,7 +1835,7 @@
       // type because our optimizations might end up in a state where the
       // invoke dynamic knows more than the receiver.
       ClassEntity enclosing = node.element.enclosingClass;
-      if (_closedWorld.isInstantiated(enclosing)) {
+      if (_closedWorld.classHierarchy.isInstantiated(enclosing)) {
         return _abstractValueDomain.createNonNullExact(enclosing);
       } else {
         // The element is mixed in so a non-null subtype mask is the most
@@ -2208,6 +2208,11 @@
     generateConstant(node.constant, node.sourceInformation);
 
     _registry.registerConstantUse(new ConstantUse.literal(node.constant));
+    if (node.constant.isType) {
+      TypeConstantValue typeConstant = node.constant;
+      _registry.registerTypeUse(
+          new TypeUse.constTypeLiteral(typeConstant.representedType));
+    }
   }
 
   visitNot(HNot node) {
@@ -3141,7 +3146,8 @@
 
     if (_closedWorld.isUsedAsMixin(cls)) return true;
 
-    return _closedWorld.anyStrictSubclassOf(cls, (ClassEntity subclass) {
+    return _closedWorld.classHierarchy.anyStrictSubclassOf(cls,
+        (ClassEntity subclass) {
       return !_rtiSubstitutions.isTrivialSubstitution(subclass, cls);
     });
   }
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index 78d0ccd..f3900d0 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -67,8 +67,7 @@
 
   CodeEmitterTask get emitter => backend.emitter;
 
-  GlobalTypeInferenceResults get globalInferenceResults =>
-      compiler.globalInference.results;
+  GlobalTypeInferenceResults get globalInferenceResults;
 
   ClosureDataLookup get closureDataLookup =>
       compiler.backendStrategy.closureDataLookup;
@@ -93,7 +92,7 @@
 
   JsInteropAnalysis get jsInteropAnalysis => backend.jsInteropAnalysis;
 
-  InferredData get inferredData => compiler.globalInference.inferredData;
+  InferredData get inferredData => globalInferenceResults.inferredData;
 
   DeferredLoadTask get deferredLoadTask => compiler.deferredLoadTask;
 
diff --git a/pkg/compiler/lib/src/ssa/loop_handler.dart b/pkg/compiler/lib/src/ssa/loop_handler.dart
index 77c2882..be4fb554 100644
--- a/pkg/compiler/lib/src/ssa/loop_handler.dart
+++ b/pkg/compiler/lib/src/ssa/loop_handler.dart
@@ -15,7 +15,7 @@
 import 'nodes.dart';
 
 /// Builds the SSA graph for loop nodes.
-abstract class LoopHandler<T> {
+abstract class LoopHandler {
   final GraphBuilder builder;
 
   LoopHandler(this.builder);
@@ -26,7 +26,7 @@
   /// The [condition] function must return a boolean result.
   /// None of the functions must leave anything on the stack.
   void handleLoop(
-      T loop,
+      ir.Node loop,
       CapturedLoopScope loopClosureInfo,
       JumpTarget jumpTarget,
       void initialize(),
@@ -201,7 +201,7 @@
       // if block.
       if (jumpHandler.hasAnyBreak()) {
         LabelDefinition label =
-            jumpTarget.addLabel(null, 'loop', isBreakTarget: true);
+            jumpTarget.addLabel('loop', isBreakTarget: true);
         SubGraph labelGraph = new SubGraph(conditionBlock, builder.current);
         HLabeledBlockInformation labelInfo = new HLabeledBlockInformation(
             new HSubGraphBlockInformation(labelGraph),
@@ -224,7 +224,7 @@
   /// Creates a new loop-header block. The previous [current] block
   /// is closed with an [HGoto] and replaced by the newly created block.
   /// Also notifies the locals handler that we're entering a loop.
-  JumpHandler beginLoopHeader(T node, JumpTarget jumpTarget) {
+  JumpHandler beginLoopHeader(ir.TreeNode node, JumpTarget jumpTarget) {
     assert(!builder.isAborted());
     HBasicBlock previousBlock =
         builder.close(new HGoto(builder.abstractValueDomain));
@@ -297,7 +297,7 @@
   /// Determine what kind of loop [node] represents.
   ///
   /// The result is one of the kinds defined in [HLoopBlockInformation].
-  int loopKind(T node);
+  int loopKind(ir.TreeNode node);
 
   /// Creates a [JumpHandler] for a statement. The node must be a jump
   /// target. If there are no breaks or continues targeting the statement,
@@ -306,13 +306,13 @@
   /// [isLoopJump] is [:true:] when the jump handler is for a loop. This is used
   /// to distinguish the synthesized loop created for a switch statement with
   /// continue statements from simple switch statements.
-  JumpHandler createJumpHandler(T node, JumpTarget jumpTarget,
+  JumpHandler createJumpHandler(ir.TreeNode node, JumpTarget jumpTarget,
       {bool isLoopJump});
 }
 
 // TODO(het): Since kernel simplifies loop breaks and continues, we should
 // rewrite the loop handler from scratch to account for the simplified structure
-class KernelLoopHandler extends LoopHandler<ir.TreeNode> {
+class KernelLoopHandler extends LoopHandler {
   final KernelSsaGraphBuilder builder;
 
   KernelLoopHandler(KernelSsaGraphBuilder builder)
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index a0ac620..17d701f 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -48,13 +48,12 @@
 
   Compiler get _compiler => _backend.compiler;
 
-  GlobalTypeInferenceResults get _results => _compiler.globalInference.results;
-
   CompilerOptions get _options => _compiler.options;
 
   RuntimeTypesSubstitutions get _rtiSubstitutions => _backend.rtiSubstitutions;
 
-  void optimize(CodegenWorkItem work, HGraph graph, JClosedWorld closedWorld) {
+  void optimize(CodegenWorkItem work, HGraph graph, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
     void runPhase(OptimizationPhase phase) {
       measureSubtask(phase.name, () => phase.visitGraph(graph));
       _backend.tracer.traceGraph(phase.name, graph);
@@ -70,31 +69,31 @@
       List<OptimizationPhase> phases = <OptimizationPhase>[
         // Run trivial instruction simplification first to optimize
         // some patterns useful for type conversion.
-        new SsaInstructionSimplifier(
-            _results, _options, _rtiSubstitutions, closedWorld, registry),
+        new SsaInstructionSimplifier(globalInferenceResults, _options,
+            _rtiSubstitutions, closedWorld, registry),
         new SsaTypeConversionInserter(closedWorld),
         new SsaRedundantPhiEliminator(),
         new SsaDeadPhiEliminator(),
-        new SsaTypePropagator(
-            _results, _options, closedWorld.commonElements, closedWorld),
+        new SsaTypePropagator(globalInferenceResults, _options,
+            closedWorld.commonElements, closedWorld),
         // After type propagation, more instructions can be
         // simplified.
-        new SsaInstructionSimplifier(
-            _results, _options, _rtiSubstitutions, closedWorld, registry),
+        new SsaInstructionSimplifier(globalInferenceResults, _options,
+            _rtiSubstitutions, closedWorld, registry),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
-        new SsaInstructionSimplifier(
-            _results, _options, _rtiSubstitutions, closedWorld, registry),
+        new SsaInstructionSimplifier(globalInferenceResults, _options,
+            _rtiSubstitutions, closedWorld, registry),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
-        new SsaTypePropagator(
-            _results, _options, closedWorld.commonElements, closedWorld),
+        new SsaTypePropagator(globalInferenceResults, _options,
+            closedWorld.commonElements, closedWorld),
         // Run a dead code eliminator before LICM because dead
         // interceptors are often in the way of LICM'able instructions.
         new SsaDeadCodeEliminator(closedWorld, this),
         new SsaGlobalValueNumberer(closedWorld.abstractValueDomain),
         // After GVN, some instructions might need their type to be
         // updated because they now have different inputs.
-        new SsaTypePropagator(
-            _results, _options, closedWorld.commonElements, closedWorld),
+        new SsaTypePropagator(globalInferenceResults, _options,
+            closedWorld.commonElements, closedWorld),
         codeMotion = new SsaCodeMotion(closedWorld.abstractValueDomain),
         loadElimination = new SsaLoadElimination(_compiler, closedWorld),
         new SsaRedundantPhiEliminator(),
@@ -103,13 +102,13 @@
         // controlled by a test on the value, so redo 'conversion insertion' to
         // learn from the refined type.
         new SsaTypeConversionInserter(closedWorld),
-        new SsaTypePropagator(
-            _results, _options, closedWorld.commonElements, closedWorld),
+        new SsaTypePropagator(globalInferenceResults, _options,
+            closedWorld.commonElements, closedWorld),
         new SsaValueRangeAnalyzer(closedWorld, this),
         // Previous optimizations may have generated new
         // opportunities for instruction simplification.
-        new SsaInstructionSimplifier(
-            _results, _options, _rtiSubstitutions, closedWorld, registry),
+        new SsaInstructionSimplifier(globalInferenceResults, _options,
+            _rtiSubstitutions, closedWorld, registry),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
       ];
       phases.forEach(runPhase);
@@ -126,25 +125,25 @@
           dce.eliminatedSideEffects ||
           loadElimination.newGvnCandidates) {
         phases = <OptimizationPhase>[
-          new SsaTypePropagator(
-              _results, _options, closedWorld.commonElements, closedWorld),
+          new SsaTypePropagator(globalInferenceResults, _options,
+              closedWorld.commonElements, closedWorld),
           new SsaGlobalValueNumberer(closedWorld.abstractValueDomain),
           new SsaCodeMotion(closedWorld.abstractValueDomain),
           new SsaValueRangeAnalyzer(closedWorld, this),
-          new SsaInstructionSimplifier(
-              _results, _options, _rtiSubstitutions, closedWorld, registry),
+          new SsaInstructionSimplifier(globalInferenceResults, _options,
+              _rtiSubstitutions, closedWorld, registry),
           new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
           new SsaSimplifyInterceptors(closedWorld, work.element.enclosingClass),
           new SsaDeadCodeEliminator(closedWorld, this),
         ];
       } else {
         phases = <OptimizationPhase>[
-          new SsaTypePropagator(
-              _results, _options, closedWorld.commonElements, closedWorld),
+          new SsaTypePropagator(globalInferenceResults, _options,
+              closedWorld.commonElements, closedWorld),
           // Run the simplifier to remove unneeded type checks inserted by
           // type propagation.
-          new SsaInstructionSimplifier(
-              _results, _options, _rtiSubstitutions, closedWorld, registry),
+          new SsaInstructionSimplifier(globalInferenceResults, _options,
+              _rtiSubstitutions, closedWorld, registry),
         ];
       }
       phases.forEach(runPhase);
@@ -1326,7 +1325,8 @@
   bool needsSubstitutionForTypeVariableAccess(ClassEntity cls) {
     if (_closedWorld.isUsedAsMixin(cls)) return true;
 
-    return _closedWorld.anyStrictSubclassOf(cls, (ClassEntity subclass) {
+    return _closedWorld.classHierarchy.anyStrictSubclassOf(cls,
+        (ClassEntity subclass) {
       return !_rtiSubstitutions.isTrivialSubstitution(subclass, cls);
     });
   }
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index c006997..7ed9f68 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -11,6 +11,7 @@
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
 import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler;
+import '../types/types.dart';
 import '../universe/call_structure.dart';
 import '../universe/use.dart';
 import '../world.dart' show JClosedWorld;
@@ -38,10 +39,11 @@
 
   /// Generates JavaScript code for `work.element`.
   /// Using the ssa builder, optimizer and codegenerator.
-  js.Fun compile(CodegenWorkItem work, JClosedWorld closedWorld) {
-    HGraph graph = _builder.build(work, closedWorld);
+  js.Fun compile(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
+    HGraph graph = _builder.build(work, closedWorld, globalInferenceResults);
     if (graph == null) return null;
-    optimizer.optimize(work, graph, closedWorld);
+    optimizer.optimize(work, graph, closedWorld, globalInferenceResults);
     MemberEntity element = work.element;
     js.Expression result = generator.generateCode(work, graph, closedWorld);
     if (graph.needsAsyncRewrite) {
@@ -68,7 +70,8 @@
 abstract class SsaBuilder {
   /// Creates the [HGraph] for [work] or returns `null` if no code is needed
   /// for [work].
-  HGraph build(CodegenWorkItem work, JClosedWorld closedWorld);
+  HGraph build(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults);
 }
 
 class SsaBuilderTask extends CompilerTask {
@@ -88,8 +91,9 @@
 
   /// Creates the [HGraph] for [work] or returns `null` if no code is needed
   /// for [work].
-  HGraph build(CodegenWorkItem work, JClosedWorld closedWorld) {
-    return _builder.build(work, closedWorld);
+  HGraph build(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults globalInferenceResults) {
+    return _builder.build(work, closedWorld, globalInferenceResults);
   }
 }
 
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index b078b9a..89c5b8c 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -4,6 +4,7 @@
 
 library types;
 
+import 'package:kernel/ast.dart' as ir;
 import '../common.dart' show failedAt;
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
@@ -24,7 +25,7 @@
 /// implementation would return false on all boolean properties (giving no
 /// guarantees) and the `subclass of Object or null` type mask for the type
 /// based queries (the runtime value could be anything).
-abstract class GlobalTypeInferenceElementResult<T> {
+abstract class GlobalTypeInferenceElementResult {
   /// Whether the method element associated with this result always throws.
   bool get throwsAlways;
 
@@ -36,46 +37,46 @@
   AbstractValue get returnType;
 
   /// Returns the type of a list new expression [node].
-  AbstractValue typeOfNewList(T node);
+  AbstractValue typeOfNewList(ir.Node node);
 
   /// Returns the type of a list literal [node].
-  AbstractValue typeOfListLiteral(T node);
+  AbstractValue typeOfListLiteral(ir.Node node);
 
   /// Returns the type of a send [node].
   // TODO(johnniwinther): Rename this.
-  AbstractValue typeOfSend(T node);
+  AbstractValue typeOfSend(ir.Node node);
 
   /// Returns the type of the getter in a complex send-set [node], for example,
   /// the type of the `a.f` getter in `a.f += b`.
-  AbstractValue typeOfGetter(T node);
+  AbstractValue typeOfGetter(ir.Node node);
 
   /// Returns the type of the iterator in a [loop].
-  AbstractValue typeOfIterator(T node);
+  AbstractValue typeOfIterator(ir.Node node);
 
   /// Returns the type of the `moveNext` call of an iterator in a [loop].
-  AbstractValue typeOfIteratorMoveNext(T node);
+  AbstractValue typeOfIteratorMoveNext(ir.Node node);
 
   /// Returns the type of the `current` getter of an iterator in a [loop].
-  AbstractValue typeOfIteratorCurrent(T node);
+  AbstractValue typeOfIteratorCurrent(ir.Node node);
 }
 
-abstract class GlobalTypeInferenceMemberResult<T>
-    extends GlobalTypeInferenceElementResult<T> {
+abstract class GlobalTypeInferenceMemberResult
+    extends GlobalTypeInferenceElementResult {
   /// Whether the member associated with this result is only called once in one
   /// location in the entire program.
   bool get isCalledOnce;
 }
 
-abstract class GlobalTypeInferenceParameterResult<T>
-    extends GlobalTypeInferenceElementResult<T> {}
+abstract class GlobalTypeInferenceParameterResult
+    extends GlobalTypeInferenceElementResult {}
 
-abstract class GlobalTypeInferenceElementResultImpl<T>
-    implements GlobalTypeInferenceElementResult<T> {
+abstract class GlobalTypeInferenceElementResultImpl
+    implements GlobalTypeInferenceElementResult {
   // TODO(sigmund): split - stop using _data after inference is done.
-  final GlobalTypeInferenceElementData<T> _data;
+  final GlobalTypeInferenceElementData _data;
 
   // TODO(sigmund): store relevant data & drop reference to inference engine.
-  final TypesInferrer<T> _inferrer;
+  final TypesInferrer _inferrer;
   final bool _isJsInterop;
 
   GlobalTypeInferenceElementResultImpl(
@@ -87,22 +88,24 @@
     return mask != null && _inferrer.abstractValueDomain.isEmpty(mask);
   }
 
-  AbstractValue typeOfNewList(T node) => _inferrer.getTypeForNewList(node);
+  AbstractValue typeOfNewList(ir.Node node) =>
+      _inferrer.getTypeForNewList(node);
 
-  AbstractValue typeOfListLiteral(T node) => _inferrer.getTypeForNewList(node);
+  AbstractValue typeOfListLiteral(ir.Node node) =>
+      _inferrer.getTypeForNewList(node);
 
-  AbstractValue typeOfSend(T node) => _data?.typeOfSend(node);
-  AbstractValue typeOfGetter(T node) => _data?.typeOfGetter(node);
-  AbstractValue typeOfIterator(T node) => _data?.typeOfIterator(node);
-  AbstractValue typeOfIteratorMoveNext(T node) =>
+  AbstractValue typeOfSend(ir.Node node) => _data?.typeOfSend(node);
+  AbstractValue typeOfGetter(ir.Node node) => _data?.typeOfGetter(node);
+  AbstractValue typeOfIterator(ir.Node node) => _data?.typeOfIterator(node);
+  AbstractValue typeOfIteratorMoveNext(ir.Node node) =>
       _data?.typeOfIteratorMoveNext(node);
-  AbstractValue typeOfIteratorCurrent(T node) =>
+  AbstractValue typeOfIteratorCurrent(ir.Node node) =>
       _data?.typeOfIteratorCurrent(node);
 }
 
-class GlobalTypeInferenceMemberResultImpl<T>
-    extends GlobalTypeInferenceElementResultImpl<T>
-    implements GlobalTypeInferenceMemberResult<T> {
+class GlobalTypeInferenceMemberResultImpl
+    extends GlobalTypeInferenceElementResultImpl
+    implements GlobalTypeInferenceMemberResult {
   // TODO(sigmund): delete, store data directly here.
   final MemberEntity _owner;
 
@@ -124,9 +127,9 @@
       : _inferrer.getTypeOfMember(_owner);
 }
 
-class GlobalTypeInferenceParameterResultImpl<T>
-    extends GlobalTypeInferenceElementResultImpl<T>
-    implements GlobalTypeInferenceParameterResult<T> {
+class GlobalTypeInferenceParameterResultImpl
+    extends GlobalTypeInferenceElementResultImpl
+    implements GlobalTypeInferenceParameterResult {
   // TODO(sigmund): delete, store data directly here.
   final Local _owner;
 
@@ -144,101 +147,63 @@
 
 /// Internal data used during type-inference to store intermediate results about
 /// a single element.
-abstract class GlobalTypeInferenceElementData<T> {
+abstract class GlobalTypeInferenceElementData {
   // TODO(johnniwinther): Remove this. Maybe split by access/invoke.
-  AbstractValue typeOfSend(T node);
-  AbstractValue typeOfGetter(T node);
+  AbstractValue typeOfSend(ir.Node node);
+  AbstractValue typeOfGetter(ir.Node node);
 
-  void setTypeMask(T node, AbstractValue mask);
+  void setTypeMask(ir.Node node, AbstractValue mask);
 
-  AbstractValue typeOfIterator(T node);
+  AbstractValue typeOfIterator(ir.Node node);
 
-  AbstractValue typeOfIteratorMoveNext(T node);
+  AbstractValue typeOfIteratorMoveNext(ir.Node node);
 
-  AbstractValue typeOfIteratorCurrent(T node);
+  AbstractValue typeOfIteratorCurrent(ir.Node node);
 
-  void setIteratorTypeMask(T node, AbstractValue mask);
+  void setIteratorTypeMask(ir.Node node, AbstractValue mask);
 
-  void setMoveNextTypeMask(T node, AbstractValue mask);
+  void setMoveNextTypeMask(ir.Node node, AbstractValue mask);
 
-  void setCurrentTypeMask(T node, AbstractValue mask);
+  void setCurrentTypeMask(ir.Node node, AbstractValue mask);
 }
 
 /// API to interact with the global type-inference engine.
-abstract class TypesInferrer<T> {
+abstract class TypesInferrer {
   AbstractValueDomain get abstractValueDomain;
   void analyzeMain(FunctionEntity element);
   AbstractValue getReturnTypeOfMember(MemberEntity element);
   AbstractValue getReturnTypeOfParameter(Local element);
   AbstractValue getTypeOfMember(MemberEntity element);
   AbstractValue getTypeOfParameter(Local element);
-  AbstractValue getTypeForNewList(T node);
+  AbstractValue getTypeForNewList(ir.Node node);
   AbstractValue getTypeOfSelector(Selector selector, AbstractValue receiver);
   void clear();
   bool isMemberCalledOnce(MemberEntity element);
-  bool isFixedArrayCheckedForGrowable(T node);
-  GlobalTypeInferenceResults createResults();
+  bool isFixedArrayCheckedForGrowable(ir.Node node);
 }
 
 /// Results produced by the global type-inference algorithm.
 ///
 /// All queries in this class may contain results that assume whole-program
-/// closed-world semantics. Any [TypeMask] for an element or node that we return
-/// was inferred to be a "guaranteed type", that means, it is a type that we
-/// can prove to be correct for all executions of the program.
-abstract class GlobalTypeInferenceResults<T> {
-  // TODO(sigmund): store relevant data & drop reference to inference engine.
-  final TypeGraphInferrer<T> _inferrer;
-  final JClosedWorld closedWorld;
-  final Map<MemberEntity, GlobalTypeInferenceMemberResult<T>> _memberResults =
-      <MemberEntity, GlobalTypeInferenceMemberResult<T>>{};
-  final Map<Local, GlobalTypeInferenceParameterResult<T>> _parameterResults =
-      <Local, GlobalTypeInferenceParameterResult<T>>{};
+/// closed-world semantics. Any [AbstractValue] for an element or node that we
+/// return was inferred to be a "guaranteed type", that means, it is a type that
+/// we can prove to be correct for all executions of the program.
+abstract class GlobalTypeInferenceResults {
+  JClosedWorld get closedWorld;
 
-  GlobalTypeInferenceResults(this._inferrer, this.closedWorld);
+  InferredData get inferredData;
 
-  /// Create the [GlobalTypeInferenceMemberResult] object for [member].
-  GlobalTypeInferenceMemberResult<T> createMemberResult(
-      TypeGraphInferrer<T> inferrer, MemberEntity member,
-      {bool isJsInterop: false});
+  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member);
 
-  /// Create the [GlobalTypeInferenceParameterResult] object for [parameter].
-  GlobalTypeInferenceParameterResult<T> createParameterResult(
-      TypeGraphInferrer<T> inferrer, Local parameter);
-
-  // TODO(sigmund,johnniwinther): compute result objects eagerly and make it an
-  // error to query for results that don't exist.
-  GlobalTypeInferenceMemberResult<T> resultOfMember(MemberEntity member) {
-    assert(
-        member is! ConstructorBodyEntity,
-        failedAt(
-            member,
-            "unexpected input: ConstructorBodyElements are created"
-            " after global type inference, no data is avaiable for them."));
-
-    bool isJsInterop = closedWorld.nativeData.isJsInteropMember(member);
-    return _memberResults.putIfAbsent(member,
-        () => createMemberResult(_inferrer, member, isJsInterop: isJsInterop));
-  }
-
-  // TODO(sigmund,johnniwinther): compute result objects eagerly and make it an
-  // error to query for results that don't exist.
-  GlobalTypeInferenceElementResult<T> resultOfParameter(Local parameter) {
-    return _parameterResults.putIfAbsent(
-        parameter, () => createParameterResult(_inferrer, parameter));
-  }
+  GlobalTypeInferenceElementResult resultOfParameter(Local parameter);
 
   /// Returns the type of a [selector] when applied to a receiver with the given
   /// type [mask].
-  AbstractValue typeOfSelector(Selector selector, AbstractValue mask) =>
-      _inferrer.getTypeOfSelector(selector, mask);
+  AbstractValue typeOfSelector(Selector selector, AbstractValue mask);
 
   /// Returns whether a fixed-length constructor call goes through a growable
   /// check.
-  // TODO(sigmund): move into the result of the element containing such
-  // constructor call.
-  bool isFixedArrayCheckedForGrowable(T ctorCall) =>
-      _inferrer.isFixedArrayCheckedForGrowable(ctorCall);
+  bool isFixedArrayCheckedForGrowable(ir.Node node);
 }
 
 /// Global analysis that infers concrete types.
@@ -252,26 +217,97 @@
   /// accessed from outside this class for testing only.
   TypeGraphInferrer typesInferrerInternal;
 
-  GlobalTypeInferenceResults results;
-
-  InferredData inferredData;
+  GlobalTypeInferenceResults resultsForTesting;
 
   GlobalTypeInferenceTask(Compiler compiler)
       : compiler = compiler,
         super(compiler.measurer);
 
   /// Runs the global type-inference algorithm once.
-  void runGlobalTypeInference(FunctionEntity mainElement,
+  GlobalTypeInferenceResults runGlobalTypeInference(FunctionEntity mainElement,
       JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
-    measure(() {
+    return measure(() {
       typesInferrerInternal ??= compiler.backendStrategy.createTypesInferrer(
           closedWorld, inferredDataBuilder,
           disableTypeInference: compiler.disableTypeInference);
       typesInferrerInternal.analyzeMain(mainElement);
       typesInferrerInternal.clear();
-      results = typesInferrerInternal.createResults();
+
+      GlobalTypeInferenceResultsImpl results =
+          new GlobalTypeInferenceResultsImpl(
+              typesInferrerInternal, closedWorld);
       closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
-      inferredData = inferredDataBuilder.close(closedWorld);
+      results.inferredData = inferredDataBuilder.close(closedWorld);
+      resultsForTesting = results;
+      return results;
     });
   }
 }
+
+class GlobalTypeInferenceResultsImpl implements GlobalTypeInferenceResults {
+  final JClosedWorld closedWorld;
+  InferredData inferredData;
+  final TypeGraphInferrer _inferrer;
+  // TODO(sigmund): store relevant data & drop reference to inference engine.
+  final Map<MemberEntity, GlobalTypeInferenceMemberResult> _memberResults =
+      <MemberEntity, GlobalTypeInferenceMemberResult>{};
+  final Map<Local, GlobalTypeInferenceParameterResult> _parameterResults =
+      <Local, GlobalTypeInferenceParameterResult>{};
+
+  GlobalTypeInferenceResultsImpl(this._inferrer, this.closedWorld);
+
+  GlobalTypeInferenceMemberResult _createMemberResult(
+      TypeGraphInferrer inferrer, MemberEntity member,
+      {bool isJsInterop: false}) {
+    return new GlobalTypeInferenceMemberResultImpl(
+        member,
+        // We store data in the context of the enclosing method, even
+        // for closure elements.
+        inferrer.inferrer.lookupDataOfMember(member),
+        inferrer,
+        isJsInterop);
+  }
+
+  GlobalTypeInferenceParameterResult _createParameterResult(
+      TypeGraphInferrer inferrer, Local parameter) {
+    return new GlobalTypeInferenceParameterResultImpl(parameter, inferrer);
+  }
+
+  // TODO(sigmund,johnniwinther): compute result objects eagerly and make it an
+  // error to query for results that don't exist.
+  @override
+  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member) {
+    assert(
+        member is! ConstructorBodyEntity,
+        failedAt(
+            member,
+            "unexpected input: ConstructorBodyElements are created"
+            " after global type inference, no data is avaiable for them."));
+
+    bool isJsInterop = closedWorld.nativeData.isJsInteropMember(member);
+    return _memberResults.putIfAbsent(member,
+        () => _createMemberResult(_inferrer, member, isJsInterop: isJsInterop));
+  }
+
+  // TODO(sigmund,johnniwinther): compute result objects eagerly and make it an
+  // error to query for results that don't exist.
+  @override
+  GlobalTypeInferenceElementResult resultOfParameter(Local parameter) {
+    return _parameterResults.putIfAbsent(
+        parameter, () => _createParameterResult(_inferrer, parameter));
+  }
+
+  /// Returns the type of a [selector] when applied to a receiver with the given
+  /// type [mask].
+  @override
+  AbstractValue typeOfSelector(Selector selector, AbstractValue mask) =>
+      _inferrer.getTypeOfSelector(selector, mask);
+
+  /// Returns whether a fixed-length constructor call goes through a growable
+  /// check.
+  // TODO(sigmund): move into the result of the element containing such
+  // constructor call.
+  @override
+  bool isFixedArrayCheckedForGrowable(ir.Node ctorCall) =>
+      _inferrer.isFixedArrayCheckedForGrowable(ctorCall);
+}
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
new file mode 100644
index 0000000..cc91490
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -0,0 +1,752 @@
+// 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 '../common.dart';
+import '../common_elements.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart' show InterfaceType;
+import 'class_set.dart';
+
+// TODO(johnniwinther): Move more methods from `JClosedWorld` to
+// `ClassHierarchy`.
+abstract class ClassHierarchy {
+  /// Returns `true` if [cls] is either directly or indirectly instantiated.
+  bool isInstantiated(ClassEntity cls);
+
+  /// Returns `true` if [cls] is directly instantiated. This means that at
+  /// runtime instances of exactly [cls] are assumed to exist.
+  bool isDirectlyInstantiated(ClassEntity cls);
+
+  /// Returns `true` if [cls] is abstractly instantiated. This means that at
+  /// runtime instances of [cls] or unknown subclasses of [cls] are assumed to
+  /// exist.
+  ///
+  /// This is used to mark native and/or reflectable classes as instantiated.
+  /// For native classes we do not know the exact class that instantiates [cls]
+  /// so [cls] here represents the root of the subclasses. For reflectable
+  /// classes we need event abstract classes to be 'live' even though they
+  /// cannot themselves be instantiated.
+  bool isAbstractlyInstantiated(ClassEntity cls);
+
+  /// Returns `true` if [cls] is either directly or abstractly instantiated.
+  ///
+  /// See [isDirectlyInstantiated] and [isAbstractlyInstantiated].
+  bool isExplicitlyInstantiated(ClassEntity cls);
+
+  /// Returns `true` if [cls] is indirectly instantiated, that is through a
+  /// subclass.
+  bool isIndirectlyInstantiated(ClassEntity cls);
+
+  /// Return `true` if [x] is a subclass of [y].
+  bool isSubclassOf(ClassEntity x, ClassEntity y);
+
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y);
+
+  /// Returns an iterable over the live classes that extend [cls] including
+  /// [cls] itself.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
+
+  /// Returns an iterable over the live classes that extend [cls] _not_
+  /// including [cls] itself.
+  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls);
+
+  /// Returns the number of live classes that extend [cls] _not_
+  /// including [cls] itself.
+  int strictSubclassCount(ClassEntity cls);
+
+  /// Applies [f] to each live class that extend [cls] _not_ including [cls]
+  /// itself.
+  void forEachStrictSubclassOf(
+      ClassEntity cls, IterationStep f(ClassEntity cls));
+
+  /// Returns `true` if [predicate] applies to any live class that extend [cls]
+  /// _not_ including [cls] itself.
+  bool anyStrictSubclassOf(ClassEntity cls, bool predicate(ClassEntity cls));
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
+
+  /// Returns an iterable over the live classes that implement [cls] _not_
+  /// including [cls] if it is live.
+  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls);
+
+  /// Returns the number of live classes that implement [cls] _not_
+  /// including [cls] itself.
+  int strictSubtypeCount(ClassEntity cls);
+
+  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
+  /// itself.
+  void forEachStrictSubtypeOf(
+      ClassEntity cls, IterationStep f(ClassEntity cls));
+
+  /// Returns `true` if [predicate] applies to any live class that implements
+  /// [cls] _not_ including [cls] itself.
+  bool anyStrictSubtypeOf(ClassEntity cls, bool predicate(ClassEntity cls));
+
+  /// Returns `true` if [a] and [b] have any known common subtypes.
+  bool haveAnyCommonSubtypes(ClassEntity a, ClassEntity b);
+
+  /// Returns `true` if any live class other than [cls] extends [cls].
+  bool hasAnyStrictSubclass(ClassEntity cls);
+
+  /// Returns `true` if any live class other than [cls] implements [cls].
+  bool hasAnyStrictSubtype(ClassEntity cls);
+
+  /// Returns `true` if all live classes that implement [cls] extend it.
+  bool hasOnlySubclasses(ClassEntity cls);
+
+  /// Returns a [SubclassResult] for the subclasses that are contained in
+  /// the subclass/subtype sets of both [cls1] and [cls2].
+  ///
+  /// Classes that are implied by included superclasses/supertypes are not
+  /// returned.
+  ///
+  /// For instance for this hierarchy
+  ///
+  ///     class A {}
+  ///     class B {}
+  ///     class C implements A, B {}
+  ///     class D extends C {}
+  ///
+  /// the query
+  ///
+  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
+  ///
+  /// return the set {C} because [D] is implied by [C].
+  SubclassResult commonSubclasses(
+      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
+
+  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+  /// of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
+
+  /// Returns [ClassSet] for [cls] used to model the extends and implements
+  /// relations of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassSet getClassSet(ClassEntity cls);
+
+  /// Returns a string representation of the closed world.
+  ///
+  /// If [cls] is provided, the dump will contain only classes related to [cls].
+  String dump([ClassEntity cls]);
+}
+
+class ClassHierarchyImpl implements ClassHierarchy {
+  final CommonElements _commonElements;
+  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
+  final Map<ClassEntity, ClassSet> _classSets;
+
+  ClassHierarchyImpl(
+      this._commonElements, this._classHierarchyNodes, this._classSets);
+
+  @override
+  bool isInstantiated(ClassEntity cls) {
+    ClassHierarchyNode node = _classHierarchyNodes[cls];
+    return node != null && node.isInstantiated;
+  }
+
+  @override
+  bool isDirectlyInstantiated(ClassEntity cls) {
+    ClassHierarchyNode node = _classHierarchyNodes[cls];
+    return node != null && node.isDirectlyInstantiated;
+  }
+
+  @override
+  bool isAbstractlyInstantiated(ClassEntity cls) {
+    ClassHierarchyNode node = _classHierarchyNodes[cls];
+    return node != null && node.isAbstractlyInstantiated;
+  }
+
+  @override
+  bool isExplicitlyInstantiated(ClassEntity cls) {
+    ClassHierarchyNode node = _classHierarchyNodes[cls];
+    return node != null && node.isExplicitlyInstantiated;
+  }
+
+  @override
+  bool isIndirectlyInstantiated(ClassEntity cls) {
+    ClassHierarchyNode node = _classHierarchyNodes[cls];
+    return node != null && node.isIndirectlyInstantiated;
+  }
+
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = _classSets[y];
+    assert(
+        classSet != null,
+        failedAt(
+            y,
+            "No ClassSet for $y (${y.runtimeType}): "
+            "${dump(y)} : ${_classSets}"));
+    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x: ${dump(x)}"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  /// Return `true` if [x] is a (non-strict) subclass of [y].
+  bool isSubclassOf(ClassEntity x, ClassEntity y) {
+    return _classHierarchyNodes[y].hasSubclass(_classHierarchyNodes[x]);
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
+    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
+    if (hierarchy == null) return const <ClassEntity>[];
+    return hierarchy
+        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] _not_ including [cls] itself.
+  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return const <ClassEntity>[];
+    return subclasses.subclassesByMask(
+        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  /// Returns the number of live classes that extend [cls] _not_
+  /// including [cls] itself.
+  int strictSubclassCount(ClassEntity cls) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return 0;
+    return subclasses.instantiatedSubclassCount;
+  }
+
+  /// Applies [f] to each live class that extend [cls] _not_ including [cls]
+  /// itself.
+  void forEachStrictSubclassOf(
+      ClassEntity cls, IterationStep f(ClassEntity cls)) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return;
+    subclasses.forEachSubclass(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  /// Returns `true` if [predicate] applies to any live class that extend [cls]
+  /// _not_ including [cls] itself.
+  bool anyStrictSubclassOf(ClassEntity cls, bool predicate(ClassEntity cls)) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return false;
+    return subclasses.anySubclass(
+        predicate, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet
+          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+    }
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// _not_ including [cls].
+  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+          strict: true);
+    }
+  }
+
+  /// Returns the number of live classes that implement [cls] _not_
+  /// including [cls] itself.
+  int strictSubtypeCount(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) return 0;
+    return classSet.instantiatedSubtypeCount;
+  }
+
+  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
+  /// itself.
+  void forEachStrictSubtypeOf(
+      ClassEntity cls, IterationStep f(ClassEntity cls)) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) return;
+    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  /// Returns `true` if [predicate] applies to any live class that extend [cls]
+  /// _not_ including [cls] itself.
+  bool anyStrictSubtypeOf(ClassEntity cls, bool predicate(ClassEntity cls)) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) return false;
+    return classSet.anySubtype(
+        predicate, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  /// Returns `true` if [a] and [b] have any known common subtypes.
+  bool haveAnyCommonSubtypes(ClassEntity a, ClassEntity b) {
+    ClassSet classSetA = _classSets[a];
+    ClassSet classSetB = _classSets[b];
+    if (classSetA == null || classSetB == null) return false;
+    // TODO(johnniwinther): Implement an optimized query on [ClassSet].
+    Set<ClassEntity> subtypesOfB = classSetB.subtypes().toSet();
+    for (ClassEntity subtypeOfA in classSetA.subtypes()) {
+      if (subtypesOfB.contains(subtypeOfA)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Returns `true` if any directly instantiated class other than [cls] extends
+  /// [cls].
+  bool hasAnyStrictSubclass(ClassEntity cls) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return false;
+    return subclasses.isIndirectlyInstantiated;
+  }
+
+  /// Returns `true` if any directly instantiated class other than [cls]
+  /// implements [cls].
+  bool hasAnyStrictSubtype(ClassEntity cls) {
+    return strictSubtypeCount(cls) > 0;
+  }
+
+  /// Returns `true` if all directly instantiated classes that implement [cls]
+  /// extend it.
+  bool hasOnlySubclasses(ClassEntity cls) {
+    // TODO(johnniwinther): move this to ClassSet?
+    if (cls == _commonElements.objectClass) return true;
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      // Vacuously true.
+      return true;
+    }
+    return classSet.hasOnlyInstantiatedSubclasses;
+  }
+
+  SubclassResult commonSubclasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    if (query1 == ClassQuery.EXACT && query2 == ClassQuery.EXACT) {
+      // Exact classes [cls1] and [cls2] must be identical to have any classes
+      // in common.
+      if (cls1 != cls2) {
+        return SubclassResult.EMPTY;
+      }
+      return SubclassResult.EXACT1;
+    } else if (query1 == ClassQuery.EXACT) {
+      if (query2 == ClassQuery.SUBCLASS) {
+        // Exact [cls1] must be a subclass of [cls2] to have any classes in
+        // common.
+        if (isSubclassOf(cls1, cls2)) {
+          return SubclassResult.EXACT1;
+        }
+      } else if (query2 == ClassQuery.SUBTYPE) {
+        // Exact [cls1] must be a subtype of [cls2] to have any classes in
+        // common.
+        if (isSubtypeOf(cls1, cls2)) {
+          return SubclassResult.EXACT1;
+        }
+      }
+      return SubclassResult.EMPTY;
+    } else if (query2 == ClassQuery.EXACT) {
+      if (query1 == ClassQuery.SUBCLASS) {
+        // Exact [cls2] must be a subclass of [cls1] to have any classes in
+        // common.
+        if (isSubclassOf(cls2, cls1)) {
+          return SubclassResult.EXACT2;
+        }
+      } else if (query1 == ClassQuery.SUBTYPE) {
+        // Exact [cls2] must be a subtype of [cls1] to have any classes in
+        // common.
+        if (isSubtypeOf(cls2, cls1)) {
+          return SubclassResult.EXACT2;
+        }
+      }
+      return SubclassResult.EMPTY;
+    } else if (query1 == ClassQuery.SUBCLASS && query2 == ClassQuery.SUBCLASS) {
+      // [cls1] must be a subclass of [cls2] or vice versa to have any classes
+      // in common.
+      if (cls1 == cls2 || isSubclassOf(cls1, cls2)) {
+        // The subclasses of [cls1] are contained within the subclasses of
+        // [cls2].
+        return SubclassResult.SUBCLASS1;
+      } else if (isSubclassOf(cls2, cls1)) {
+        // The subclasses of [cls2] are contained within the subclasses of
+        // [cls1].
+        return SubclassResult.SUBCLASS2;
+      }
+      return SubclassResult.EMPTY;
+    } else if (query1 == ClassQuery.SUBCLASS) {
+      if (isSubtypeOf(cls1, cls2)) {
+        // The subclasses of [cls1] are all subtypes of [cls2].
+        return SubclassResult.SUBCLASS1;
+      }
+      if (cls1 == _commonElements.objectClass) {
+        // Since [cls1] is `Object` all subtypes of [cls2] are contained within
+        // the subclasses of [cls1].
+        return SubclassResult.SUBTYPE2;
+      }
+      // Find all the root subclasses of [cls1] of that implement [cls2].
+      //
+      // For this hierarchy:
+      //
+      //     class I {}
+      //     class A {}
+      //     class B extends A implements I {}
+      //     class C extends B {}
+      //     class D extends A implements I {}
+      //
+      // the common subclasses of "subclass of A" and "subtype of I" returns
+      // "subclasses of {B, D}". The inclusion of class `C` is implied because
+      // it is a subclass of `B`.
+      List<ClassEntity> classes = <ClassEntity>[];
+      forEachStrictSubclassOf(cls1, (ClassEntity subclass) {
+        if (isSubtypeOf(subclass, cls2)) {
+          classes.add(subclass);
+          // Skip subclasses of [subclass]; they all implement [cls2] by
+          // inheritance and are included in the subclasses of [subclass].
+          return IterationStep.SKIP_SUBCLASSES;
+        }
+        return IterationStep.CONTINUE;
+      });
+      return new SubclassResult(classes);
+    } else if (query2 == ClassQuery.SUBCLASS) {
+      if (isSubtypeOf(cls2, cls1)) {
+        // The subclasses of [cls2] are all subtypes of [cls1].
+        return SubclassResult.SUBCLASS2;
+      }
+      if (cls2 == _commonElements.objectClass) {
+        // Since [cls2] is `Object` all subtypes of [cls1] are contained within
+        // the subclasses of [cls2].
+        return SubclassResult.SUBTYPE1;
+      }
+      // Find all the root subclasses of [cls2] of that implement [cls1].
+      List<ClassEntity> classes = <ClassEntity>[];
+      forEachStrictSubclassOf(cls2, (ClassEntity subclass) {
+        if (isSubtypeOf(subclass, cls1)) {
+          classes.add(subclass);
+          // Skip subclasses of [subclass]; they all implement [cls1] by
+          // inheritance and are included in the subclasses of [subclass].
+          return IterationStep.SKIP_SUBCLASSES;
+        }
+        return IterationStep.CONTINUE;
+      });
+      return new SubclassResult(classes);
+    } else {
+      if (cls1 == cls2 || isSubtypeOf(cls1, cls2)) {
+        // The subtypes of [cls1] are contained within the subtypes of [cls2].
+        return SubclassResult.SUBTYPE1;
+      } else if (isSubtypeOf(cls2, cls1)) {
+        // The subtypes of [cls2] are contained within the subtypes of [cls1].
+        return SubclassResult.SUBTYPE2;
+      }
+      // Find all the root subclasses of [cls1] of that implement [cls2].
+      //
+      // For this hierarchy:
+      //
+      //     class I {}
+      //     class A {}
+      //     class B extends A implements I {}
+      //     class C extends B {}
+      //     class D extends A implements I {}
+      //     class E implements B {}
+      //     class F extends E {}
+      //
+      // the common subclasses of "subtype of A" and "subtype of I" returns
+      // "subclasses of {B, D, E}". The inclusion of classes `C` and `F` is
+      // implied because they are subclasses of `B` and `E`, respectively.
+      List<ClassEntity> classes = <ClassEntity>[];
+      forEachStrictSubtypeOf(cls1, (ClassEntity subclass) {
+        if (isSubtypeOf(subclass, cls2)) {
+          classes.add(subclass);
+          // Skip subclasses of [subclass]; they all implement [cls2] by
+          // inheritance and are included in the subclasses of [subclass].
+          return IterationStep.SKIP_SUBCLASSES;
+        }
+        return IterationStep.CONTINUE;
+      });
+      return new SubclassResult(classes);
+    }
+  }
+
+  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+  /// of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
+    return _classHierarchyNodes[cls];
+  }
+
+  /// Returns [ClassSet] for [cls] used to model the extends and implements
+  /// relations of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassSet getClassSet(ClassEntity cls) {
+    return _classSets[cls];
+  }
+
+  @override
+  String dump([ClassEntity cls]) {
+    StringBuffer sb = new StringBuffer();
+    if (cls != null) {
+      sb.write("Classes in the closed world related to $cls:\n");
+    } else {
+      sb.write("Instantiated classes in the closed world:\n");
+    }
+    getClassHierarchyNode(_commonElements.objectClass)
+        .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls);
+    return sb.toString();
+  }
+}
+
+class ClassHierarchyBuilder {
+  // We keep track of subtype and subclass relationships in four
+  // distinct sets to make class hierarchy analysis faster.
+  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
+      <ClassEntity, ClassHierarchyNode>{};
+  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
+  final Map<ClassEntity, Set<ClassEntity>> mixinUses =
+      new Map<ClassEntity, Set<ClassEntity>>();
+
+  final CommonElements _commonElements;
+  final ClassQueries _classQueries;
+
+  ClassHierarchyBuilder(this._commonElements, this._classQueries);
+
+  void registerClass(ClassEntity cls) {
+    _ensureClassSet(_classQueries.getDeclaration(cls));
+  }
+
+  ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
+    return classHierarchyNodes.putIfAbsent(cls, () {
+      ClassHierarchyNode parentNode;
+      ClassEntity superclass = _classQueries.getSuperClass(cls);
+      if (superclass != null) {
+        parentNode = _ensureClassHierarchyNode(superclass);
+      }
+      return new ClassHierarchyNode(
+          parentNode, cls, _classQueries.getHierarchyDepth(cls));
+    });
+  }
+
+  ClassSet _ensureClassSet(ClassEntity cls) {
+    return classSets.putIfAbsent(cls, () {
+      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+      ClassSet classSet = new ClassSet(node);
+
+      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
+        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
+        // superclasses.
+        ClassSet subtypeSet = _ensureClassSet(type.element);
+        subtypeSet.addSubtype(node);
+      }
+
+      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
+      while (appliedMixin != null) {
+        // TODO(johnniwinther): Use the data stored in [ClassSet].
+        registerMixinUse(cls, appliedMixin);
+        ClassSet mixinSet = _ensureClassSet(appliedMixin);
+        mixinSet.addMixinApplication(node);
+
+        // In case of
+        //
+        //    class A {}
+        //    class B = Object with A;
+        //    class C = Object with B;
+        //
+        // we need to register that C not only mixes in B but also A.
+        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
+      }
+      return classSet;
+    });
+  }
+
+  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
+    // Ensure that classes implicitly implementing `Function` are in its
+    // subtype set.
+    ClassEntity cls = node.cls;
+    if (cls != _commonElements.functionClass &&
+        _classQueries.implementsFunction(cls)) {
+      ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
+      subtypeSet.addSubtype(node);
+    }
+    if (!node.isInstantiated && node.parentNode != null) {
+      _updateSuperClassHierarchyNodeForClass(node.parentNode);
+    }
+  }
+
+  void updateClassHierarchyNodeForClass(ClassEntity cls,
+      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
+    ClassHierarchyNode node = _ensureClassSet(cls).node;
+    _updateSuperClassHierarchyNodeForClass(node);
+    if (directlyInstantiated) {
+      node.isDirectlyInstantiated = true;
+    }
+    if (abstractlyInstantiated) {
+      node.isAbstractlyInstantiated = true;
+    }
+  }
+
+  void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
+    // TODO(johnniwinther): Add map restricted to live classes.
+    // We don't support patch classes as mixin.
+    Set<ClassEntity> users =
+        mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
+    users.add(mixinApplication);
+  }
+
+  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
+    assert(
+        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
+    ClassSet classSet = classSets[y];
+    assert(classSet != null,
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
+    ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = classSets[x];
+    assert(classSet != null,
+        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
+
+    if (_isSubtypeOf(x, y)) {
+      // [x] implements [y] itself, possible through supertypes.
+      return true;
+    }
+
+    /// Returns `true` if any live subclass of [node] implements [y].
+    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
+      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
+          ClassHierarchyNode.INSTANTIATED,
+          strict: strict);
+    }
+
+    if (subclassImplements(classSet.node, strict: true)) {
+      // A subclass of [x] implements [y].
+      return true;
+    }
+
+    for (ClassHierarchyNode mixinApplication
+        in classSet.mixinApplicationNodes) {
+      if (subclassImplements(mixinApplication, strict: false)) {
+        // A subclass of [mixinApplication] implements [y].
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+abstract class ClassQueries {
+  /// Returns the declaration of [cls].
+  ClassEntity getDeclaration(covariant ClassEntity cls);
+
+  /// Returns the class mixed into [cls] if any.
+  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
+  // return transitively mixed in classes like in:
+  //     class A {}
+  //     class B = Object with A;
+  //     class C = Object with B;
+  ClassEntity getAppliedMixin(covariant ClassEntity cls);
+
+  /// Returns the hierarchy depth of [cls].
+  int getHierarchyDepth(covariant ClassEntity cls);
+
+  /// Returns `true` if [cls] implements `Function` either explicitly or through
+  /// a `call` method.
+  bool implementsFunction(covariant ClassEntity cls);
+
+  /// Returns the superclass of [cls] if any.
+  ClassEntity getSuperClass(covariant ClassEntity cls);
+
+  /// Returns all supertypes of [cls].
+  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
+}
+
+/// Enum values defining subset of classes included in queries.
+enum ClassQuery {
+  /// Only the class itself is included.
+  EXACT,
+
+  /// The class and all subclasses (transitively) are included.
+  SUBCLASS,
+
+  /// The class and all classes that implement or subclass it (transitively)
+  /// are included.
+  SUBTYPE,
+}
+
+/// Result kind for [ClassHierarchy.commonSubclasses].
+enum SubclassResultKind {
+  /// No common subclasses.
+  EMPTY,
+
+  /// Exactly the first class in common.
+  EXACT1,
+
+  /// Exactly the second class in common.
+  EXACT2,
+
+  /// Subclasses of the first class in common.
+  SUBCLASS1,
+
+  /// Subclasses of the second class in common.
+  SUBCLASS2,
+
+  /// Subtypes of the first class in common.
+  SUBTYPE1,
+
+  /// Subtypes of the second class in common.
+  SUBTYPE2,
+
+  /// Subclasses of a set of classes in common.
+  SET
+}
+
+/// Result computed in [ClassHierarchy.commonSubclasses].
+class SubclassResult {
+  final SubclassResultKind kind;
+  final List<ClassEntity> classes;
+
+  SubclassResult(this.classes) : kind = SubclassResultKind.SET;
+
+  const SubclassResult.internal(this.kind) : classes = null;
+
+  static const SubclassResult EMPTY =
+      const SubclassResult.internal(SubclassResultKind.EMPTY);
+  static const SubclassResult EXACT1 =
+      const SubclassResult.internal(SubclassResultKind.EXACT1);
+  static const SubclassResult EXACT2 =
+      const SubclassResult.internal(SubclassResultKind.EXACT2);
+  static const SubclassResult SUBCLASS1 =
+      const SubclassResult.internal(SubclassResultKind.SUBCLASS1);
+  static const SubclassResult SUBCLASS2 =
+      const SubclassResult.internal(SubclassResultKind.SUBCLASS2);
+  static const SubclassResult SUBTYPE1 =
+      const SubclassResult.internal(SubclassResultKind.SUBTYPE1);
+  static const SubclassResult SUBTYPE2 =
+      const SubclassResult.internal(SubclassResultKind.SUBTYPE2);
+
+  String toString() => 'SubclassResult($kind,classes=$classes)';
+}
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
deleted file mode 100644
index 337975f..0000000
--- a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
+++ /dev/null
@@ -1,181 +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 '../common.dart';
-import '../common_elements.dart';
-import '../elements/entities.dart';
-import '../elements/types.dart' show InterfaceType;
-import 'class_set.dart';
-
-class ClassHierarchyBuilder {
-  // We keep track of subtype and subclass relationships in four
-  // distinct sets to make class hierarchy analysis faster.
-  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
-      <ClassEntity, ClassHierarchyNode>{};
-  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
-  final Map<ClassEntity, Set<ClassEntity>> mixinUses =
-      new Map<ClassEntity, Set<ClassEntity>>();
-
-  final CommonElements _commonElements;
-  final ClassQueries _classQueries;
-
-  ClassHierarchyBuilder(this._commonElements, this._classQueries);
-
-  void registerClass(ClassEntity cls) {
-    _ensureClassSet(_classQueries.getDeclaration(cls));
-  }
-
-  ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
-    assert(_classQueries.checkClass(cls));
-    return classHierarchyNodes.putIfAbsent(cls, () {
-      ClassHierarchyNode parentNode;
-      ClassEntity superclass = _classQueries.getSuperClass(cls);
-      if (superclass != null) {
-        parentNode = _ensureClassHierarchyNode(superclass);
-      }
-      return new ClassHierarchyNode(
-          parentNode, cls, _classQueries.getHierarchyDepth(cls));
-    });
-  }
-
-  ClassSet _ensureClassSet(ClassEntity cls) {
-    assert(_classQueries.checkClass(cls));
-    return classSets.putIfAbsent(cls, () {
-      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
-      ClassSet classSet = new ClassSet(node);
-
-      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
-        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
-        // superclasses.
-        ClassSet subtypeSet = _ensureClassSet(type.element);
-        subtypeSet.addSubtype(node);
-      }
-
-      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
-      while (appliedMixin != null) {
-        // TODO(johnniwinther): Use the data stored in [ClassSet].
-        registerMixinUse(cls, appliedMixin);
-        ClassSet mixinSet = _ensureClassSet(appliedMixin);
-        mixinSet.addMixinApplication(node);
-
-        // In case of
-        //
-        //    class A {}
-        //    class B = Object with A;
-        //    class C = Object with B;
-        //
-        // we need to register that C not only mixes in B but also A.
-        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
-      }
-      return classSet;
-    });
-  }
-
-  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
-    // Ensure that classes implicitly implementing `Function` are in its
-    // subtype set.
-    ClassEntity cls = node.cls;
-    if (cls != _commonElements.functionClass &&
-        _classQueries.implementsFunction(cls)) {
-      ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
-      subtypeSet.addSubtype(node);
-    }
-    if (!node.isInstantiated && node.parentNode != null) {
-      _updateSuperClassHierarchyNodeForClass(node.parentNode);
-    }
-  }
-
-  void updateClassHierarchyNodeForClass(ClassEntity cls,
-      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
-    ClassHierarchyNode node = _ensureClassSet(cls).node;
-    _updateSuperClassHierarchyNodeForClass(node);
-    if (directlyInstantiated) {
-      node.isDirectlyInstantiated = true;
-    }
-    if (abstractlyInstantiated) {
-      node.isAbstractlyInstantiated = true;
-    }
-  }
-
-  void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
-    // TODO(johnniwinther): Add map restricted to live classes.
-    // We don't support patch classes as mixin.
-    Set<ClassEntity> users =
-        mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
-    users.add(mixinApplication);
-  }
-
-  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
-    assert(
-        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
-    ClassSet classSet = classSets[y];
-    assert(classSet != null,
-        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
-    ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
-    assert(classHierarchyNode != null,
-        failedAt(x, "No ClassHierarchyNode for $x"));
-    return classSet.hasSubtype(classHierarchyNode);
-  }
-
-  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
-    ClassSet classSet = classSets[x];
-    assert(classSet != null,
-        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
-
-    if (_isSubtypeOf(x, y)) {
-      // [x] implements [y] itself, possible through supertypes.
-      return true;
-    }
-
-    /// Returns `true` if any live subclass of [node] implements [y].
-    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
-      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
-          ClassHierarchyNode.INSTANTIATED,
-          strict: strict);
-    }
-
-    if (subclassImplements(classSet.node, strict: true)) {
-      // A subclass of [x] implements [y].
-      return true;
-    }
-
-    for (ClassHierarchyNode mixinApplication
-        in classSet.mixinApplicationNodes) {
-      if (subclassImplements(mixinApplication, strict: false)) {
-        // A subclass of [mixinApplication] implements [y].
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-abstract class ClassQueries {
-  bool checkClass(covariant ClassEntity cls);
-  bool validateClass(covariant ClassEntity cls);
-
-  /// Returns the declaration of [cls].
-  ClassEntity getDeclaration(covariant ClassEntity cls);
-
-  /// Returns the class mixed into [cls] if any.
-  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
-  // return transitively mixed in classes like in:
-  //     class A {}
-  //     class B = Object with A;
-  //     class C = Object with B;
-  ClassEntity getAppliedMixin(covariant ClassEntity cls);
-
-  /// Returns the hierarchy depth of [cls].
-  int getHierarchyDepth(covariant ClassEntity cls);
-
-  /// Returns `true` if [cls] implements `Function` either explicitly or through
-  /// a `call` method.
-  bool implementsFunction(covariant ClassEntity cls);
-
-  /// Returns the superclass of [cls] if any.
-  ClassEntity getSuperClass(covariant ClassEntity cls);
-
-  /// Returns all supertypes of [cls].
-  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
-}
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index e747c75..3d17859 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -4,7 +4,7 @@
 
 library dart2js.world.class_set;
 
-import 'dart:collection' show IterableBase;
+import 'dart:collection' show IterableBase, MapBase;
 
 import 'package:front_end/src/fasta/util/link.dart' show Link;
 
@@ -964,3 +964,44 @@
 /// and [ClassSet]. The return value controls the continued iteration. If `null`
 /// is returned, iteration continues to the end.
 typedef IterationStep ForEachFunction(ClassEntity cls);
+
+/// Singleton map implemented as a field on the key.
+class ClassHierarchyNodesMap extends MapBase<ClassEntity, ClassHierarchyNode> {
+  ClassHierarchyNode operator [](Object cls) {
+    // TOOD(sra): Change the key type to `covariant ClassHierarchyNodesMapKey`.
+    if (cls is ClassHierarchyNodesMapKey) {
+      return cls._classHierarchyNode;
+    }
+    throw new UnimplementedError('ClassHierarchyNodesMap for $cls');
+  }
+
+  operator []=(Object cls, ClassHierarchyNode node) {
+    // TOOD(sra): Change the key type to `covariant ClassHierarchyNodesMapKey`.
+    if (cls is ClassHierarchyNodesMapKey) {
+      cls._classHierarchyNode = node;
+      return;
+    }
+    throw new UnimplementedError('ClassHierarchyNodesMap for $cls');
+  }
+
+  ClassHierarchyNode putIfAbsent(
+      ClassEntity cls, ClassHierarchyNode ifAbsent()) {
+    return this[cls] ??= ifAbsent();
+  }
+
+  Iterable<ClassEntity> get keys {
+    throw new UnimplementedError('ClassHierarchyNodesMap.keys');
+  }
+
+  ClassHierarchyNode remove(Object key) {
+    throw new UnimplementedError('ClassHierarchyNodesMap.remove');
+  }
+
+  void clear() {
+    throw new UnimplementedError('ClassHierarchyNodesMap.clear');
+  }
+}
+
+abstract class ClassHierarchyNodesMapKey implements ClassEntity {
+  ClassHierarchyNode _classHierarchyNode;
+}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index fecaed8..cc99a9d 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -77,6 +77,9 @@
   /// an ordering that is less sensitive to perturbations in the source code.
   List<ConstantValue> getConstantsForEmission(
       [Comparator<ConstantValue> preSortCompare]);
+
+  /// Returns the types that are live as constant type literals.
+  Iterable<DartType> get constTypeLiterals;
 }
 
 class CodegenWorldBuilderImpl extends WorldBuilderBase
@@ -162,6 +165,8 @@
   final KernelToWorldBuilder _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
 
+  final Set<DartType> _liveTypeArguments = new Set<DartType>();
+
   CodegenWorldBuilderImpl(
       this._elementMap,
       this._globalLocalsMap,
@@ -364,7 +369,6 @@
         break;
       case StaticUseKind.SUPER_FIELD_SET:
       case StaticUseKind.FIELD_SET:
-      case StaticUseKind.DIRECT_USE:
       case StaticUseKind.CLOSURE:
       case StaticUseKind.CLOSURE_CALL:
       case StaticUseKind.CALL_METHOD:
@@ -421,7 +425,6 @@
       case StaticUseKind.SET:
       case StaticUseKind.INIT:
       case StaticUseKind.REFLECT:
-      case StaticUseKind.DIRECT_USE:
         useSet.addAll(usage.normalUse());
         break;
       case StaticUseKind.CONSTRUCTOR_INVOKE:
@@ -688,4 +691,10 @@
       f(member);
     });
   }
+
+  void registerTypeArgument(DartType type) {
+    _liveTypeArguments.add(type);
+  }
+
+  Iterable<DartType> get constTypeLiterals => _liveTypeArguments;
 }
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index b472c00..75cbb01 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -721,7 +721,6 @@
       case StaticUseKind.SET:
         useSet.addAll(usage.write());
         break;
-      case StaticUseKind.DIRECT_USE:
       case StaticUseKind.REFLECT:
         useSet.addAll(usage.fullyUse());
         break;
@@ -912,11 +911,6 @@
       if (!info.hasInstantiation) {
         return;
       }
-      assert(_classQueries.checkClass(cls));
-      if (!_classQueries.validateClass(cls)) {
-        failedAt(cls, 'Class "${cls.name}" is not resolved.');
-      }
-
       _classHierarchyBuilder.updateClassHierarchyNodeForClass(cls,
           directlyInstantiated: info.isDirectlyInstantiated,
           abstractlyInstantiated: info.isAbstractlyInstantiated);
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 0db511d..9972e88 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -141,7 +141,6 @@
   CONST_CONSTRUCTOR_INVOKE,
   REDIRECTION,
   DIRECT_INVOKE,
-  DIRECT_USE,
   INLINING,
   INVOKE,
   GET,
@@ -517,11 +516,6 @@
     return new StaticUse.internal(element, StaticUseKind.INVOKE);
   }
 
-  /// Direct use of [element] as done with `--analyze-all` and `--analyze-main`.
-  factory StaticUse.directUse(MemberEntity element) {
-    return new StaticUse.internal(element, StaticUseKind.DIRECT_USE);
-  }
-
   /// Inlining of [element].
   factory StaticUse.constructorInlining(
       ConstructorEntity element, InterfaceType instanceType) {
@@ -582,6 +576,7 @@
   NATIVE_INSTANTIATION,
   IMPLICIT_CAST,
   PARAMETER_CHECK,
+  RTI_VALUE,
 }
 
 /// Use of a [DartType].
@@ -629,6 +624,9 @@
       case TypeUseKind.PARAMETER_CHECK:
         sb.write('param:');
         break;
+      case TypeUseKind.RTI_VALUE:
+        sb.write('typeArg:');
+        break;
     }
     sb.write(type);
     return sb.toString();
@@ -692,6 +690,11 @@
     return new TypeUse.internal(type, TypeUseKind.NATIVE_INSTANTIATION);
   }
 
+  /// [type] used as a direct RTI value.
+  factory TypeUse.constTypeLiteral(DartType type) {
+    return new TypeUse.internal(type, TypeUseKind.RTI_VALUE);
+  }
+
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! TypeUse) return false;
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index c1bf88d..2417fd3 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -28,7 +28,7 @@
 import '../util/enumset.dart';
 import '../util/util.dart';
 import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
-import 'class_hierarchy_builder.dart' show ClassHierarchyBuilder, ClassQueries;
+import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
 import 'selector.dart' show Selector;
 import 'use.dart'
     show
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 2a33f49..652cde7 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -23,6 +23,7 @@
 import 'ordered_typeset.dart';
 import 'options.dart';
 import 'types/abstract_value_domain.dart';
+import 'universe/class_hierarchy.dart';
 import 'universe/class_set.dart';
 import 'universe/function_set.dart' show FunctionSet;
 import 'universe/selector.dart' show Selector;
@@ -68,97 +69,11 @@
 
   Iterable<MemberEntity> get processedMembers;
 
-  /// Returns `true` if [cls] is either directly or indirectly instantiated.
-  bool isInstantiated(ClassEntity cls);
-
-  /// Returns `true` if [cls] is directly instantiated. This means that at
-  /// runtime instances of exactly [cls] are assumed to exist.
-  bool isDirectlyInstantiated(ClassEntity cls);
-
-  /// Returns `true` if [cls] is abstractly instantiated. This means that at
-  /// runtime instances of [cls] or unknown subclasses of [cls] are assumed to
-  /// exist.
-  ///
-  /// This is used to mark native and/or reflectable classes as instantiated.
-  /// For native classes we do not know the exact class that instantiates [cls]
-  /// so [cls] here represents the root of the subclasses. For reflectable
-  /// classes we need event abstract classes to be 'live' even though they
-  /// cannot themselves be instantiated.
-  bool isAbstractlyInstantiated(ClassEntity cls);
-
-  /// Returns `true` if [cls] is either directly or abstractly instantiated.
-  ///
-  /// See [isDirectlyInstantiated] and [isAbstractlyInstantiated].
-  bool isExplicitlyInstantiated(ClassEntity cls);
-
-  /// Returns `true` if [cls] is indirectly instantiated, that is through a
-  /// subclass.
-  bool isIndirectlyInstantiated(ClassEntity cls);
+  ClassHierarchy get classHierarchy;
 
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassEntity cls);
 
-  /// Return `true` if [x] is a subclass of [y].
-  bool isSubclassOf(ClassEntity x, ClassEntity y);
-
-  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
-  /// instance of [y].
-  bool isSubtypeOf(ClassEntity x, ClassEntity y);
-
-  /// Returns an iterable over the live classes that extend [cls] including
-  /// [cls] itself.
-  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
-
-  /// Returns an iterable over the live classes that extend [cls] _not_
-  /// including [cls] itself.
-  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls);
-
-  /// Returns the number of live classes that extend [cls] _not_
-  /// including [cls] itself.
-  int strictSubclassCount(ClassEntity cls);
-
-  /// Applies [f] to each live class that extend [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubclassOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls));
-
-  /// Returns `true` if [predicate] applies to any live class that extend [cls]
-  /// _not_ including [cls] itself.
-  bool anyStrictSubclassOf(ClassEntity cls, bool predicate(ClassEntity cls));
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
-
-  /// Returns an iterable over the live classes that implement [cls] _not_
-  /// including [cls] if it is live.
-  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls);
-
-  /// Returns the number of live classes that implement [cls] _not_
-  /// including [cls] itself.
-  int strictSubtypeCount(ClassEntity cls);
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls));
-
-  /// Returns `true` if [predicate] applies to any live class that implements
-  /// [cls] _not_ including [cls] itself.
-  bool anyStrictSubtypeOf(ClassEntity cls, bool predicate(ClassEntity cls));
-
-  /// Returns `true` if [a] and [b] have any known common subtypes.
-  bool haveAnyCommonSubtypes(ClassEntity a, ClassEntity b);
-
-  /// Returns `true` if any live class other than [cls] extends [cls].
-  bool hasAnyStrictSubclass(ClassEntity cls);
-
-  /// Returns `true` if any live class other than [cls] implements [cls].
-  bool hasAnyStrictSubtype(ClassEntity cls);
-
-  /// Returns `true` if all live classes that implement [cls] extend it.
-  bool hasOnlySubclasses(ClassEntity cls);
-
   /// Returns the most specific subclass of [cls] (including [cls]) that is
   /// directly instantiated or a superclass of all directly instantiated
   /// subclasses. If [cls] is not instantiated, `null` is returned.
@@ -172,27 +87,6 @@
   /// Returns an iterable over the common supertypes of the [classes].
   Iterable<ClassEntity> commonSupertypesOf(Iterable<ClassEntity> classes);
 
-  /// Returns an iterable of the classes that are contained in the
-  /// strict subclass/subtype sets of both [cls1] and [cls2].
-  ///
-  /// Classes that are implied by included superclasses/supertypes are not
-  /// returned.
-  ///
-  /// For instance for this hierarchy
-  ///
-  ///     class A {}
-  ///     class B {}
-  ///     class C implements A, B {}
-  ///     class D extends C {}
-  ///
-  /// the query
-  ///
-  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
-  ///
-  /// return the set {C} because [D] is implied by [C].
-  Iterable<ClassEntity> commonSubclasses(
-      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
-
   /// Returns an iterable over the live mixin applications that mixin [cls].
   Iterable<ClassEntity> mixinUsesOf(ClassEntity cls);
 
@@ -264,20 +158,6 @@
   bool hasElementIn(
       covariant ClassEntity cls, Selector selector, covariant Entity element);
 
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls);
-
   /// Returns `true` if the field [element] is known to be effectively final.
   bool fieldNeverChanges(MemberEntity element);
 
@@ -318,17 +198,6 @@
   /// [receiver]. If multiple targets exist or the single target is not a field,
   /// `null` is returned.
   FieldEntity locateSingleField(Selector selector, AbstractValue receiver);
-
-  /// Returns a string representation of the closed world.
-  ///
-  /// If [cls] is provided, the dump will contain only classes related to [cls].
-  String dump([ClassEntity cls]);
-
-  /// Adds the closure class [cls] to the inference world. The class is
-  /// considered directly instantiated. If [fromInstanceMember] is true, this
-  /// closure class represents a closure that is inside an instance member, thus
-  /// has access to `this`.
-  void registerClosureClass(ClassEntity cls);
 }
 
 abstract class OpenWorld implements World {
@@ -355,19 +224,6 @@
   bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type);
 }
 
-/// Enum values defining subset of classes included in queries.
-enum ClassQuery {
-  /// Only the class itself is included.
-  EXACT,
-
-  /// The class and all subclasses (transitively) are included.
-  SUBCLASS,
-
-  /// The class and all classes that implement or subclass it (transitively)
-  /// are included.
-  SUBTYPE,
-}
-
 abstract class ClosedWorldBase implements JClosedWorld {
   final ConstantSystem constantSystem;
   final NativeData nativeData;
@@ -404,6 +260,8 @@
 
   final Iterable<MemberEntity> processedMembers;
 
+  final ClassHierarchy classHierarchy;
+
   ClosedWorldBase(
       this.elementEnvironment,
       this.dartTypes,
@@ -425,12 +283,9 @@
       AbstractValueStrategy abstractValueStrategy)
       : this._implementedClasses = implementedClasses,
         this._classHierarchyNodes = classHierarchyNodes,
-        this._classSets = classSets {}
-
-  bool checkEntity(covariant Entity element);
-
-  bool checkInvariants(covariant ClassEntity cls,
-      {bool mustBeInstantiated: true});
+        this._classSets = classSets,
+        classHierarchy = new ClassHierarchyImpl(
+            commonElements, classHierarchyNodes, classSets) {}
 
   OrderedTypeSet getOrderedTypeSet(covariant ClassEntity cls);
 
@@ -444,207 +299,11 @@
 
   bool isNamedMixinApplication(covariant ClassEntity cls);
 
-  @override
-  bool isInstantiated(ClassEntity cls) {
-    ClassHierarchyNode node = _classHierarchyNodes[cls];
-    return node != null && node.isInstantiated;
-  }
-
-  @override
-  bool isDirectlyInstantiated(ClassEntity cls) {
-    ClassHierarchyNode node = _classHierarchyNodes[cls];
-    return node != null && node.isDirectlyInstantiated;
-  }
-
-  @override
-  bool isAbstractlyInstantiated(ClassEntity cls) {
-    ClassHierarchyNode node = _classHierarchyNodes[cls];
-    return node != null && node.isAbstractlyInstantiated;
-  }
-
-  @override
-  bool isExplicitlyInstantiated(ClassEntity cls) {
-    ClassHierarchyNode node = _classHierarchyNodes[cls];
-    return node != null && node.isExplicitlyInstantiated;
-  }
-
-  @override
-  bool isIndirectlyInstantiated(ClassEntity cls) {
-    ClassHierarchyNode node = _classHierarchyNodes[cls];
-    return node != null && node.isIndirectlyInstantiated;
-  }
-
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassEntity cls) {
     return _implementedClasses.contains(cls);
   }
 
-  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
-  /// instance of [y].
-  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
-    assert(checkInvariants(x));
-    assert(checkInvariants(y, mustBeInstantiated: false));
-    ClassSet classSet = _classSets[y];
-    assert(
-        classSet != null,
-        failedAt(
-            y,
-            "No ClassSet for $y (${y.runtimeType}): "
-            "${dump(y)} : ${_classSets}"));
-    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
-    assert(classHierarchyNode != null,
-        failedAt(x, "No ClassHierarchyNode for $x: ${dump(x)}"));
-    return classSet.hasSubtype(classHierarchyNode);
-  }
-
-  /// Return `true` if [x] is a (non-strict) subclass of [y].
-  bool isSubclassOf(ClassEntity x, ClassEntity y) {
-    assert(checkInvariants(x));
-    assert(checkInvariants(y));
-    return _classHierarchyNodes[y].hasSubclass(_classHierarchyNodes[x]);
-  }
-
-  /// Returns an iterable over the directly instantiated classes that extend
-  /// [cls] possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
-    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
-    if (hierarchy == null) return const <ClassEntity>[];
-    return hierarchy
-        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-  }
-
-  /// Returns an iterable over the directly instantiated classes that extend
-  /// [cls] _not_ including [cls] itself.
-  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return const <ClassEntity>[];
-    return subclasses.subclassesByMask(
-        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Returns the number of live classes that extend [cls] _not_
-  /// including [cls] itself.
-  int strictSubclassCount(ClassEntity cls) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return 0;
-    return subclasses.instantiatedSubclassCount;
-  }
-
-  /// Applies [f] to each live class that extend [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubclassOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return;
-    subclasses.forEachSubclass(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Returns `true` if [predicate] applies to any live class that extend [cls]
-  /// _not_ including [cls] itself.
-  bool anyStrictSubclassOf(ClassEntity cls, bool predicate(ClassEntity cls)) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return false;
-    return subclasses.anySubclass(
-        predicate, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      return const <ClassEntity>[];
-    } else {
-      return classSet
-          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-    }
-  }
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// _not_ including [cls].
-  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      return const <ClassEntity>[];
-    } else {
-      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-          strict: true);
-    }
-  }
-
-  /// Returns the number of live classes that implement [cls] _not_
-  /// including [cls] itself.
-  int strictSubtypeCount(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) return 0;
-    return classSet.instantiatedSubtypeCount;
-  }
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) return;
-    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Returns `true` if [predicate] applies to any live class that extend [cls]
-  /// _not_ including [cls] itself.
-  bool anyStrictSubtypeOf(ClassEntity cls, bool predicate(ClassEntity cls)) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) return false;
-    return classSet.anySubtype(
-        predicate, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Returns `true` if [a] and [b] have any known common subtypes.
-  bool haveAnyCommonSubtypes(ClassEntity a, ClassEntity b) {
-    ClassSet classSetA = _classSets[a];
-    ClassSet classSetB = _classSets[b];
-    if (classSetA == null || classSetB == null) return false;
-    // TODO(johnniwinther): Implement an optimized query on [ClassSet].
-    Set<ClassEntity> subtypesOfB = classSetB.subtypes().toSet();
-    for (ClassEntity subtypeOfA in classSetA.subtypes()) {
-      if (subtypesOfB.contains(subtypeOfA)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /// Returns `true` if any directly instantiated class other than [cls] extends
-  /// [cls].
-  bool hasAnyStrictSubclass(ClassEntity cls) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return false;
-    return subclasses.isIndirectlyInstantiated;
-  }
-
-  /// Returns `true` if any directly instantiated class other than [cls]
-  /// implements [cls].
-  bool hasAnyStrictSubtype(ClassEntity cls) {
-    return strictSubtypeCount(cls) > 0;
-  }
-
-  /// Returns `true` if all directly instantiated classes that implement [cls]
-  /// extend it.
-  bool hasOnlySubclasses(ClassEntity cls) {
-    // TODO(johnniwinther): move this to ClassSet?
-    if (cls == commonElements.objectClass) return true;
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      // Vacuously true.
-      return true;
-    }
-    return classSet.hasOnlyInstantiatedSubclasses;
-  }
-
   @override
   ClassEntity getLubOfInstantiatedSubclasses(ClassEntity cls) {
     if (nativeData.isJsInteropClass(cls)) {
@@ -665,27 +324,6 @@
     return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
   }
 
-  Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
-      ClassEntity cls2, ClassQuery query2) {
-    Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
-    if (xSubset == null) return null;
-    Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
-    if (ySubset == null) return null;
-    return xSubset.toSet().intersection(ySubset.toSet());
-  }
-
-  Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
-    switch (query) {
-      case ClassQuery.EXACT:
-        return null;
-      case ClassQuery.SUBCLASS:
-        return strictSubclassesOf(cls);
-      case ClassQuery.SUBTYPE:
-        return strictSubtypesOf(cls);
-    }
-    throw new ArgumentError('Unexpected query: $query.');
-  }
-
   /// Returns `true` if [cls] is mixed into a live class.
   bool isUsedAsMixin(ClassEntity cls) {
     return !mixinUsesOf(cls).isEmpty;
@@ -703,8 +341,10 @@
   bool everySubtypeIsSubclassOfOrMixinUseOf(ClassEntity x, ClassEntity y) {
     Map<ClassEntity, bool> secondMap =
         _subtypeCoveredByCache[x] ??= <ClassEntity, bool>{};
-    return secondMap[y] ??= subtypesOf(x).every((ClassEntity cls) =>
-        isSubclassOf(cls, y) || isSubclassOfMixinUseOf(cls, y));
+    return secondMap[y] ??= classHierarchy.subtypesOf(x).every(
+        (ClassEntity cls) =>
+            classHierarchy.isSubclassOf(cls, y) ||
+            isSubclassOfMixinUseOf(cls, y));
   }
 
   /// Returns `true` if any subclass of [superclass] implements [type].
@@ -774,7 +414,6 @@
     if (!iterator.moveNext()) return const <ClassEntity>[];
 
     ClassEntity cls = iterator.current;
-    assert(checkInvariants(cls));
     OrderedTypeSet typeSet = getOrderedTypeSet(cls);
     if (!iterator.moveNext()) return typeSet.types.map((type) => type.element);
 
@@ -782,7 +421,6 @@
     Link<OrderedTypeSet> otherTypeSets = const Link<OrderedTypeSet>();
     do {
       ClassEntity otherClass = iterator.current;
-      assert(checkInvariants(otherClass));
       OrderedTypeSet otherTypeSet = getOrderedTypeSet(otherClass);
       otherTypeSets = otherTypeSets.prepend(otherTypeSet);
       if (otherTypeSet.maxDepth < depth) {
@@ -809,38 +447,6 @@
     return commonSupertypes;
   }
 
-  Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
-      ClassEntity cls2, ClassQuery query2) {
-    // TODO(johnniwinther): Use [ClassSet] to compute this.
-    // Compute the set of classes that are contained in both class subsets.
-    Set<ClassEntity> common =
-        _commonContainedClasses(cls1, query1, cls2, query2);
-    if (common == null || common.isEmpty) return const <ClassEntity>[];
-    // Narrow down the candidates by only looking at common classes
-    // that do not have a superclass or supertype that will be a
-    // better candidate.
-    return common.where((ClassEntity each) {
-      bool containsSuperclass = common.contains(getSuperClass(each));
-      // If the superclass is also a candidate, then we don't want to
-      // deal with this class. If we're only looking for a subclass we
-      // know we don't have to look at the list of interfaces because
-      // they can never be in the common set.
-      if (containsSuperclass ||
-          query1 == ClassQuery.SUBCLASS ||
-          query2 == ClassQuery.SUBCLASS) {
-        return !containsSuperclass;
-      }
-      // Run through the direct supertypes of the class. If the common
-      // set contains the direct supertype of the class, we ignore the
-      // the class because the supertype is a better candidate.
-
-      for (ClassEntity interface in getInterfaces(each)) {
-        if (common.contains(interface)) return false;
-      }
-      return true;
-    });
-  }
-
   /// Returns an iterable over the live mixin applications that mixin [cls].
   Iterable<ClassEntity> mixinUsesOf(ClassEntity cls) {
     if (_liveMixinUses == null) {
@@ -849,7 +455,7 @@
         List<ClassEntity> uses = <ClassEntity>[];
 
         void addLiveUse(ClassEntity mixinApplication) {
-          if (isInstantiated(mixinApplication)) {
+          if (classHierarchy.isInstantiated(mixinApplication)) {
             uses.add(mixinApplication);
           } else if (isNamedMixinApplication(mixinApplication)) {
             Set<ClassEntity> next = mixinUses[mixinApplication];
@@ -873,7 +479,7 @@
   /// of [superclass].
   bool hasAnySubclassThatMixes(ClassEntity superclass, ClassEntity mixin) {
     return mixinUsesOf(mixin).any((ClassEntity each) {
-      return isSubclassOf(each, superclass);
+      return classHierarchy.isSubclassOf(each, superclass);
     });
   }
 
@@ -993,19 +599,6 @@
     return false;
   }
 
-  @override
-  String dump([ClassEntity cls]) {
-    StringBuffer sb = new StringBuffer();
-    if (cls != null) {
-      sb.write("Classes in the closed world related to $cls:\n");
-    } else {
-      sb.write("Instantiated classes in the closed world:\n");
-    }
-    getClassHierarchyNode(commonElements.objectClass)
-        .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls);
-    return sb.toString();
-  }
-
   /// Should only be called by subclasses.
   void addClassHierarchyNode(ClassEntity cls, ClassHierarchyNode node) {
     _classHierarchyNodes[cls] = node;
@@ -1037,23 +630,11 @@
   InterceptorData get interceptorData;
   ElementEnvironment get elementEnvironment;
   CommonElements get commonElements;
+  ClassHierarchy get classHierarchy;
 
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassEntity cls);
 
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls);
   Iterable<MemberEntity> get liveInstanceMembers;
   Map<ClassEntity, Set<ClassEntity>> get mixinUses;
   Map<ClassEntity, Set<ClassEntity>> get typesImplementedBySubclasses;
@@ -1065,42 +646,4 @@
   Iterable<MemberEntity> get processedMembers;
   RuntimeTypesNeed get rtiNeed;
   NoSuchMethodData get noSuchMethodData;
-
-  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
-  /// instance of [y].
-  bool isSubtypeOf(ClassEntity x, ClassEntity y);
-
-  /// Returns an iterable of the classes that are contained in the
-  /// strict subclass/subtype sets of both [cls1] and [cls2].
-  ///
-  /// Classes that are implied by included superclasses/supertypes are not
-  /// returned.
-  ///
-  /// For instance for this hierarchy
-  ///
-  ///     class A {}
-  ///     class B {}
-  ///     class C implements A, B {}
-  ///     class D extends C {}
-  ///
-  /// the query
-  ///
-  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
-  ///
-  /// return the set {C} because [D] is implied by [C].
-  Iterable<ClassEntity> commonSubclasses(
-      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
-
-  /// Returns an iterable over the live classes that extend [cls] including
-  /// [cls] itself.
-  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls));
 }
diff --git a/pkg/dart_messages/bin/publish.dart b/pkg/dart_messages/bin/publish.dart
index 2b609e6..60bc818 100644
--- a/pkg/dart_messages/bin/publish.dart
+++ b/pkg/dart_messages/bin/publish.dart
@@ -128,7 +128,7 @@
           out.write(escapeExampleContent(example));
         } else if (example is Map) {
           out.writeln("      const {");
-          example.forEach((String fileName, String content) {
+          example.forEach((fileName, content) {
             out.writeln("      '$fileName': ");
             out.write(escapeExampleContent(content));
             out.writeln(",");
diff --git a/pkg/dev_compiler/analysis_options.yaml b/pkg/dev_compiler/analysis_options.yaml
index 2b52428..55db4c5 100644
--- a/pkg/dev_compiler/analysis_options.yaml
+++ b/pkg/dev_compiler/analysis_options.yaml
@@ -1,10 +1,9 @@
 analyzer:
-  strong-mode: true
   exclude:
     - doc/api/**
     - gen/**
     - node_modules/**
-    - tool/input_sdk/**
     - test/codegen/**
     - test/samples/**
     - test/transformer/hello_app/**
+    - tool/input_sdk/**
diff --git a/pkg/dev_compiler/lib/src/analyzer/context.dart b/pkg/dev_compiler/lib/src/analyzer/context.dart
index b2d7198..4fd87fc 100644
--- a/pkg/dev_compiler/lib/src/analyzer/context.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/context.dart
@@ -63,9 +63,7 @@
       String dartSdkSummaryPath,
       List<String> summaryPaths}) {
     var contextBuilderOptions = ContextBuilderOptions()
-      ..defaultOptions = (AnalysisOptionsImpl()
-        ..strongMode = true
-        ..previewDart2 = true)
+      ..defaultOptions = (AnalysisOptionsImpl()..previewDart2 = true)
       ..dartSdkSummaryPath = dartSdkSummaryPath;
 
     return AnalyzerOptions._(
@@ -76,8 +74,8 @@
 
   factory AnalyzerOptions.fromArguments(ArgResults args,
       {String dartSdkSummaryPath, List<String> summaryPaths}) {
-    var contextBuilderOptions = createContextBuilderOptions(args,
-        strongMode: true, trackCacheDependencies: false);
+    var contextBuilderOptions =
+        createContextBuilderOptions(args, trackCacheDependencies: false);
     (contextBuilderOptions.defaultOptions as AnalysisOptionsImpl).previewDart2 =
         true;
 
diff --git a/pkg/dev_compiler/pubspec.yaml b/pkg/dev_compiler/pubspec.yaml
new file mode 100644
index 0000000..86d997a
--- /dev/null
+++ b/pkg/dev_compiler/pubspec.yaml
@@ -0,0 +1 @@
+name: dev_compiler
diff --git a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
index 45bec4f..62ec112 100644
--- a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
@@ -86,11 +86,11 @@
 
   @override
   Future<List<int>> readAsBytes() async {
-    List<int> contents = _fileSystem._files[uri];
+    Uint8List contents = _fileSystem._files[uri];
     if (contents == null) {
       throw new FileSystemException(uri, 'File $uri does not exist.');
     }
-    return contents.toList();
+    return contents;
   }
 
   @override
@@ -108,7 +108,11 @@
   /// If no file exists, one is created.  If a file exists already, it is
   /// overwritten.
   void writeAsBytesSync(List<int> bytes) {
-    _update(uri, new Uint8List.fromList(bytes));
+    if (bytes is Uint8List) {
+      _update(uri, bytes);
+    } else {
+      _update(uri, new Uint8List.fromList(bytes));
+    }
   }
 
   /// Writes the given string to this file system entity.
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 166a2ef..fc89ebc 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -21,6 +21,8 @@
 const Code<Message Function(String name)> codeAbstractClassInstantiation =
     const Code<Message Function(String name)>(
         "AbstractClassInstantiation", templateAbstractClassInstantiation,
+        analyzerCode: "NEW_WITH_ABSTRACT_CLASS",
+        dart2jsCode: "*fatal*",
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -131,6 +133,46 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        DartType _type,
+        DartType
+            _type2)> templateArgumentTypeNotAssignable = const Template<
+        Message Function(DartType _type,
+            DartType _type2)>(
+    messageTemplate:
+        r"""The argument type '#type' can't be assigned to the parameter type '#type2'.""",
+    tipTemplate:
+        r"""Try changing the type of the parameter, or casting the argument to '#type2'.""",
+    withArguments: _withArgumentsArgumentTypeNotAssignable);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, DartType _type2)>
+    codeArgumentTypeNotAssignable =
+    const Code<Message Function(DartType _type, DartType _type2)>(
+        "ArgumentTypeNotAssignable", templateArgumentTypeNotAssignable,
+        analyzerCode: "ARGUMENT_TYPE_NOT_ASSIGNABLE", dart2jsCode: "*ignored*");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsArgumentTypeNotAssignable(
+    DartType _type, DartType _type2) {
+  NameSystem nameSystem = new NameSystem();
+  StringBuffer buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
+  String type = '$buffer';
+
+  buffer = new StringBuffer();
+  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
+  String type2 = '$buffer';
+
+  return new Message(codeArgumentTypeNotAssignable,
+      message:
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}'.""",
+      tip: """Try changing the type of the parameter, or casting the argument to '${type2}'.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         int
             codePoint)> templateAsciiControlCharacter = const Template<
         Message Function(int codePoint)>(
@@ -1460,6 +1502,30 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateCyclicRedirectingFactoryConstructors =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""Cyclic definition of factory '#name'.""",
+        withArguments: _withArgumentsCyclicRedirectingFactoryConstructors);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeCyclicRedirectingFactoryConstructors =
+    const Code<Message Function(String name)>(
+        "CyclicRedirectingFactoryConstructors",
+        templateCyclicRedirectingFactoryConstructors,
+        analyzerCode: "RECURSIVE_FACTORY_REDIRECT",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCyclicRedirectingFactoryConstructors(String name) {
+  return new Message(codeCyclicRedirectingFactoryConstructors,
+      message: """Cyclic definition of factory '${name}'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateCyclicTypedef =
     const Template<Message Function(String name)>(
         messageTemplate: r"""The typedef '#name' has a reference to itself.""",
@@ -2003,10 +2069,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeEnumConstantSameNameAsEnclosing =
-    const Code<Message Function(String name)>(
-  "EnumConstantSameNameAsEnclosing",
-  templateEnumConstantSameNameAsEnclosing,
-);
+    const Code<Message Function(String name)>("EnumConstantSameNameAsEnclosing",
+        templateEnumConstantSameNameAsEnclosing,
+        analyzerCode: "ENUM_CONSTANT_WITH_ENUM_NAME", dart2jsCode: "*fatal*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsEnumConstantSameNameAsEnclosing(String name) {
@@ -2935,9 +3000,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name)> codeIllegalMixinDueToConstructors =
     const Code<Message Function(String name)>(
-  "IllegalMixinDueToConstructors",
-  templateIllegalMixinDueToConstructors,
-);
+        "IllegalMixinDueToConstructors", templateIllegalMixinDueToConstructors,
+        analyzerCode: "MIXIN_DECLARES_CONSTRUCTOR", dart2jsCode: "*fatal*");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIllegalMixinDueToConstructors(String name) {
@@ -4723,6 +4787,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonInstanceTypeVariableUse = const MessageCode(
     "NonInstanceTypeVariableUse",
+    analyzerCode: "TYPE_PARAMETER_REFERENCED_BY_STATIC",
+    dart2jsCode: "*fatal*",
     severity: Severity.errorLegacyWarning,
     message: r"""Can only use type variables in instance methods.""");
 
@@ -4986,6 +5052,8 @@
     codeOverrideFewerNamedArguments =
     const Code<Message Function(String name, String name2)>(
         "OverrideFewerNamedArguments", templateOverrideFewerNamedArguments,
+        analyzerCode: "INVALID_OVERRIDE_NAMED",
+        dart2jsCode: "*fatal*",
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5044,6 +5112,8 @@
     const Code<Message Function(String name, String name2, String name3)>(
         "OverrideMismatchNamedParameter",
         templateOverrideMismatchNamedParameter,
+        analyzerCode: "INVALID_OVERRIDE_NAMED",
+        dart2jsCode: "*fatal*",
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5498,6 +5568,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePrivateNamedParameter = const MessageCode(
     "PrivateNamedParameter",
+    analyzerCode: "PRIVATE_OPTIONAL_PARAMETER",
     dart2jsCode: "*ignored*",
     message: r"""An optional named parameter can't start with '_'.""");
 
@@ -5941,7 +6012,7 @@
 const Code<Message Function(String name)> codeSuperclassHasNoSetter =
     const Code<Message Function(String name)>(
         "SuperclassHasNoSetter", templateSuperclassHasNoSetter,
-        analyzerCode: "ABSTRACT_SUPER_MEMBER_REFERENCE",
+        analyzerCode: "UNDEFINED_SUPER_SETTER",
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6225,6 +6296,8 @@
 const Code<Message Function(String name)> codeTypeNotFound =
     const Code<Message Function(String name)>(
         "TypeNotFound", templateTypeNotFound,
+        analyzerCode: "UNDEFINED_CLASS",
+        dart2jsCode: "*fatal*",
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6240,6 +6313,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableDuplicatedName = const MessageCode(
     "TypeVariableDuplicatedName",
+    analyzerCode: "DUPLICATE_DEFINITION",
+    dart2jsCode: "*fatal*",
     message: r"""A type variable can't have the same name as another.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6269,6 +6344,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeVariableInStaticContext = const MessageCode(
     "TypeVariableInStaticContext",
+    analyzerCode: "TYPE_PARAMETER_REFERENCED_BY_STATIC",
+    dart2jsCode: "*fatal*",
     severity: Severity.errorLegacyWarning,
     message: r"""Type variables can't be used in static members.""");
 
@@ -6410,6 +6487,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageUnexpectedDollarInString = const MessageCode(
     "UnexpectedDollarInString",
+    analyzerCode: "UNEXPECTED_DOLLAR_IN_STRING",
     dart2jsCode: "MALFORMED_STRING_LITERAL",
     message:
         r"""A '$' has special meaning inside a string, and must be followed by an identifier or an expression in curly braces ({}).""",
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 beaac23..f9430d9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -100,7 +100,8 @@
         RedirectingFactoryBody,
         RedirectionTarget,
         getRedirectingFactoryBody,
-        getRedirectionTarget;
+        getRedirectionTarget,
+        isRedirectingFactory;
 
 import 'kernel_api.dart';
 
@@ -221,6 +222,10 @@
   /// and where that was.
   Map<String, int> initializedFields;
 
+  /// List of built redirecting factory invocations.  The targets of the
+  /// invocations are to be resolved in a separate step.
+  final List<Expression> redirectingFactoryInvocations = <Expression>[];
+
   BodyBuilder(
       this.library,
       this.member,
@@ -539,6 +544,8 @@
         }
       }
     }
+
+    resolveRedirectingFactoryTargets();
   }
 
   @override
@@ -740,12 +747,132 @@
       unhandled("${builder.runtimeType}", "finishFunction", builder.charOffset,
           builder.fileUri);
     }
+
+    resolveRedirectingFactoryTargets();
+  }
+
+  void resolveRedirectingFactoryTargets() {
+    for (StaticInvocation invocation in redirectingFactoryInvocations) {
+      Procedure initialTarget = invocation.target;
+      Expression replacementNode;
+
+      RedirectionTarget redirectionTarget = getRedirectionTarget(initialTarget,
+          strongMode: library.loader.target.strongMode);
+      Member resolvedTarget = redirectionTarget?.target;
+
+      if (resolvedTarget == null) {
+        String name = initialTarget.enclosingClass.name;
+        if (initialTarget.name.name != "") {
+          name += ".${initialTarget.name.name}";
+        }
+        // TODO(dmitryas): Report this error earlier.
+        replacementNode = buildCompileTimeError(
+            fasta.templateCyclicRedirectingFactoryConstructors
+                .withArguments(initialTarget.name.name),
+            initialTarget.fileOffset,
+            name.length);
+      } else if (resolvedTarget is Constructor &&
+          resolvedTarget.enclosingClass.isAbstract) {
+        replacementNode = evaluateArgumentsBefore(
+            forest.arguments(invocation.arguments.positional, null,
+                types: invocation.arguments.types,
+                named: invocation.arguments.named),
+            buildAbstractClassInstantiationError(
+                fasta.templateAbstractRedirectedClassInstantiation
+                    .withArguments(resolvedTarget.enclosingClass.name),
+                resolvedTarget.enclosingClass.name,
+                initialTarget.fileOffset));
+      } else {
+        RedirectingFactoryBody redirectingFactoryBody =
+            getRedirectingFactoryBody(resolvedTarget);
+        if (redirectingFactoryBody != null) {
+          // If the redirection target is itself a redirecting factory, it means
+          // that it is unresolved.
+          assert(redirectingFactoryBody.isUnresolved);
+          String errorName = redirectingFactoryBody.unresolvedName;
+
+          replacementNode = new SyntheticExpressionJudgment(
+              throwNoSuchMethodError(
+                  forest.literalNull(null)..fileOffset = invocation.fileOffset,
+                  errorName,
+                  forest.arguments(invocation.arguments.positional, null,
+                      types: invocation.arguments.types,
+                      named: invocation.arguments.named),
+                  initialTarget.fileOffset));
+        } else {
+          Substitution substitution = Substitution.fromPairs(
+              initialTarget.function.typeParameters,
+              invocation.arguments.types);
+          invocation.arguments.types.clear();
+          invocation.arguments.types.length =
+              redirectionTarget.typeArguments.length;
+          for (int i = 0; i < invocation.arguments.types.length; i++) {
+            invocation.arguments.types[i] =
+                substitution.substituteType(redirectionTarget.typeArguments[i]);
+          }
+
+          replacementNode = buildStaticInvocation(
+              resolvedTarget,
+              forest.arguments(invocation.arguments.positional, null,
+                  types: invocation.arguments.types,
+                  named: invocation.arguments.named),
+              constness: invocation.isConst
+                  ? Constness.explicitConst
+                  : Constness.explicitNew,
+              charOffset: invocation.fileOffset);
+          // TODO(dmitryas): Find a better way to unwrap
+          // [SyntheticExpressionJudgment] or not to build it in the first place
+          // when it's not needed.
+          if (replacementNode is SyntheticExpressionJudgment) {
+            replacementNode =
+                (replacementNode as SyntheticExpressionJudgment).desugared;
+          }
+        }
+      }
+
+      invocation.replaceWith(replacementNode);
+    }
+    redirectingFactoryInvocations.clear();
   }
 
   @override
-  List<Expression> finishMetadata() {
+  List<Expression> finishMetadata(TreeNode parent) {
     List<Expression> expressions = pop();
     _typeInferrer.inferMetadata(this, factory, expressions);
+    if (parent is Class) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is Library) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is LibraryDependency) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is LibraryPart) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is Member) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is Typedef) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is TypeParameter) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    } else if (parent is VariableDeclaration) {
+      for (Expression expression in expressions) {
+        parent.addAnnotation(expression);
+      }
+    }
+    resolveRedirectingFactoryTargets();
     return expressions;
   }
 
@@ -2598,28 +2725,29 @@
 
   @override
   Expression buildStaticInvocation(Member target, Arguments arguments,
-      {Constness constness: Constness.implicit,
-      int charOffset: -1,
-      Member initialTarget,
-      List<DartType> targetTypeArguments}) {
+      {Constness constness: Constness.implicit, int charOffset: -1}) {
+    // The argument checks for the initial target of redirecting factories
+    // invocations are skipped in Dart 1.
+    if (library.loader.target.strongMode || !isRedirectingFactory(target)) {
+      List<TypeParameter> typeParameters = target.function.typeParameters;
+      if (target is Constructor) {
+        assert(!target.enclosingClass.isAbstract);
+        typeParameters = target.enclosingClass.typeParameters;
+      }
+      LocatedMessage argMessage = checkArgumentsForFunction(
+          target.function, arguments, charOffset, typeParameters);
+      if (argMessage != null) {
+        return new SyntheticExpressionJudgment(throwNoSuchMethodError(
+            forest.literalNull(null)..fileOffset = charOffset,
+            target.name.name,
+            arguments,
+            charOffset,
+            candidate: target,
+            argMessage: argMessage));
+      }
+    }
+
     bool isConst = constness == Constness.explicitConst;
-    initialTarget ??= target;
-    List<TypeParameter> typeParameters = target.function.typeParameters;
-    if (target is Constructor) {
-      assert(!target.enclosingClass.isAbstract);
-      typeParameters = target.enclosingClass.typeParameters;
-    }
-    LocatedMessage argMessage = checkArgumentsForFunction(
-        target.function, arguments, charOffset, typeParameters);
-    if (argMessage != null) {
-      return new SyntheticExpressionJudgment(throwNoSuchMethodError(
-          forest.literalNull(null)..fileOffset = charOffset,
-          target.name.name,
-          arguments,
-          charOffset,
-          candidate: target,
-          argMessage: argMessage));
-    }
     if (target is Constructor) {
       isConst =
           isConst || constantContext != ConstantContext.none && target.isConst;
@@ -2628,8 +2756,8 @@
         return deprecated_buildCompileTimeError(
             "Not a const constructor.", charOffset);
       }
-      return new ConstructorInvocationJudgment(target, targetTypeArguments,
-          initialTarget, forest.castArguments(arguments),
+      return new ConstructorInvocationJudgment(
+          target, forest.castArguments(arguments),
           isConst: isConst)
         ..fileOffset = charOffset;
     } else {
@@ -2642,8 +2770,8 @@
           return deprecated_buildCompileTimeError(
               "Not a const factory.", charOffset);
         }
-        return new FactoryConstructorInvocationJudgment(target,
-            targetTypeArguments, initialTarget, forest.castArguments(arguments),
+        return new FactoryConstructorInvocationJudgment(
+            target, forest.castArguments(arguments),
             isConst: isConst)
           ..fileOffset = charOffset;
       } else {
@@ -2833,61 +2961,57 @@
       }
       Declaration b =
           type.findConstructorOrFactory(name, charOffset, uri, library);
-      Member target;
-      Member initialTarget;
-      List<DartType> targetTypeArguments;
+      Member target = b?.target;
       if (b == null) {
         // Not found. Reported below.
       } else if (b.isConstructor) {
-        initialTarget = b.target;
         if (type.isAbstract) {
-          return new SyntheticExpressionJudgment(evaluateArgumentsBefore(
-              arguments,
-              buildAbstractClassInstantiationError(
-                  fasta.templateAbstractClassInstantiation
-                      .withArguments(type.name),
-                  type.name,
-                  nameToken.charOffset)));
-        } else {
-          target = initialTarget;
-        }
-      } else if (b.isFactory) {
-        initialTarget = b.target;
-        RedirectionTarget redirectionTarget = getRedirectionTarget(
-            initialTarget,
-            strongMode: library.loader.target.strongMode);
-        target = redirectionTarget?.target;
-        targetTypeArguments = redirectionTarget?.typeArguments;
-        if (target == null) {
-          return deprecated_buildCompileTimeError(
-              "Cyclic definition of factory '${name}'.", nameToken.charOffset);
-        }
-        if (target is Constructor && target.enclosingClass.isAbstract) {
-          return new SyntheticExpressionJudgment(evaluateArgumentsBefore(
-              arguments,
-              buildAbstractClassInstantiationError(
-                  fasta.templateAbstractRedirectedClassInstantiation
-                      .withArguments(target.enclosingClass.name),
-                  target.enclosingClass.name,
-                  nameToken.charOffset)));
-        }
-        RedirectingFactoryBody body = getRedirectingFactoryBody(target);
-        if (body != null) {
-          // If the redirection target is itself a redirecting factory, it
-          // means that it is unresolved. So we set target to null so we
-          // can generate a no-such-method error below.
-          assert(body.isUnresolved);
-          target = null;
-          errorName = body.unresolvedName;
+          return new InvalidConstructorInvocationJudgment(
+              evaluateArgumentsBefore(
+                  arguments,
+                  buildAbstractClassInstantiationError(
+                      fasta.templateAbstractClassInstantiation
+                          .withArguments(type.name),
+                      type.name,
+                      nameToken.charOffset)),
+              target,
+              arguments)
+            ..fileOffset = charOffset;
         }
       }
       if (target is Constructor ||
           (target is Procedure && target.kind == ProcedureKind.Factory)) {
-        return buildStaticInvocation(target, arguments,
-            constness: constness,
-            charOffset: nameToken.charOffset,
-            initialTarget: initialTarget,
-            targetTypeArguments: targetTypeArguments);
+        Expression invocation;
+
+        if (!library.loader.target.strongMode && isRedirectingFactory(target)) {
+          // In non-strong mode the checks that are done in
+          // [buildStaticInvocation] on the initial target of a redirecting
+          // factory invocation should be skipped.  So, we build the invocation
+          // nodes directly here without doing any checks.
+          if (target.function.typeParameters != null &&
+              target.function.typeParameters.length !=
+                  forest.argumentsTypeArguments(arguments).length) {
+            arguments = forest.arguments(
+                forest.argumentsPositional(arguments), null,
+                named: forest.argumentsNamed(arguments),
+                types: new List<DartType>.filled(
+                    target.function.typeParameters.length, const DynamicType(),
+                    growable: true));
+          }
+          invocation = new FactoryConstructorInvocationJudgment(
+              target, forest.castArguments(arguments),
+              isConst: constness == Constness.explicitConst)
+            ..fileOffset = nameToken.charOffset;
+        } else {
+          invocation = buildStaticInvocation(target, arguments,
+              constness: constness, charOffset: nameToken.charOffset);
+        }
+
+        if (invocation is StaticInvocation && isRedirectingFactory(target)) {
+          redirectingFactoryInvocations.add(invocation);
+        }
+
+        return invocation;
       } else {
         errorName ??= debugName(type.name, name);
       }
@@ -2899,11 +3023,13 @@
       nameToken = nameToken.next.next;
     }
 
-    return new UnresolvedTargetInvocationJudgment(throwNoSuchMethodError(
-        forest.literalNull(null)..fileOffset = charOffset,
-        errorName,
-        arguments,
-        nameToken.charOffset))
+    return new UnresolvedTargetInvocationJudgment(
+        throwNoSuchMethodError(
+            forest.literalNull(null)..fileOffset = charOffset,
+            errorName,
+            arguments,
+            nameToken.charOffset),
+        arguments)
       ..fileOffset = arguments.fileOffset;
   }
 
@@ -3738,19 +3864,6 @@
   }
 
   @override
-  Token handleUnrecoverableError(Token token, Message message) {
-    if (message.code == fasta.codeExpectedButGot) {
-      String expected = message.arguments["string"];
-      const List<String> trailing = const <String>[")", "}", ";", ","];
-      if (trailing.contains(token.stringValue) && trailing.contains(expected)) {
-        handleRecoverableError(message, token, token);
-        return newSyntheticToken(token);
-      }
-    }
-    return super.handleUnrecoverableError(token, message);
-  }
-
-  @override
   void handleInvalidStatement(Token token, Message message) {
     Statement statement = pop();
     push(wrapInCompileTimeErrorStatement(statement, message));
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 0e246b4..2a554c6 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 @@
       [int charOffset = -1]);
 
   Expression buildStaticInvocation(Procedure target, Arguments arguments,
-      {Constness constness, int charOffset, Member initialTarget});
+      {Constness constness, int charOffset});
 
   Expression buildProblemExpression(
       ProblemBuilder builder, int offset, int length);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
index e48156c..0152695 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
@@ -5,7 +5,8 @@
 /// This library exports all API from Kernel that can be used throughout fasta.
 library fasta.kernel_api;
 
-export 'package:kernel/type_algebra.dart' show instantiateToBounds;
+export 'package:kernel/type_algebra.dart'
+    show instantiateToBounds, Substitution;
 
 export 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
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 48ec723..dd37979 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
@@ -33,6 +33,9 @@
         LabeledStatement,
         Let,
         Library,
+        LibraryDependency,
+        LibraryPart,
+        ListLiteral,
         Location,
         Member,
         MethodInvocation,
@@ -47,6 +50,7 @@
         ReturnStatement,
         Statement,
         StaticGet,
+        StaticInvocation,
         StaticSet,
         StringConcatenation,
         SuperInitializer,
@@ -55,6 +59,7 @@
         SwitchCase,
         Throw,
         TreeNode,
+        Typedef,
         TypeParameter,
         TypeParameterType,
         VariableDeclaration,
@@ -86,6 +91,7 @@
         IfJudgment,
         IllegalAssignmentJudgment,
         IndexAssignmentJudgment,
+        InvalidConstructorInvocationJudgment,
         InvalidVariableWriteJudgment,
         ShadowInvalidInitializer,
         LabeledStatementJudgment,
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 bdbcd09..b3c17bb 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
@@ -751,26 +751,7 @@
     implements ExpressionJudgment {
   DartType inferredType;
 
-  final Member _initialTarget;
-
-  /// If the constructor invocation points to a redirected constructor, the type
-  /// arguments to be supplied to redirected constructor, in terms of those
-  /// supplied to the original constructor.
-  ///
-  /// For example, in the code below:
-  ///
-  ///     class C<T> {
-  ///       C() = D<List<T>>;
-  ///     }
-  ///     main() {
-  ///       new C<int>();
-  ///     }
-  ///
-  /// [targetTypeArguments] is a list containing the type `List<T>`.
-  final List<DartType> targetTypeArguments;
-
-  ConstructorInvocationJudgment(Constructor target, this.targetTypeArguments,
-      this._initialTarget, ArgumentsJudgment arguments,
+  ConstructorInvocationJudgment(Constructor target, ArgumentsJudgment arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
@@ -815,8 +796,8 @@
         factory,
         typeContext,
         fileOffset,
-        _initialTarget.function.functionType,
-        computeConstructorReturnType(_initialTarget),
+        target.function.functionType,
+        computeConstructorReturnType(target),
         argumentJudgments,
         isConst: isConst);
     var inferredType = inferenceResult.type;
@@ -833,41 +814,8 @@
     inferrer.listener.constructorInvocation(
         this, argumentJudgments.fileOffset, target, inferredType);
 
-    if (isRedirected(this)) {
-      InterfaceType returnType = inferredType;
-      List<DartType> initialTypeArguments;
-      if (inferrer.strongMode) {
-        initialTypeArguments = returnType.typeArguments;
-      } else {
-        int requiredTypeArgumentsCount = returnType.typeArguments.length;
-        int suppliedTypeArgumentsCount = arguments.types.length;
-        initialTypeArguments = arguments.types.toList(growable: true)
-          ..length = requiredTypeArgumentsCount;
-        for (int i = suppliedTypeArgumentsCount;
-            i < requiredTypeArgumentsCount;
-            i++) {
-          initialTypeArguments[i] = const DynamicType();
-        }
-      }
-      Substitution substitution = Substitution.fromPairs(
-          _initialTarget.function.typeParameters, initialTypeArguments);
-      arguments.types.clear();
-      for (DartType argument in targetTypeArguments) {
-        arguments.types.add(substitution.substituteType(argument));
-      }
-    }
-
     return null;
   }
-
-  /// Determines whether the given [ConstructorInvocationJudgment] represents an
-  /// invocation of a redirected factory constructor.
-  ///
-  /// This is static to avoid introducing a method that would be visible to the
-  /// kernel.
-  static bool isRedirected(ConstructorInvocationJudgment expression) {
-    return !identical(expression._initialTarget, expression.target);
-  }
 }
 
 /// Concrete shadow object representing a continue statement from a switch
@@ -1029,29 +977,8 @@
     implements ExpressionJudgment {
   DartType inferredType;
 
-  final Member _initialTarget;
-
-  /// If the factory invocation points to a redirected factory, the type
-  /// arguments to be supplied to redirected constructor, in terms of those
-  /// supplied to the original constructor.
-  ///
-  /// For example, in the code below:
-  ///
-  ///     class C<T> {
-  ///       C() = D<List<T>>;
-  ///     }
-  ///     main() {
-  ///       new C<int>();
-  ///     }
-  ///
-  /// [targetTypeArguments] is a list containing the type `List<T>`.
-  final List<DartType> targetTypeArguments;
-
   FactoryConstructorInvocationJudgment(
-      Procedure target,
-      this.targetTypeArguments,
-      this._initialTarget,
-      ArgumentsJudgment arguments,
+      Procedure target, ArgumentsJudgment arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
@@ -1066,49 +993,16 @@
         factory,
         typeContext,
         fileOffset,
-        _initialTarget.function.functionType,
-        computeConstructorReturnType(_initialTarget),
+        target.function.functionType,
+        computeConstructorReturnType(target),
         argumentJudgments);
     var inferredType = inferenceResult.type;
     this.inferredType = inferredType;
     inferrer.listener.constructorInvocation(
         this, argumentJudgments.fileOffset, target, inferredType);
 
-    if (isRedirected(this)) {
-      InterfaceType returnType = inferredType;
-      List<DartType> initialTypeArguments;
-      if (inferrer.strongMode) {
-        initialTypeArguments = returnType.typeArguments;
-      } else {
-        int requiredTypeArgumentsCount = returnType.typeArguments.length;
-        int suppliedTypeArgumentsCount = arguments.types.length;
-        initialTypeArguments = arguments.types.toList(growable: true)
-          ..length = requiredTypeArgumentsCount;
-        for (int i = suppliedTypeArgumentsCount;
-            i < requiredTypeArgumentsCount;
-            i++) {
-          initialTypeArguments[i] = const DynamicType();
-        }
-      }
-      Substitution substitution = Substitution.fromPairs(
-          _initialTarget.function.typeParameters, initialTypeArguments);
-      arguments.types.clear();
-      for (DartType argument in targetTypeArguments) {
-        arguments.types.add(substitution.substituteType(argument));
-      }
-    }
-
     return null;
   }
-
-  /// Determines whether the given [ConstructorInvocationJudgment] represents an
-  /// invocation of a redirected factory constructor.
-  ///
-  /// This is static to avoid introducing a method that would be visible to the
-  /// kernel.
-  static bool isRedirected(FactoryConstructorInvocationJudgment expression) {
-    return !identical(expression._initialTarget, expression.target);
-  }
 }
 
 /// Concrete shadow object representing a field in kernel form.
@@ -2915,6 +2809,38 @@
   }
 }
 
+/// Synthetic judgment class representing an attempt to invoke a constructor
+/// that cannot be invoked.
+class InvalidConstructorInvocationJudgment extends SyntheticExpressionJudgment {
+  final Constructor constructor;
+  final Arguments arguments;
+
+  InvalidConstructorInvocationJudgment(
+      kernel.Expression desugared, this.constructor, this.arguments)
+      : super(desugared);
+
+  ArgumentsJudgment get argumentJudgments => arguments;
+
+  @override
+  Expression infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext) {
+    var calleeType = constructor.function.functionType;
+    var inferenceResult = inferrer.inferInvocation(
+        factory,
+        typeContext,
+        fileOffset,
+        calleeType,
+        computeConstructorReturnType(constructor),
+        argumentJudgments);
+    this.inferredType = inferenceResult.type;
+    inferrer.listener.constructorInvocation(
+        this, arguments.fileOffset, constructor, inferredType);
+    return super.infer(inferrer, factory, typeContext);
+  }
+}
+
 /// Synthetic judgment class representing an attempt to write to a read-only
 /// local variable.
 class InvalidVariableWriteJudgment extends SyntheticExpressionJudgment {
@@ -3552,7 +3478,10 @@
 /// Synthetic judgment class representing an attempt to invoke an unresolved
 /// target.
 class UnresolvedTargetInvocationJudgment extends SyntheticExpressionJudgment {
-  UnresolvedTargetInvocationJudgment(kernel.Expression desugared)
+  final ArgumentsJudgment argumentsJudgment;
+
+  UnresolvedTargetInvocationJudgment(
+      kernel.Expression desugared, this.argumentsJudgment)
       : super(desugared);
 
   @override
@@ -3561,8 +3490,15 @@
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     var result = super.infer(inferrer, factory, typeContext);
-    inferrer.listener.staticInvocation(
-        this, fileOffset, null, null, null, null, inferredType);
+    inferrer.inferInvocation(
+        factory,
+        typeContext,
+        fileOffset,
+        TypeInferrerImpl.unknownFunction,
+        const DynamicType(),
+        argumentsJudgment);
+    inferrer.listener.staticInvocation(this, fileOffset, null,
+        argumentsJudgment.types, null, null, inferredType);
     return result;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 6b31ff1..62248a4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -114,10 +114,12 @@
   }
 }
 
+bool isRedirectingFactory(Member member) {
+  return member is Procedure && member.function.body is RedirectingFactoryBody;
+}
+
 RedirectingFactoryBody getRedirectingFactoryBody(Member member) {
-  return member is Procedure && member.function.body is RedirectingFactoryBody
-      ? member.function.body
-      : null;
+  return isRedirectingFactory(member) ? member.function.body : null;
 }
 
 class RedirectionTarget {
diff --git a/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
index 99a7671..3d20dfa 100644
--- a/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
@@ -15,10 +15,6 @@
 
   ErrorDelegationListener(this.delegate);
 
-  Token handleUnrecoverableError(Token token, Message message) {
-    return delegate.handleUnrecoverableError(token, message);
-  }
-
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
     return delegate.handleRecoverableError(message, startToken, endToken);
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index f289459..3af09ee 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -1305,11 +1305,6 @@
   }
 
   @override
-  Token handleUnrecoverableError(Token token, Message message) {
-    return listener?.handleUnrecoverableError(token, message);
-  }
-
-  @override
   void beginFormalParameterDefaultValueExpression() {
     listener?.beginFormalParameterDefaultValueExpression();
   }
@@ -1335,11 +1330,6 @@
   }
 
   @override
-  Token newSyntheticToken(Token next) {
-    return listener?.newSyntheticToken(next);
-  }
-
-  @override
   set suppressParseErrors(bool value) {
     listener?.suppressParseErrors = value;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 3fb1f3d..c69cf17 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -4,7 +4,7 @@
 
 library fasta.parser.listener;
 
-import '../../scanner/token.dart' show Token, TokenType;
+import '../../scanner/token.dart' show Token;
 
 import '../fasta_codes.dart' show Message;
 
@@ -18,8 +18,6 @@
 
 import 'member_kind.dart' show MemberKind;
 
-import 'parser_error.dart' show ParserError;
-
 /// A parser event listener that does nothing except throw exceptions
 /// on parser errors.
 ///
@@ -1210,22 +1208,6 @@
     logEvent("YieldStatement");
   }
 
-  /// An unrecoverable error is an error that the parser can't recover from
-  /// itself, and recovery is left to the listener. If the listener can
-  /// recover, it should return a non-null continuation token whose `next`
-  /// pointer is the token the parser should continue from. Error recovery
-  /// is tightly coupled to the parser implementation, so to recover from an
-  /// error, one must carefully examine the code in the parser that generates
-  /// the error.
-  ///
-  /// If the listener can't recover, it can throw an exception or return
-  /// `null`. In the latter case, the parser simply skips to EOF which will
-  /// often result in additional parser errors as the parser returns from its
-  /// recursive state.
-  Token handleUnrecoverableError(Token token, Message message) {
-    throw new ParserError.fromTokens(token, token, message);
-  }
-
   /// The parser noticed a syntax error, but was able to recover from it. The
   /// error should be reported using the [message], and the code between the
   /// beginning of the [startToken] and the end of the [endToken] should be
@@ -1255,12 +1237,4 @@
   /// has a type substitution comment /*=T*. So, the type that has been just
   /// parsed should be discarded, and a new type should be parsed instead.
   void discardTypeReplacedWithCommentTypeAssign() {}
-
-  /// Creates a new synthetic token whose `next` pointer points to [next].
-  ///
-  /// If [next] is `null`, `null` is returned.
-  Token newSyntheticToken(Token next) {
-    if (next == null) return null;
-    return new Token(TokenType.RECOVERY, next.charOffset)..next = next;
-  }
 }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 73e2ff4..8aa932d 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -646,7 +646,7 @@
   /// the import keyword.
   Token parseImportRecovery(Token token) {
     final primaryListener = listener;
-    final recoveryListener = new ImportRecoveryListener(primaryListener);
+    final recoveryListener = new ImportRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener
@@ -1705,7 +1705,7 @@
   /// Recover given out-of-order clauses in a class header.
   Token parseClassHeaderRecovery(Token token, Token begin, Token classKeyword) {
     final primaryListener = listener;
-    final recoveryListener = new ClassHeaderRecoveryListener(primaryListener);
+    final recoveryListener = new ClassHeaderRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener.
diff --git a/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart b/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
index 6166889..05159cd 100644
--- a/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
+++ b/pkg/front_end/lib/src/fasta/parser/recovery_listeners.dart
@@ -4,44 +4,13 @@
 
 import '../../scanner/token.dart' show Token;
 
-import '../messages.dart' show Message;
-
 import 'forwarding_listener.dart' show ForwardingListener;
 
-import 'listener.dart' show Listener;
-
-/// The abstract superclass of recovery listeners.
-///
-/// During the first phase of recovery, some portion of the code is reparsed
-/// to record information (e.g. tokens) that were not recorded during
-/// the primary parse phase. During this phase, the [listener] is null
-/// so that reparsing will not effect the primary listener state,
-/// but the [_primaryListener] is non-null for those few events
-/// where the parser requires the listener to interpret the token stream.
-class RecoveryListener extends ForwardingListener {
-  // TODO(danrubel): remove the need for this field and this class
-  // by removing listener events that interpret the token stream for the parser.
-  final Listener _primaryListener;
-
-  RecoveryListener(this._primaryListener);
-
-  @override
-  Token handleUnrecoverableError(Token token, Message message) =>
-      _primaryListener.handleUnrecoverableError(token, message);
-
-  @override
-  Token newSyntheticToken(Token next) =>
-      _primaryListener.newSyntheticToken(next);
-}
-
-class ClassHeaderRecoveryListener extends RecoveryListener {
+class ClassHeaderRecoveryListener extends ForwardingListener {
   Token extendsKeyword;
   Token implementsKeyword;
   Token withKeyword;
 
-  ClassHeaderRecoveryListener(Listener primaryListener)
-      : super(primaryListener);
-
   void clear() {
     extendsKeyword = null;
     implementsKeyword = null;
@@ -67,14 +36,12 @@
   }
 }
 
-class ImportRecoveryListener extends RecoveryListener {
+class ImportRecoveryListener extends ForwardingListener {
   Token asKeyword;
   Token deferredKeyword;
   Token ifKeyword;
   bool hasCombinator = false;
 
-  ImportRecoveryListener(Listener primaryListener) : super(primaryListener);
-
   void clear() {
     asKeyword = null;
     deferredKeyword = null;
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 a180656..71365fd 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -7,15 +7,13 @@
 import 'package:kernel/ast.dart'
     show
         AsyncMarker,
-        Class,
         Expression,
-        Field,
         InterfaceType,
         Library,
         LibraryDependency,
         LibraryPart,
         Node,
-        Typedef;
+        TreeNode;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -218,13 +216,7 @@
     Token metadata = pop();
 
     Declaration typedefBuilder = lookupBuilder(typedefKeyword, null, name);
-    Typedef target = typedefBuilder.target;
-    var metadataConstants = parseMetadata(typedefBuilder, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        target.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(typedefBuilder, metadata, typedefBuilder.target);
 
     checkEmpty(typedefKeyword.charOffset);
   }
@@ -293,13 +285,7 @@
     pop(); // name
 
     Token metadata = pop();
-    Library target = library.target;
-    var metadataConstants = parseMetadata(library, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        target.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(library, metadata, library.target);
   }
 
   @override
@@ -404,12 +390,7 @@
     Library libraryNode = library.target;
     LibraryDependency dependency =
         libraryNode.dependencies[importExportDirectiveIndex++];
-    var metadataConstants = parseMetadata(library, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        dependency.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(library, metadata, dependency);
   }
 
   @override
@@ -425,12 +406,7 @@
     Library libraryNode = library.target;
     LibraryDependency dependency =
         libraryNode.dependencies[importExportDirectiveIndex++];
-    var metadataConstants = parseMetadata(library, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        dependency.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(library, metadata, dependency);
   }
 
   @override
@@ -440,12 +416,7 @@
     Token metadata = pop();
     Library libraryNode = library.target;
     LibraryPart part = libraryNode.parts[partDirectiveIndex++];
-    var metadataConstants = parseMetadata(library, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        part.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(library, metadata, part);
   }
 
   @override
@@ -508,7 +479,8 @@
   void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
     debugEvent("NativeFunctionBodySkipped");
     if (!enableNative) {
-      super.handleUnrecoverableError(nativeToken, messageExpectedBlockToSkip);
+      super.handleRecoverableError(
+          messageExpectedBlockToSkip, nativeToken, nativeToken);
     }
   }
 
@@ -623,13 +595,7 @@
     assert(memberScope == library.scope);
 
     Declaration classBuilder = lookupBuilder(token, null, name);
-    Class target = classBuilder.target;
-    var metadataConstants = parseMetadata(classBuilder, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        target.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(classBuilder, metadata, classBuilder.target);
 
     currentClass = classBuilder;
     memberScope = currentClass.scope;
@@ -659,22 +625,13 @@
     Token metadata = pop();
 
     ClassBuilder enumBuilder = lookupBuilder(enumKeyword, null, name);
-    Class target = enumBuilder.target;
-    var metadataConstants = parseMetadata(enumBuilder, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        target.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(enumBuilder, metadata, enumBuilder.target);
     for (int i = 0; i < metadataAndValues.length; i += 2) {
       Token metadata = metadataAndValues[i];
       String valueName = metadataAndValues[i + 1];
       Declaration declaration = enumBuilder.scope.local[valueName];
       if (metadata != null) {
-        Field field = declaration.target;
-        for (var annotation in parseMetadata(declaration, metadata)) {
-          field.addAnnotation(annotation);
-        }
+        parseMetadata(declaration, metadata, declaration.target);
       }
     }
 
@@ -690,13 +647,7 @@
     Token metadata = pop();
 
     Declaration classBuilder = lookupBuilder(classKeyword, null, name);
-    Class target = classBuilder.target;
-    var metadataConstants = parseMetadata(classBuilder, metadata);
-    if (metadataConstants != null) {
-      for (var metadataConstant in metadataConstants) {
-        target.addAnnotation(metadataConstant);
-      }
-    }
+    parseMetadata(classBuilder, metadata, classBuilder.target);
 
     checkEmpty(beginToken.charOffset);
   }
@@ -844,12 +795,13 @@
 
   /// If the [metadata] is not `null`, return the parsed metadata [Expression]s.
   /// Otherwise, return `null`.
-  List<Expression> parseMetadata(ModifierBuilder builder, Token metadata) {
+  List<Expression> parseMetadata(
+      ModifierBuilder builder, Token metadata, TreeNode parent) {
     if (metadata != null) {
       var listener = createListener(builder, memberScope, false);
       var parser = new Parser(listener);
       parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
-      return listener.finishMetadata();
+      return listener.finishMetadata(parent);
     }
     return null;
   }
diff --git a/pkg/front_end/lib/src/fasta/source/directive_listener.dart b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
index dca1e4b..13600f6 100644
--- a/pkg/front_end/lib/src/fasta/source/directive_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
@@ -111,7 +111,8 @@
   /// By default, native clauses are not handled and an error is thrown.
   @override
   void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
-    super.handleUnrecoverableError(nativeToken, messageExpectedBlockToSkip);
+    super.handleRecoverableError(
+        messageExpectedBlockToSkip, nativeToken, nativeToken);
   }
 }
 
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 5fe18f8..8f8c5c1 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -562,7 +562,8 @@
   @override
   void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
     if (!enableNative) {
-      super.handleUnrecoverableError(nativeToken, messageExpectedBlockToSkip);
+      super.handleRecoverableError(
+          messageExpectedBlockToSkip, nativeToken, nativeToken);
     }
     push(MethodBody.Regular);
   }
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index 22658b6..df55a69 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -4,9 +4,8 @@
 
 library fasta.stack_listener;
 
-import 'package:kernel/ast.dart' show AsyncMarker, Expression, FunctionNode;
-
-import '../deprecated_problems.dart' show deprecated_inputErrorFromMessage;
+import 'package:kernel/ast.dart'
+    show AsyncMarker, Expression, FunctionNode, TreeNode;
 
 import '../fasta_codes.dart'
     show
@@ -15,13 +14,7 @@
         templateInternalProblemStackNotEmpty;
 
 import '../parser.dart'
-    show
-        Listener,
-        MemberKind,
-        Parser,
-        lengthForToken,
-        lengthOfSpan,
-        offsetForToken;
+    show Listener, MemberKind, Parser, lengthOfSpan, offsetForToken;
 
 import '../parser/identifier_context.dart' show IdentifierContext;
 
@@ -95,7 +88,7 @@
 
   // TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
   // and ast_builder.dart.
-  List<Expression> finishMetadata() {
+  List<Expression> finishMetadata(TreeNode parent) {
     return unsupported("finishMetadata", -1, uri);
   }
 
@@ -354,12 +347,6 @@
   }
 
   @override
-  Token handleUnrecoverableError(Token token, Message message) {
-    return deprecated_inputErrorFromMessage(message.withLocation(
-        uri, offsetForToken(token), lengthForToken(token)));
-  }
-
-  @override
   void handleUnescapeError(
       Message message, Token token, int stringOffset, int length) {
     addCompileTimeError(message, token.charOffset + stringOffset, length);
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
index 20febc0..acc8a76 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -13,7 +13,8 @@
 
 import 'dart:typed_data' show Uint8List;
 
-import 'package:kernel/ast.dart' show Library, Component;
+import 'package:kernel/ast.dart'
+    show Component, Field, Library, ListLiteral, StringLiteral;
 
 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
 
@@ -129,7 +130,19 @@
     Uri base = uri.resolve(".");
     Uri dartBase = Uri.base;
     StringBuffer buffer = new StringBuffer();
-    new Printer(buffer).writeLibraryFile(library);
+    for (Field field in library.fields) {
+      if (field.name.name != "#errors") continue;
+      ListLiteral list = field.initializer;
+      buffer.write("// Errors:");
+      for (StringLiteral string in list.expressions) {
+        buffer.write("\n//");
+        for (String line in string.value.split("\n")) {
+          buffer.write("\n// $line");
+        }
+      }
+      buffer.write("\n\n");
+    }
+    new ErrorPrinter(buffer).writeLibraryFile(library);
     String actual = "$buffer".replaceAll("$base", "org-dartlang-testcase:///");
     actual = actual.replaceAll("$dartBase", "org-dartlang-testcase-sdk:///");
     actual = actual.replaceAll("\\n", "\n");
@@ -298,3 +311,30 @@
   }
   print("Wrote $uri");
 }
+
+class ErrorPrinter extends Printer {
+  ErrorPrinter(StringSink sink, {Object importTable, Object metadata})
+      : super(sink, importTable: importTable, metadata: metadata);
+
+  ErrorPrinter._inner(ErrorPrinter parent, Object importTable, Object metadata)
+      : super(parent.sink,
+            importTable: importTable,
+            metadata: metadata,
+            syntheticNames: parent.syntheticNames,
+            annotator: parent.annotator,
+            showExternal: parent.showExternal,
+            showOffsets: parent.showOffsets,
+            showMetadata: parent.showMetadata);
+
+  @override
+  ErrorPrinter createInner(importTable, metadata) {
+    return new ErrorPrinter._inner(this, importTable, metadata);
+  }
+
+  @override
+  visitField(Field node) {
+    if (node.name.name != "#errors") {
+      super.visitField(node);
+    }
+  }
+}
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 58b47b5..016092a 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
@@ -76,7 +76,6 @@
 import '../kernel/kernel_shadow_ast.dart'
     show
         ArgumentsJudgment,
-        ConstructorInvocationJudgment,
         ExpressionJudgment,
         NullJudgment,
         ShadowClass,
@@ -517,7 +516,8 @@
   /// [expectedType], and inserts an implicit downcast if appropriate.
   Expression ensureAssignable(DartType expectedType, DartType actualType,
       Expression expression, int fileOffset,
-      {bool isReturnFromAsync = false}) {
+      {bool isReturnFromAsync = false,
+      Template<Message Function(DartType, DartType)> template}) {
     assert(expectedType != null);
     expectedType = greatestClosure(coreTypes, expectedType);
 
@@ -580,8 +580,10 @@
     if (!typeSchemaEnvironment.isSubtypeOf(expectedType, actualType)) {
       // Error: not assignable.  Perform error recovery.
       var parent = expression.parent;
-      var errorNode = helper.wrapInCompileTimeError(expression,
-          templateInvalidAssignment.withArguments(actualType, expectedType));
+      var errorNode = helper.wrapInCompileTimeError(
+          expression,
+          (template ?? templateInvalidAssignment)
+              .withArguments(actualType, expectedType));
       parent?.replaceChild(expression, errorNode);
       return errorNode;
     } else {
@@ -1204,7 +1206,8 @@
               ? arguments.positional[i]
               : arguments.named[i - numPositionalArgs].value;
           ensureAssignable(
-              expectedType, actualType, expression, expression.fileOffset);
+              expectedType, actualType, expression, expression.fileOffset,
+              template: templateArgumentTypeNotAssignable);
         }
       }
     }
@@ -1782,11 +1785,7 @@
       return templateInvalidCastFunctionExpr;
     }
     if (expression is ConstructorInvocation) {
-      if (ConstructorInvocationJudgment.isRedirected(expression)) {
-        return null;
-      } else {
-        return templateInvalidCastNewExpr;
-      }
+      return templateInvalidCastNewExpr;
     }
     if (expression is StaticGet) {
       var target = expression.target;
diff --git a/pkg/front_end/lib/src/scanner/errors.dart b/pkg/front_end/lib/src/scanner/errors.dart
index 6d3fb51..a9f1837 100644
--- a/pkg/front_end/lib/src/scanner/errors.dart
+++ b/pkg/front_end/lib/src/scanner/errors.dart
@@ -45,6 +45,13 @@
   static const ScannerErrorCode UNABLE_GET_CONTENT = const ScannerErrorCode(
       'UNABLE_GET_CONTENT', "Unable to get content of '{0}'.");
 
+  static const ScannerErrorCode UNEXPECTED_DOLLAR_IN_STRING =
+      const ScannerErrorCode(
+          'UNEXPECTED_DOLLAR_IN_STRING',
+          "A '\$' has special meaning inside a string, and must be followed by "
+          "an identifier or an expression in curly braces ({}).",
+          correction: "Try adding a backslash (\\) to escape the '\$'.");
+
   static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT =
       const ScannerErrorCode(
           'UNTERMINATED_MULTI_LINE_COMMENT', "Unterminated multi-line comment.",
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index fca60694..f458984 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -2,7 +2,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE.md file.
 
-AbstractClassInstantiation/analyzerCode: Fail
 AbstractClassInstantiation/example: Fail
 AbstractClassMember/script5: Fail
 AbstractClassMember/script6: Fail
@@ -14,6 +13,7 @@
 AmbiguousSupertypes/analyzerCode: Fail
 AmbiguousSupertypes/example: Fail
 AnnotationOnEnumConstant/example: Fail
+ArgumentTypeNotAssignable/example: Fail
 AssertAsExpression/analyzerCode: Fail
 AssertAsExpression/example: Fail
 AssertExtraneousArgument/analyzerCode: Fail
@@ -117,7 +117,6 @@
 DuplicatedName/example: Fail
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
-EnumConstantSameNameAsEnclosing/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
 EqualityCannotBeEqualityOperand/script1: Fail
 EqualityCannotBeEqualityOperand/script2: Fail
@@ -191,7 +190,6 @@
 IllegalAssignmentToNonAssignable/script1: Fail
 IllegalMixin/analyzerCode: Fail
 IllegalMixin/example: Fail
-IllegalMixinDueToConstructors/analyzerCode: Fail
 IllegalMixinDueToConstructors/example: Fail
 ImplementsBeforeExtends/script: Fail
 ImplementsBeforeWith/script: Fail
@@ -252,7 +250,6 @@
 NoUnnamedConstructorInObject/analyzerCode: Fail
 NoUnnamedConstructorInObject/example: Fail
 NonAsciiIdentifier/expression: Fail
-NonInstanceTypeVariableUse/analyzerCode: Fail
 NonInstanceTypeVariableUse/example: Fail
 NonPartOfDirectiveInPart/script1: Fail
 NotAPrefixInTypeAnnotation/example: Fail
@@ -266,10 +263,8 @@
 OperatorParameterMismatch2/example: Fail
 OperatorWithOptionalFormals/analyzerCode: Fail
 OperatorWithOptionalFormals/example: Fail
-OverrideFewerNamedArguments/analyzerCode: Fail
 OverrideFewerNamedArguments/example: Fail
 OverrideFewerPositionalArguments/example: Fail
-OverrideMismatchNamedParameter/analyzerCode: Fail
 OverrideMismatchNamedParameter/example: Fail
 OverrideMoreRequiredArguments/example: Fail
 OverrideTypeMismatchParameter/example: Fail
@@ -301,7 +296,6 @@
 PrefixAfterCombinator/example: Fail
 PreviousUseOfName/analyzerCode: Fail
 PreviousUseOfName/example: Fail
-PrivateNamedParameter/analyzerCode: Fail
 PrivateNamedParameter/example: Fail
 RedirectingConstructorWithBody/script1: Fail
 RedirectionInNonFactory/script1: Fail
@@ -357,16 +351,12 @@
 TypeAfterVar/example: Fail
 TypeArgumentMismatch/example: Fail
 TypeArgumentsOnTypeVariable/script1: Fail
-TypeNotFound/analyzerCode: Fail
 TypeNotFound/example: Fail
-TypeVariableDuplicatedName/analyzerCode: Fail
 TypeVariableDuplicatedName/example: Fail
-TypeVariableInStaticContext/analyzerCode: Fail
 TypeVariableInStaticContext/example: Fail
 TypeVariableSameNameAsEnclosing/analyzerCode: Fail
 TypeVariableSameNameAsEnclosing/example: Fail
 TypedefNotFunction/example: Fail
-UnexpectedDollarInString/analyzerCode: Fail
 UnexpectedDollarInString/script1: Fail
 UnexpectedDollarInString/script2: Fail
 UnexpectedDollarInString/script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index fd44372..e6e0060 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -811,6 +811,7 @@
 UnexpectedDollarInString:
   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
   dart2jsCode: MALFORMED_STRING_LITERAL
   script:
     - >
@@ -1013,6 +1014,7 @@
 
 PrivateNamedParameter:
   template: "An optional named parameter can't start with '_'."
+  analyzerCode: PRIVATE_OPTIONAL_PARAMETER
   dart2jsCode: "*ignored*"
 
 NoFormals:
@@ -1130,10 +1132,14 @@
 TypeNotFound:
   template: "Type '#name' not found."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: UNDEFINED_CLASS
+  dart2jsCode: "*fatal*"
 
 NonInstanceTypeVariableUse:
   template: "Can only use type variables in instance methods."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: TYPE_PARAMETER_REFERENCED_BY_STATIC
+  dart2jsCode: "*fatal*"
 
 GetterNotFound:
   template: "Getter not found: '#name'."
@@ -1179,6 +1185,8 @@
 AbstractClassInstantiation:
   template: "The class '#name' is abstract and can't be instantiated."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: NEW_WITH_ABSTRACT_CLASS
+  dart2jsCode: "*fatal*"
 
 AbstractRedirectedClassInstantiation:
   template: "Factory redirects to class '#name', which is abstract and can't be instantiated."
@@ -1505,6 +1513,8 @@
 
 IllegalMixinDueToConstructors:
   template: "Can't use '#name' as a mixin because it has constructors."
+  analyzerCode: MIXIN_DECLARES_CONSTRUCTOR
+  dart2jsCode: "*fatal*"
 
 IllegalMixinDueToConstructorsCause:
   template: "This constructor prevents using '#name' as a mixin."
@@ -1630,10 +1640,14 @@
 OverrideMismatchNamedParameter:
   template: "The method '#name' doesn't have the named parameter '#name2' of overriden method '#name3'."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: INVALID_OVERRIDE_NAMED
+  dart2jsCode: "*fatal*"
 
 OverrideFewerNamedArguments:
   template: "The method '#name' has fewer named arguments than those of overridden method '#name2'."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: INVALID_OVERRIDE_NAMED
+  dart2jsCode: "*fatal*"
 
 OverrideFewerPositionalArguments:
   template: "The method '#name' has fewer positional arguments than those of overridden method '#name2'."
@@ -1667,6 +1681,8 @@
 
 TypeVariableDuplicatedName:
   template: "A type variable can't have the same name as another."
+  analyzerCode: DUPLICATE_DEFINITION
+  dart2jsCode: "*fatal*"
 
 TypeVariableDuplicatedNameCause:
   template: "The other type variable named '#name'."
@@ -1924,6 +1940,8 @@
 
 EnumConstantSameNameAsEnclosing:
   template: "Name of enum constant '#name' can't be the same as the enum's own name."
+  analyzerCode: ENUM_CONSTANT_WITH_ENUM_NAME
+  dart2jsCode: "*fatal*"
 
 MissingOperatorKeyword:
   template: "Operator declarations must be preceeded by the keyword 'operator'."
@@ -2050,6 +2068,8 @@
 TypeVariableInStaticContext:
   template: "Type variables can't be used in static members."
   severity: ERROR_LEGACY_WARNING
+  analyzerCode: TYPE_PARAMETER_REFERENCED_BY_STATIC
+  dart2jsCode: "*fatal*"
 
 SuperclassMethodArgumentMismatch:
   template: "Superclass doesn't have a method named '#name' with matching arguments."
@@ -2062,7 +2082,7 @@
 
 SuperclassHasNoSetter:
   template: "Superclass has no setter named '#name'."
-  analyzerCode: ABSTRACT_SUPER_MEMBER_REFERENCE
+  analyzerCode: UNDEFINED_SUPER_SETTER
   severity: ERROR_LEGACY_WARNING
 
 SuperclassHasNoMethod:
@@ -2181,6 +2201,12 @@
   analyzerCode: EXTERNAL_CONSTRUCTOR_WITH_BODY
   dart2jsCode: "*ignored*"
 
+ArgumentTypeNotAssignable:
+  template: "The argument type '#type' can't be assigned to the parameter type '#type2'."
+  tip: "Try changing the type of the parameter, or casting the argument to '#type2'."
+  analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
+  dart2jsCode: "*ignored*"
+
 InvalidAssignment:
   template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
   tip: "Try changing the type of the left hand side, or casting the right hand side to '#type2'."
@@ -2479,3 +2505,15 @@
     main() {
       const prefix.Object();
     }
+
+CyclicRedirectingFactoryConstructors:
+  template: "Cyclic definition of factory '#name'."
+  analyzerCode: RECURSIVE_FACTORY_REDIRECT
+  dart2jsCode: "*fatal*"
+  severity: ERROR
+  script: |
+    class Foo {
+      factory Foo.foo() = Foo.bar;
+      factory Foo.bar() = Foo.foo;
+    }
+    main() { var foo = new Foo.foo(); }
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 41420c9..9e16f59 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.2
+version: 0.1.3
 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,7 +11,7 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.2
+  kernel: 0.3.3
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
diff --git a/pkg/front_end/test/memory_file_system_test.dart b/pkg/front_end/test/memory_file_system_test.dart
index 89f7335..366d2a1 100644
--- a/pkg/front_end/test/memory_file_system_test.dart
+++ b/pkg/front_end/test/memory_file_system_test.dart
@@ -7,6 +7,7 @@
 
 import 'dart:convert';
 import 'dart:io' as io;
+import 'dart:typed_data';
 
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystemException;
@@ -127,12 +128,24 @@
   }
 
   test_writeAsBytesSync_modifyAfterRead() async {
+    // For effeciency we do not make defensive copies.
     file.writeAsBytesSync([1]);
     (await file.readAsBytes())[0] = 2;
-    expect(await file.readAsBytes(), [1]);
+    expect(await file.readAsBytes(), [2]);
+  }
+
+  test_writeAsBytesSync_modifyAfterWrite_Uint8List() async {
+    // For effeciency we do not make defensive copies.
+    var bytes = new Uint8List.fromList([1]);
+    file.writeAsBytesSync(bytes);
+    bytes[0] = 2;
+    expect(await file.readAsBytes(), [2]);
   }
 
   test_writeAsBytesSync_modifyAfterWrite() async {
+    // For effeciency we generally do not make defensive copies, but on the
+    // other hrand we keep everything as `Uint8List`s internally, so in this
+    // case a copy is actually made.
     var bytes = [1];
     file.writeAsBytesSync(bytes);
     bytes[0] = 2;
diff --git a/pkg/front_end/testcases/annotation_eof.dart.direct.expect b/pkg/front_end/testcases/annotation_eof.dart.direct.expect
index 62142d7..ff821dc 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.direct.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.direct.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''."]/* from null */;
 static method main() → dynamic {
   core::print("There is a dangling annotation at the end of this file");
 }
diff --git a/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
index 62142d7..ff821dc 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''."]/* from null */;
 static method main() → dynamic {
   core::print("There is a dangling annotation at the end of this file");
 }
diff --git a/pkg/front_end/testcases/annotation_eof.dart.strong.expect b/pkg/front_end/testcases/annotation_eof.dart.strong.expect
index 62142d7..ff821dc 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.strong.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.strong.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''."]/* from null */;
 static method main() → dynamic {
   core::print("There is a dangling annotation at the end of this file");
 }
diff --git a/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
index 62142d7..ff821dc 100644
--- a/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''."]/* from null */;
 static method main() → dynamic {
   core::print("There is a dangling annotation at the end of this file");
 }
diff --git a/pkg/front_end/testcases/async_nested.dart b/pkg/front_end/testcases/async_nested.dart
new file mode 100644
index 0000000..a4d0891
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10";
+  Node node = new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      await new Future.value(new Node('4', [
+        new Node('5', [
+          await new Future.value(new Node('6', [
+            await new Future.value(new Node('7', [])),
+          ])),
+          await new Future.value(new Node('8', [])),
+          await new Future.value(new Node('9', [])),
+        ]),
+      ])),
+    ])),
+    await new Future.value(new Node('10', [])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.expect b/pkg/front_end/testcases/async_nested.dart.direct.expect
new file mode 100644
index 0000000..8c2f3ea4
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.dart.direct.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+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
+    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
+  method toString() → core::String
+    return "<${this.{self::Node::name}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
+  method toSimpleString() → dynamic {
+    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
+    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
+  }
+}
+static method main() → void async {
+  core::String expected = "1 2 3 4 5 6 7 8 9 10";
+  self::Node node = new self::Node::•("1", <dynamic>[new self::Node::•("2", <dynamic>[]), await asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[]))])), await asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), await asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[]))])]))])), await asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[]))]);
+  core::String actual = node.toSimpleString();
+  core::print(actual);
+  if(!actual.==(expected)) {
+    throw "Expected '${expected}' but got '${actual}'";
+  }
+}
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
new file mode 100644
index 0000000..da3a56f
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
@@ -0,0 +1,64 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+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
+    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
+  method toString() → core::String
+    return "<${this.{self::Node::name}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
+  method toSimpleString() → dynamic {
+    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
+    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
+  }
+}
+static method main() → void /* originally async */ {
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::String expected = "1 2 3 4 5 6 7 8 9 10";
+        :async_temporary_2 = new self::Node::•("2", <dynamic>[]);
+        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_1 = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        self::Node node = new self::Node::•("1", <dynamic>[:async_temporary_2, :async_temporary_0, :result]);
+        core::String actual = node.toSimpleString();
+        core::print(actual);
+        if(!actual.==(expected)) {
+          throw "Expected '${expected}' but got '${actual}'";
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  asy::Future::microtask<dynamic>(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/async_nested.dart.outline.expect b/pkg/front_end/testcases/async_nested.dart.outline.expect
new file mode 100644
index 0000000..f191aa2
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.dart.outline.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+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
+    ;
+  method toString() → core::String
+    ;
+  method toSimpleString() → dynamic
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.expect b/pkg/front_end/testcases/async_nested.dart.strong.expect
new file mode 100644
index 0000000..02e249a
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+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
+    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
+  method toString() → core::String
+    return "<${this.{self::Node::name}}:[${let final core::List<self::Node> #t1 = this.{self::Node::nested} in #t1.==(null) ?{core::String} null : #t1.{core::Iterable::join}(", ")}]>";
+  method toSimpleString() → dynamic {
+    core::Iterable<dynamic> tmp = let final core::List<self::Node> #t2 = this.{self::Node::nested} in #t2.==(null) ?{core::Iterable<dynamic>} null : #t2.{core::Iterable::map}<dynamic>((self::Node child) → dynamic => child.{self::Node::toSimpleString}());
+    return "${this.{self::Node::name}} ${let final core::Iterable<dynamic> #t3 = tmp in #t3.==(null) ?{core::String} null : #t3.{core::Iterable::join}(" ")}".{core::String::trim}();
+  }
+}
+static method main() → void async {
+  core::String expected = "1 2 3 4 5 6 7 8 9 10";
+  self::Node node = new self::Node::•("1", <self::Node>[new self::Node::•("2", <self::Node>[]), await asy::Future::value<self::Node>(new self::Node::•("3", <self::Node>[await asy::Future::value<self::Node>(new self::Node::•("4", <self::Node>[new self::Node::•("5", <self::Node>[await asy::Future::value<self::Node>(new self::Node::•("6", <self::Node>[await asy::Future::value<self::Node>(new self::Node::•("7", <self::Node>[]))])), await asy::Future::value<self::Node>(new self::Node::•("8", <self::Node>[])), await asy::Future::value<self::Node>(new self::Node::•("9", <self::Node>[]))])]))])), await asy::Future::value<self::Node>(new self::Node::•("10", <self::Node>[]))]);
+  core::String actual = node.{self::Node::toSimpleString}() as{TypeError} core::String;
+  core::print(actual);
+  if(!actual.{core::String::==}(expected)) {
+    throw "Expected '${expected}' but got '${actual}'";
+  }
+}
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
new file mode 100644
index 0000000..39cfaaf
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
@@ -0,0 +1,64 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+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
+    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
+  method toString() → core::String
+    return "<${this.{self::Node::name}}:[${let final core::List<self::Node> #t1 = this.{self::Node::nested} in #t1.==(null) ?{core::String} null : #t1.{core::Iterable::join}(", ")}]>";
+  method toSimpleString() → dynamic {
+    core::Iterable<dynamic> tmp = let final core::List<self::Node> #t2 = this.{self::Node::nested} in #t2.==(null) ?{core::Iterable<dynamic>} null : #t2.{core::Iterable::map}<dynamic>((self::Node child) → dynamic => child.{self::Node::toSimpleString}());
+    return "${this.{self::Node::name}} ${let final core::Iterable<dynamic> #t3 = tmp in #t3.==(null) ?{core::String} null : #t3.{core::Iterable::join}(" ")}".{core::String::trim}();
+  }
+}
+static method main() → void /* originally async */ {
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::String expected = "1 2 3 4 5 6 7 8 9 10";
+        :async_temporary_2 = new self::Node::•("2", <self::Node>[]);
+        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("7", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("6", <self::Node>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_1 = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("8", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("9", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("4", <self::Node>[new self::Node::•("5", <self::Node>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("3", <self::Node>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("10", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
+        self::Node node = new self::Node::•("1", <self::Node>[:async_temporary_2, :async_temporary_0, :result]);
+        core::String actual = node.{self::Node::toSimpleString}() as{TypeError} core::String;
+        core::print(actual);
+        if(!actual.{core::String::==}(expected)) {
+          throw "Expected '${expected}' but got '${actual}'";
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  asy::Future::microtask<dynamic>(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
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 fb62763..f7bb244 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -28,13 +40,6 @@
   set d(x, y);
        ^";
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-Try adding {}.
-set b();
-       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-Try adding {}.
-set c(x, y);
-           ^"]/* from null */;
 static set b(dynamic #synthetic) → dynamic
   let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
 set b();
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 fb62763..f7bb244 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -28,13 +40,6 @@
   set d(x, y);
        ^";
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-Try adding {}.
-set b();
-       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-Try adding {}.
-set c(x, y);
-           ^"]/* from null */;
 static set b(dynamic #synthetic) → dynamic
   let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
 set b();
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 a02d903..1d77ca6 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
@@ -1,3 +1,19 @@
+// Errors:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.
+//     new B();
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -28,15 +44,6 @@
   set d(x, y);
        ^";
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-Try adding {}.
-set b();
-       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-Try adding {}.
-set c(x, y);
-           ^", "pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.
-    new B();
-        ^"]/* from null */;
 static set b(dynamic #synthetic) → void
   let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
 set b();
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 6acf36b..5876551 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
@@ -1,3 +1,19 @@
+// Errors:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.
+//     new B();
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -28,15 +44,6 @@
   set d(x, y);
        ^";
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-Try adding {}.
-set b();
-       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-Try adding {}.
-set c(x, y);
-           ^", "pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.
-    new B();
-        ^"]/* from null */;
 static set b(dynamic #synthetic) → void
   let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
 set b();
diff --git a/pkg/front_end/testcases/bug30695.dart.strong.expect b/pkg/front_end/testcases/bug30695.dart.strong.expect
index f784954..070f366 100644
--- a/pkg/front_end/testcases/bug30695.dart.strong.expect
+++ b/pkg/front_end/testcases/bug30695.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -15,7 +21,4 @@
   method foo() → dynamic
     return 42;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-  foo() => 42;
-  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.expect b/pkg/front_end/testcases/bug33298.dart.strong.expect
index 5d1ae80..e1f9aaf 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.expect
@@ -32,8 +32,8 @@
   core::List<core::String> list4 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2.==(null) ?{(core::String) → core::String} null : #t2.{self::B::call}).{core::Iterable::toList}();
   self::C c = new self::C::•();
   core::List<core::String> list5 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(c.{self::C::call}<core::String>).{core::Iterable::toList}();
-  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: A value of type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to a variable of type '(dart.core::String) \u8594 dynamic'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::String) \u8594 dynamic'.
+  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to the parameter type '(dart.core::String) \u8594 dynamic'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::String) \u8594 dynamic'.
   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
                                            ^" in let final dynamic #t4 = let final self::C #t5 = c in #t5.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t5.{self::C::call} in null).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
 }
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
index f0aa840..a14fb51 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
@@ -32,8 +32,8 @@
   core::List<core::String> list4 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2.==(null) ?{(core::String) → core::String} null : #t2.{self::B::call}).{core::Iterable::toList}();
   self::C c = new self::C::•();
   core::List<core::String> list5 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(c.{self::C::call}<core::String>).{core::Iterable::toList}();
-  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: A value of type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to a variable of type '(dart.core::String) \u8594 dynamic'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::String) \u8594 dynamic'.
+  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to the parameter type '(dart.core::String) \u8594 dynamic'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::String) \u8594 dynamic'.
   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
                                            ^" in let final <T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T #t4 = let final self::C #t5 = c in #t5.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t5.{self::C::call} in null).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
 }
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
index 00f87e5..9360419 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   x as lib.C;
+//        ^^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-  x as lib.C;
-       ^^^^^"]/* from null */;
 static method main() → dynamic {}
 static method test(dynamic x) → dynamic {
   x as invalid-type;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
index 00f87e5..9360419 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   x as lib.C;
+//        ^^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-  x as lib.C;
-       ^^^^^"]/* from null */;
 static method main() → dynamic {}
 static method test(dynamic x) → dynamic {
   x as invalid-type;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
index f8aa323..75dd8d4 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
@@ -1,11 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   print(x is lib.C);
+//              ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-  print(x is lib.C);
-             ^^^^^"]/* from null */;
 static method main() → dynamic {}
 static method test(dynamic x) → dynamic {
   core::print(x is invalid-type);
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
index f8aa323..75dd8d4 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
@@ -1,11 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   print(x is lib.C);
+//              ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-  print(x is lib.C);
-             ^^^^^"]/* from null */;
 static method main() → dynamic {}
 static method test(dynamic x) → dynamic {
   core::print(x is invalid-type);
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
index 9bdb2e8..98139b2 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   lib.C x = null;
+//   ^^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-  lib.C x = null;
-  ^^^^^"]/* from null */;
 static method main() → dynamic
   return self::test();
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
index 9bdb2e8..98139b2 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+//   lib.C x = null;
+//   ^^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-  lib.C x = null;
-  ^^^^^"]/* from null */;
 static method main() → dynamic
   return self::test();
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
index 6fa3d2b..6bcb407 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
+// Specify the type explicitly.
+//   C._circular(this.f);
+//   ^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,8 +16,4 @@
     ;
 }
 static field self::C x = new self::C::_circular(null);
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
-Specify the type explicitly.
-  C._circular(this.f);
-  ^^^^^^^^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect
index 6fa3d2b..6bcb407 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
+// Specify the type explicitly.
+//   C._circular(this.f);
+//   ^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,8 +16,4 @@
     ;
 }
 static field self::C x = new self::C::_circular(null);
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
-Specify the type explicitly.
-  C._circular(this.f);
-  ^^^^^^^^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index bdcce31..f34d98f 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -23,8 +23,6 @@
 redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
 redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
 redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirection_chain_type_arguments: Fail # Issue 32130
-redirection_chain_type_arguments_subst: Fail # Issue 32130
 statements: Fail # Make async tranformer optional for golden file testing.
 type_variable_as_super: Fail
 uninitialized_fields: Fail # Fasta and dartk disagree on static initializers
@@ -41,9 +39,8 @@
 inference/infer_type_cast: Fail
 inference/infer_typed_list_literal: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Fail
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Fail
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: RuntimeError
 
 instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # May be related to Issue 33479
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect b/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
index b89128b..9bb081d 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.direct.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
     : this self::A::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A.bar() : this.foo();
-                 ^^^", "pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A() : this();
-        ^^^^"]/* from null */;
 static method main() → dynamic {}
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 b89128b..9bb081d 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
     : this self::A::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A.bar() : this.foo();
-                 ^^^", "pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A() : this();
-        ^^^^"]/* from null */;
 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 b89128b..9bb081d 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
     : this self::A::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A.bar() : this.foo();
-                 ^^^", "pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A() : this();
-        ^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
index b89128b..9bb081d 100644
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
     : this self::A::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A.bar() : this.foo();
-                 ^^^", "pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers can't be cyclic.
-Try to have all constructors eventually redirect to a non-redirecting constructor.
-  A() : this();
-        ^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/cycles.dart.direct.expect b/pkg/front_end/testcases/cycles.dart.direct.expect
index 930f646..25d9423 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.expect
@@ -1,3 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
+// class C extends B implements D {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -22,13 +36,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
-class A implements C {}
-      ^", "pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
-class B extends A {}
-      ^", "pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
-class C extends B implements D {}
-      ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::A::•());
   core::print(new self::B::•());
diff --git a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
index 930f646..25d9423 100644
--- a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
@@ -1,3 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
+// class C extends B implements D {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -22,13 +36,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
-class A implements C {}
-      ^", "pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
-class B extends A {}
-      ^", "pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
-class C extends B implements D {}
-      ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::A::•());
   core::print(new self::B::•());
diff --git a/pkg/front_end/testcases/expressions.dart.strong.expect b/pkg/front_end/testcases/expressions.dart.strong.expect
index 1fd98df..ccd9621 100644
--- a/pkg/front_end/testcases/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/expressions.dart.strong.expect
@@ -1,10 +1,13 @@
+// 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;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
-    print(int?.toString());
-               ^^^^^^^^"]/* from null */;
 static method foo({dynamic fisk = null}) → dynamic {
   core::print(fisk);
 }
diff --git a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
index c122e52..8f2bfb4 100644
--- a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// 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;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/expressions.dart:74:16: Error: Method not found: 'int.toString'.
-    print(int?.toString());
-               ^^^^^^^^"]/* from null */;
 static method foo({dynamic fisk = null}) → dynamic {
   core::print(fisk);
 }
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
index 172bc99..f2605ca 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-  var x = void f<T>(T t) {};
-               ^", "pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-  print(void g<T>(T t) {});
-             ^"]/* from null */;
 static method main() → dynamic {
   dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → dynamic {} in f;
   core::print(x.runtimeType);
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
index 172bc99..f2605ca 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-  var x = void f<T>(T t) {};
-               ^", "pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-  print(void g<T>(T t) {});
-             ^"]/* from null */;
 static method main() → dynamic {
   dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → dynamic {} in f;
   core::print(x.runtimeType);
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
index 1030838..8c8bdd6 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-  var x = void f<T>(T t) {};
-               ^", "pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-  print(void g<T>(T t) {});
-             ^"]/* from null */;
 static method main() → dynamic {
   <T extends core::Object = dynamic>(T) → core::Null x = let final <T extends core::Object = dynamic>(T) → core::Null f = <T extends core::Object = dynamic>(T t) → core::Null {} in f;
   core::print(x.{core::Object::runtimeType});
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
index 1030838..8c8bdd6 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-  var x = void f<T>(T t) {};
-               ^", "pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-  print(void g<T>(T t) {});
-             ^"]/* from null */;
 static method main() → dynamic {
   <T extends core::Object = dynamic>(T) → core::Null x = let final <T extends core::Object = dynamic>(T) → core::Null f = <T extends core::Object = dynamic>(T t) → core::Null {} in f;
   core::print(x.{core::Object::runtimeType});
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
index d31deb1..b4865bb 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-  print(void f() {});
-             ^"]/* from null */;
 static method main() → dynamic {
   function f() → void {}
   core::print(let final () → void f = () → dynamic {} in f);
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
index d31deb1..b4865bb 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-  print(void f() {});
-             ^"]/* from null */;
 static method main() → dynamic {
   function f() → void {}
   core::print(let final () → void f = () → dynamic {} in f);
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
index dcee09d..1bb53e4 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-  print(void f() {});
-             ^"]/* from null */;
 static method main() → dynamic {
   function f() → void {}
   core::print(let final () → core::Null f = () → core::Null {} in f);
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
index dcee09d..1bb53e4 100644
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-  print(void f() {});
-             ^"]/* from null */;
 static method main() → dynamic {
   function f() → void {}
   core::print(let final () → core::Null f = () → core::Null {} in f);
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.expect b/pkg/front_end/testcases/implicit_new.dart.strong.expect
index d959e33..0326d11 100644
--- a/pkg/front_end/testcases/implicit_new.dart.strong.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.strong.expect
@@ -1,3 +1,13 @@
+// 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;
@@ -24,11 +34,6 @@
     return null;
   operator []=(dynamic _a, dynamic _b) → void {}
 }
-static const field dynamic #errors = const <dynamic>["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();
-         ^^^"]/* from null */;
 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>{})));
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 d959e33..0326d11 100644
--- a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
@@ -1,3 +1,13 @@
+// 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;
@@ -24,11 +34,6 @@
     return null;
   operator []=(dynamic _a, dynamic _b) → void {}
 }
-static const field dynamic #errors = const <dynamic>["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();
-         ^^^"]/* from null */;
 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>{})));
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 e22e2f0..147f052 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -14,9 +24,4 @@
     ;
   abstract method f(dynamic x) → dynamic;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-abstract class A extends B {
-               ^", "pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-abstract class B extends A {
-               ^"]/* from null */;
 static method main() → 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 e22e2f0..147f052 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -14,9 +24,4 @@
     ;
   abstract method f(dynamic x) → dynamic;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-abstract class A extends B {
-               ^", "pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-abstract class B extends A {
-               ^"]/* from null */;
 static method main() → 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 e22e2f0..147f052 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -14,9 +24,4 @@
     ;
   abstract method f(dynamic x) → dynamic;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-abstract class A extends B {
-               ^", "pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-abstract class B extends A {
-               ^"]/* from null */;
 static method main() → 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 e22e2f0..147f052 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// abstract class B extends A {
+//                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -14,9 +24,4 @@
     ;
   abstract method f(dynamic x) → dynamic;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-abstract class A extends B {
-               ^", "pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-abstract class B extends A {
-               ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
index 56ef48b..77eedf0 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 
 static field dynamic x = () → dynamic => self::y;
 static field dynamic y = () → dynamic => self::x;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
index 56ef48b..77eedf0 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 
 static field dynamic x = () → dynamic => self::y;
 static field dynamic y = () → dynamic => self::x;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
index 8df972c..83cae8a 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 
 static field dynamic x = () → dynamic => self::y;
 static field dynamic y = () → dynamic => self::x;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
index 8df972c..83cae8a 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 
 static field dynamic x = () → dynamic => self::y;
 static field dynamic y = () → dynamic => self::x;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → 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 dd5268b..9cc64f9 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
+// Specify the type explicitly.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
+// Specify the type explicitly.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+//                                                                               ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -40,11 +52,4 @@
   get a() → dynamic
     return null;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
-Specify the type explicitly.
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
-                                                                              ^", "pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
-Specify the type explicitly.
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
-                                                                              ^"]/* from null */;
 static method main() → 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 6ae3a3d..69d9cd1 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
+// Specify the type explicitly.
+//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
+//                                                                               ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -47,8 +54,4 @@
   get a() → dynamic
     return null;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:79: Error: Can't infer the type of 'a': overridden members must all have the same type.
-Specify the type explicitly.
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ a =>
-                                                                              ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
index bece5a7..3374e4c 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
+// Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
+//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
+//                                                                                                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -19,10 +26,6 @@
   get reversed() → self::Pair<self::Pair::U, self::Pair::T>
     return new self::Pair::•<self::Pair::U, self::Pair::T>(this.{self::Pair::u}, this.{self::Pair::t});
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
-Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
-      new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
-                                                                                                             ^"]/* from null */;
 static method main() → dynamic {
   final self::Pair<self::Clonable<dynamic>, self::Clonable<dynamic>> x = new self::Pair::_<self::Clonable<dynamic>, self::Clonable<dynamic>>();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
index bece5a7..3374e4c 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
+// Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
+//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
+//                                                                                                              ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -19,10 +26,6 @@
   get reversed() → self::Pair<self::Pair::U, self::Pair::T>
     return new self::Pair::•<self::Pair::U, self::Pair::T>(this.{self::Pair::u}, this.{self::Pair::t});
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Can't use a super-bounded type for instance creation. Got 'test::Pair<test::Clonable<dynamic>, test::Clonable<dynamic>>'.
-Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
-      new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
-                                                                                                             ^"]/* from null */;
 static method main() → dynamic {
   final self::Pair<self::Clonable<dynamic>, self::Clonable<dynamic>> x = new self::Pair::_<self::Clonable<dynamic>, self::Clonable<dynamic>>();
 }
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 9bf8892..32aa1b3 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
@@ -65,18 +65,18 @@
                                                  ^" in let final dynamic #t4 = new self::A::named<dynamic, dynamic>(3, "hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: 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'.
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: 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*/ \"hello\",
-                                               ^" in let final dynamic #t6 = "hello" in null, let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                               ^" in let final dynamic #t6 = "hello" in null, let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t8 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: 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'.
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: 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*/ \"hello\",
-                                               ^" in let final dynamic #t10 = "hello" in null, let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                               ^" in let final dynamic #t10 = "hello" in null, let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t12 = 3 in null);
   }
@@ -95,18 +95,18 @@
                                               ^" in let final dynamic #t16 = new self::B::named<dynamic, dynamic>("hello", 3) in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let dynamic _ = null in let final dynamic #t17 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final dynamic #t18 = 3 in null, let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: 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'.
+                                               ^" in let final dynamic #t18 = 3 in null, let dynamic _ = null in let final dynamic #t19 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: 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*/ \"hello\");
                                                ^" in let final dynamic #t20 = "hello" in null);
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let dynamic _ = null in let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let dynamic _ = null in let final dynamic #t21 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final dynamic #t22 = 3 in null, let dynamic _ = null in let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: 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'.
+                                               ^" in let final dynamic #t22 = 3 in null, let dynamic _ = null in let final dynamic #t23 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: 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*/ \"hello\");
                                                ^" in let final dynamic #t24 = "hello" in null);
   }
@@ -125,12 +125,12 @@
                                                       ^" in let final dynamic #t28 = new self::C::named<dynamic>(3) in null;
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let dynamic _ = null in let final dynamic #t29 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: 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'.
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let dynamic _ = null in let final dynamic #t29 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: 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*/ \"hello\");
                                                ^" in let final dynamic #t30 = "hello" in null);
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let dynamic _ = null in let final dynamic #t31 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: 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'.
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let dynamic _ = null in let final dynamic #t31 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: 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*/ \"hello\");
                                                ^" in let final dynamic #t32 = "hello" in null);
   }
@@ -149,12 +149,12 @@
                                               ^" in let final dynamic #t36 = new self::D::named<dynamic, dynamic>("hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let dynamic _ = null in let final dynamic #t37 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let dynamic _ = null in let final dynamic #t37 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t38 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let dynamic _ = null in let final dynamic #t39 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let dynamic _ = null in let final dynamic #t39 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t40 = 3 in null);
   }
@@ -172,15 +172,15 @@
                                                      ^" in let final dynamic #t44 = 3 in null]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let dynamic _ = null in let final dynamic #t45 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: 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'.
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let dynamic _ = null in let final dynamic #t45 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: 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*/ \"hello\",
-                                               ^" in let final dynamic #t46 = "hello" in null, let dynamic _ = null in let final dynamic #t47 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                               ^" in let final dynamic #t46 = "hello" in null, let dynamic _ = null in let final dynamic #t47 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final dynamic #t48 = 3 in null);
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let dynamic _ = null in let final dynamic #t49 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: 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'.
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let dynamic _ = null in let final dynamic #t49 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: 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*/ \"hello\");
                                                ^" in let final dynamic #t50 = "hello" in null);
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
index 5de4511..9f54e17 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
@@ -65,18 +65,18 @@
                                                  ^" in let final self::A<dynamic, dynamic> #t4 = new self::A::named<dynamic, dynamic>(3, "hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: 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'.
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: 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*/ \"hello\",
-                                               ^" in let final core::String #t6 = "hello" in null, let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                               ^" in let final core::String #t6 = "hello" in null, let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t8 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: 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'.
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: 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*/ \"hello\",
-                                               ^" in let final core::String #t10 = "hello" in null, let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                               ^" in let final core::String #t10 = "hello" in null, let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t12 = 3 in null);
   }
@@ -95,18 +95,18 @@
                                               ^" in let final self::B<dynamic, dynamic> #t16 = new self::B::named<dynamic, dynamic>("hello", 3) in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let<BottomType> _ = null in let final dynamic #t17 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final core::int #t18 = 3 in null, let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: 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'.
+                                               ^" in let final core::int #t18 = 3 in null, let<BottomType> _ = null in let final dynamic #t19 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: 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*/ \"hello\");
                                                ^" in let final core::String #t20 = "hello" in null);
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let<BottomType> _ = null in let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let<BottomType> _ = null in let final dynamic #t21 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in let final core::int #t22 = 3 in null, let<BottomType> _ = null in let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: 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'.
+                                               ^" in let final core::int #t22 = 3 in null, let<BottomType> _ = null in let final dynamic #t23 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: 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*/ \"hello\");
                                                ^" in let final core::String #t24 = "hello" in null);
   }
@@ -125,12 +125,12 @@
                                                       ^" in let final self::C<dynamic> #t28 = new self::C::named<dynamic>(3) in null;
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: 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'.
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let<BottomType> _ = null in let final dynamic #t29 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: 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*/ \"hello\");
                                                ^" in let final core::String #t30 = "hello" in null);
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let<BottomType> _ = null in let final dynamic #t31 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: 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'.
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let<BottomType> _ = null in let final dynamic #t31 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: 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*/ \"hello\");
                                                ^" in let final core::String #t32 = "hello" in null);
   }
@@ -149,12 +149,12 @@
                                               ^" in let final self::D<dynamic, dynamic> #t36 = new self::D::named<dynamic, dynamic>("hello") in null;
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let<BottomType> _ = null in let final dynamic #t37 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let<BottomType> _ = null in let final dynamic #t37 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t38 = 3 in null);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let<BottomType> _ = null in let final dynamic #t39 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let<BottomType> _ = null in let final dynamic #t39 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t40 = 3 in null);
   }
@@ -172,15 +172,15 @@
                                                      ^" in let final core::int #t44 = 3 in null]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let<BottomType> _ = null in let final dynamic #t45 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: 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'.
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let<BottomType> _ = null in let final dynamic #t45 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: 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*/ \"hello\",
-                                               ^" in let final core::String #t46 = "hello" in null, let<BottomType> _ = null in let final dynamic #t47 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                               ^" in let final core::String #t46 = "hello" in null, let<BottomType> _ = null in let final dynamic #t47 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in let final core::int #t48 = 3 in null);
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let<BottomType> _ = null in let final dynamic #t49 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: 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'.
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let<BottomType> _ = null in let final dynamic #t49 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: 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*/ \"hello\");
                                                ^" in let final core::String #t50 = "hello" in null);
   }
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index 908b887..732664a 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
@@ -22,8 +22,8 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
+Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final dynamic #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
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 0e3d51c..f9f9cc1 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
@@ -22,8 +22,8 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
+Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final core::String #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
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 4c8b6d0..86a7783 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
@@ -22,8 +22,8 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
+Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final dynamic #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
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 6e2fe1d..7ee244a 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
@@ -22,8 +22,8 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
+Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in let final core::String #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
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 6662a3f..b5c11d3 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
@@ -16,27 +16,27 @@
   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: A value of type 'dart.core::double' 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'.
+  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'.
+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: A value of type 'dart.core::double' 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'.
+  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'.
+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: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  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: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  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: 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'.
+  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'.
+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: 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'.
+                                             ^" 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'.
+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));
 }
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 7f186ae..a006e9e 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,27 +16,27 @@
   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: A value of type 'dart.core::double' 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'.
+  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'.
+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: A value of type 'dart.core::double' 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'.
+  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'.
+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: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  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: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  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: 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'.
+  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'.
+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: 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'.
+                                             ^" 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'.
+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));
 }
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 1d84eb1..a6dedb5 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
@@ -1,3 +1,14 @@
+// Errors:
+//
+// 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:14:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).
+// Change to a subtype of test::C::m::T.
+// /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
+//                                                                ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -16,12 +27,6 @@
   method m(dynamic x) → dynamic
     return x;
 }
-static const field dynamic #errors = const <dynamic>["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:14:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).
-Change to a subtype of test::C::m::T.
-/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
-                                                               ^"]/* from null */;
 static method main() → dynamic {
   core::int y = new self::D::•().{self::D::m}<core::int>(42) as{TypeError} core::int;
   core::print(y);
diff --git a/pkg/front_end/testcases/inference/generic_methods_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 7e4bcfc6..46b8e3f 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
@@ -1,3 +1,23 @@
+// Errors:
+//
+// 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:15:54: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).
+// 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: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:18:54: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).
+// Change to a supertype of dart.core::int (or, for a covariant parameter, a subtype).
+//           T /*@error=OverrideTypeMismatchParameter*/ x) =>
+//                                                      ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -20,17 +40,6 @@
   method g<T extends core::Object = dynamic>(self::D::g::T x) → self::D::g::T
     return x;
 }
-static const field dynamic #errors = const <dynamic>["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:15:54: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).
-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: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:18:54: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).
-Change to a supertype of dart.core::int (or, for a covariant parameter, a subtype).
-          T /*@error=OverrideTypeMismatchParameter*/ x) =>
-                                                     ^"]/* from null */;
 static method main() → dynamic {
   core::int y = (new self::D::•() as self::C).{self::C::m}(42) as{TypeError} core::int;
   core::print(y);
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index f260b29..4c1af02 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
@@ -21,12 +21,12 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final dynamic #t2 = math::max<core::num> in null);
-  self::takeDID(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final dynamic #t4 = math::max<core::num> in null);
   self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -41,12 +41,12 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final dynamic #t6 = math::min<core::num> in null);
-  self::takeDID(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let dynamic _ = null in let final dynamic #t7 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final dynamic #t8 = math::min<core::num> in null);
   self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -63,12 +63,12 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let dynamic _ = null in let final dynamic #t9 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
           . /*@target=C::m*/ m);
                              ^" in let final dynamic #t10 = new self::C::•().{self::C::m}<core::num> in null);
-  self::takeDID(let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let dynamic _ = null in let final dynamic #t11 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
           . /*@target=C::m*/ m);
                              ^" in let final dynamic #t12 = new self::C::•().{self::C::m}<core::num> in null);
 }
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 b939213..3d46d45 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
@@ -21,12 +21,12 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final (core::num, core::num) → core::num #t2 = math::max<core::num> in null);
-  self::takeDID(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in let final (core::num, core::num) → core::num #t4 = math::max<core::num> in null);
   self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -41,12 +41,12 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final (core::num, core::num) → core::num #t6 = math::min<core::num> in null);
-  self::takeDID(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let<BottomType> _ = null in let final dynamic #t7 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in let final (core::num, core::num) → core::num #t8 = math::min<core::num> in null);
   self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -63,12 +63,12 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let<BottomType> _ = null in let final dynamic #t9 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
           . /*@target=C::m*/ m);
                              ^" in let final (core::num, core::num) → core::num #t10 = new self::C::•().{self::C::m}<core::num> in null);
-  self::takeDID(let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: A value of type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let<BottomType> _ = null in let final dynamic #t11 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
           . /*@target=C::m*/ m);
                              ^" in let final (core::num, core::num) → core::num #t12 = new self::C::•().{self::C::m}<core::num> in null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index a9ca526..0af21f3 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -12,8 +12,8 @@
 Try correcting the name to the name of an existing method, or defining a method named '+'.
                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                        ^") as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let dynamic _ = null in let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to the parameter type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+Try changing the type of the parameter, or casting the argument to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                            ^" in let final dynamic #t3 = (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}()) in null));
   asy::Future<core::String> results4 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → core::String => list.{core::Iterable::fold}<core::String>("", (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())));
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index 5577717..221ebfd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -12,8 +12,8 @@
 Try correcting the name to the name of an existing method, or defining a method named '+'.
                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                        ^") as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: A value of type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let<BottomType> _ = null in let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to the parameter type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+Try changing the type of the parameter, or casting the argument to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                            ^" in let final (core::String, core::int) → core::String #t3 = (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}()) in null));
   asy::Future<core::String> results4 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → core::String => list.{core::Iterable::fold}<core::String>("", (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())));
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 d7a5129..e636683 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
@@ -1,3 +1,20 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
+//                                                                               ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -50,14 +67,4 @@
     : super self::C::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
-                                                                              ^", "pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
-                                                                              ^", "pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:79: Error: Can't infer the type of 'x': overridden members must all have the same type.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ x;
-                                                                              ^"]/* from null */;
 static method main() → dynamic {}
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 f757830..5d55e92 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
@@ -1,3 +1,13 @@
+// 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;
@@ -29,11 +39,6 @@
 var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                                               ^";
 static field self::B j = null as self::B;
-static const field dynamic #errors = const <dynamic>["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
-                                 ^"]/* from null */;
 static method test1() → dynamic {
   self::a = let dynamic _ = null in let final dynamic #t4 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
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 d1d2dd6..fa5b98d 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,3 +1,13 @@
+// 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;
@@ -29,11 +39,6 @@
 var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                                               ^";
 static field self::B j = null as self::B;
-static const field dynamic #errors = const <dynamic>["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
-                                 ^"]/* from null */;
 static method test1() → dynamic {
   self::a = let<BottomType> _ = null in let final dynamic #t4 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
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 ab874a0..c939a0a 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
@@ -1,10 +1,13 @@
+// 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 const field dynamic #errors = const <dynamic>["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();
-                                                                         ^"]/* from null */;
 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>{})));
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 ab874a0..c939a0a 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,10 +1,13 @@
+// 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 const field dynamic #errors = const <dynamic>["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();
-                                                                         ^"]/* from null */;
 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>{})));
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 b1c4e7f..56fdbc9 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -1,3 +1,24 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.
+// Specify the type explicitly.
+//       /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
+// Specify the type explicitly.
+//       {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
+//                                                                                ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
+// Specify the type explicitly.
+//       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
+//                                                                                ^
+//
+// 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(
+//                                                             ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -26,16 +47,4 @@
   abstract method g(core::int x, [dynamic y = null]) → core::int;
   abstract method h(core::int x, {dynamic y = null}) → core::int;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer the type of 'y': overridden members must all have the same type.
-Specify the type explicitly.
-      /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
-                                                                              ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
-Specify the type explicitly.
-      {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
-                                                                               ^", "pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer the type of 'y': overridden members must all have the same type.
-Specify the type explicitly.
-      [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
-                                                                               ^", "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(
-                                                            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index 03fddbd..0ef38ce 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -4,12 +4,12 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: 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'.
+  x.{core::List::add}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: 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'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final dynamic #t2 = "hi" in null);
-  x.{core::List::add}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' 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'.
+  x.{core::List::add}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: 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'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                       ^" in let final dynamic #t4 = 4.0 in null);
   x.{core::List::add}(4);
@@ -17,8 +17,8 @@
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  x.{core::List::add}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final dynamic #t6 = "hi" in null);
   x.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
index 1b7e2aa..c91995d 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
@@ -4,12 +4,12 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: 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'.
+  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: 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'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final core::String #t2 = "hi" in null);
-  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: A value of type 'dart.core::double' 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'.
+  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: 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'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                       ^" in let final core::double #t4 = 4.0 in null);
   x.{core::List::add}(4);
@@ -17,8 +17,8 @@
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  x.{core::List::add}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in let final core::String #t6 = "hi" in null);
   x.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index fdc6bfa..f2f1e31 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -5,20 +5,20 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: 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'.
+  self::x1.{core::List::add}(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: 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'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final dynamic #t2 = "hi" in null);
-  self::x1.{core::List::add}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' 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'.
+  self::x1.{core::List::add}(let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: 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'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                        ^" in let final dynamic #t4 = 4.0 in null);
   self::x1.{core::List::add}(4);
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  self::x2.{core::List::add}(let dynamic _ = null in let final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final dynamic #t6 = "hi" in null);
   self::x2.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
index 3788b95..b26fec1 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
@@ -5,20 +5,20 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: 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'.
+  self::x1.{core::List::add}(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: 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'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final core::String #t2 = "hi" in null);
-  self::x1.{core::List::add}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: A value of type 'dart.core::double' 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'.
+  self::x1.{core::List::add}(let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: 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'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                        ^" in let final core::double #t4 = 4.0 in null);
   self::x1.{core::List::add}(4);
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  self::x2.{core::List::add}(let<BottomType> _ = null in let final dynamic #t5 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
+Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in let final core::String #t6 = "hi" in null);
   self::x2.{core::List::add}(4.0);
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 cf9d1f4..5f6695d 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,3 +1,9 @@
+// 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> {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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> {}
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 53f5baf..6f5d53c 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,3 +1,9 @@
+// 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> {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -32,7 +38,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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> {}
-                                     ^"]/* from null */;
 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 cf9d1f4..5f6695d 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,3 +1,9 @@
+// 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> {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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> {}
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 8d072fe..be9b974 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-class /*@error=AmbiguousSupertypes*/ A extends Object
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 d6e5c6c..940281a 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -32,7 +38,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-class /*@error=AmbiguousSupertypes*/ A extends Object
-                                     ^"]/* from null */;
 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 8d072fe..be9b974 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-class /*@error=AmbiguousSupertypes*/ A extends Object
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 7268b70..9d11b4f 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,3 +1,9 @@
+// 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 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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 {}
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 c6ca47c..69991d5 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,3 +1,9 @@
+// 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 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -32,7 +38,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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 {}
-                                     ^"]/* from null */;
 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 7268b70..9d11b4f 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,3 +1,9 @@
+// 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 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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 {}
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 9b8dd77..a944e9f 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,3 +1,9 @@
+// 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 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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 {}
-                                     ^"]/* from null */;
 static method main() → dynamic {}
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 cc0d501..7c37439 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,3 +1,9 @@
+// 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 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -32,7 +38,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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 {}
-                                     ^"]/* from null */;
 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 9b8dd77..a944e9f 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,3 +1,9 @@
+// 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 {}
+//                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -26,7 +32,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["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 {}
-                                     ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
index 7406276..2fff017 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
@@ -1,3 +1,25 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Error: Superclass has no method named 'foo'.
+//     var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:13:38: Error: Superclass has no getter named 'bar'.
+//     var /*@type=dynamic*/ v2 = super.bar;
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:14:37: Error: Superclass has no method named '[]'.
+//     var /*@type=dynamic*/ v3 = super[0];
+//                                     ^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:15:38: Error: Superclass has no setter named 'bar'.
+//     var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();
+//                                      ^^^
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
+//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
+//                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -14,17 +36,6 @@
     dynamic v5 = let final core::int #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/unresolved_super.dart:12:38: Error: Superclass has no method named 'foo'.
-    var /*@type=dynamic*/ v1 = super.foo(/*@typeArgs=dynamic*/ f());
-                                     ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:13:38: Error: Superclass has no getter named 'bar'.
-    var /*@type=dynamic*/ v2 = super.bar;
-                                     ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:14:37: Error: Superclass has no method named '[]'.
-    var /*@type=dynamic*/ v3 = super[0];
-                                    ^", "pkg/front_end/testcases/inference/unresolved_super.dart:15:38: Error: Superclass has no setter named 'bar'.
-    var /*@type=dynamic*/ v4 = super.bar = /*@typeArgs=dynamic*/ f();
-                                     ^^^", "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
-    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
-                                    ^"]/* from null */;
 static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
index 1e31f01..ecedd4a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
@@ -2,9 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(dynamic);
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart:10:16: Error: Expected ';' before this.\n    (f)<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {\n               ^"]/* from null */;
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static field dynamic v = self::f.call<dynamic>(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
new file mode 100644
index 0000000..ecedd4a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v = self::f.call<dynamic>(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
index dd9a2c6..450cd02 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
@@ -2,9 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(core::int);
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart:10:12: Error: Expected ';' before this.\n    (f)<int>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {\n           ^"]/* from null */;
-static method f<T extends core::Object>(() → self::f::T g) → core::List<self::f::T>
+static field dynamic v = self::f.call<core::int>(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
   return <self::f::T>[g.call()];
 static method main() → dynamic {
   self::v;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
new file mode 100644
index 0000000..450cd02
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic v = self::f.call<core::int>(() → dynamic {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {
+  self::v;
+}
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 59ee258..fb9dc87 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
 static field dynamic c = () → dynamic => self::a.{self::A::f}<dynamic>(self::b);
 static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
 static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
index 59ee258..fb9dc87 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
 static field dynamic c = () → dynamic => self::a.{self::A::f}<dynamic>(self::b);
 static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
 static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
index 8c0e3f3..4d4101b 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -11,11 +23,4 @@
 static field core::num d = self::c.call();
 static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
 static field core::double f = self::e.call();
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
-                                                                  ^", "pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
index 8c0e3f3..4d4101b 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -11,11 +23,4 @@
 static field core::num d = self::c.call();
 static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
 static field core::double f = self::e.call();
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
-                                                                  ^", "pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-                                                                  ^"]/* from null */;
 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 b5ea678..0454a7c 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
+//                                                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
     : super self::A::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                    ^", "pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
-                                                                    ^"]/* from null */;
 static method main() → dynamic {}
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 b5ea678..0454a7c 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
+//                                                                     ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -16,11 +28,4 @@
     : super self::A::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                    ^", "pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
-                                                                    ^"]/* from null */;
 static method main() → dynamic {}
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 192bdbe..db4967d 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -12,11 +24,4 @@
 static field self::A a = new self::A::•();
 static field dynamic x = () → dynamic => self::a.{self::A::b};
 static field () → () → dynamic y = () → () → dynamic => self::a.{self::A::c};
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-                                                                    ^", "pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
index 192bdbe..db4967d 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -12,11 +24,4 @@
 static field self::A a = new self::A::•();
 static field dynamic x = () → dynamic => self::a.{self::A::b};
 static field () → () → dynamic y = () → () → dynamic => self::a.{self::A::c};
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
-Specify the type explicitly.
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-                                                                    ^", "pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
index 7f9a899..419ba0e 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -5,13 +17,6 @@
 static field dynamic x = () → dynamic => self::f() ?{dynamic} self::y : self::z;
 static field dynamic y = () → dynamic => self::x;
 static field () → dynamic z = () → dynamic => self::x;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method f() → core::bool
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
index 7f9a899..419ba0e 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+//                                                                   ^
+
 library test;
 import self as self;
 import "dart:core" as core;
@@ -5,13 +17,6 @@
 static field dynamic x = () → dynamic => self::f() ?{dynamic} self::y : self::z;
 static field dynamic y = () → dynamic => self::x;
 static field () → dynamic z = () → dynamic => self::x;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-                                                                  ^", "pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
-Specify the type explicitly.
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-                                                                  ^"]/* from null */;
 static method f() → core::bool
   return null;
 static method main() → dynamic {}
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 682d590..d068e62 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
+// Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
+// var y = new B();
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,8 +15,4 @@
     ;
 }
 static field self::B<core::Comparable<dynamic>> y = new self::B::•<core::Comparable<dynamic>>();
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
-Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
-var y = new B();
-            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
index 682d590..d068e62 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
+// Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
+// var y = new B();
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,8 +15,4 @@
     ;
 }
 static field self::B<core::Comparable<dynamic>> y = new self::B::•<core::Comparable<dynamic>>();
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Can't use a super-bounded type for instance creation. Got '#lib1::B<dart.core::Comparable<dynamic>>'.
-Specify a regular-bounded type instead of the super-bounded type. Note that the latter may be due to type inference.
-var y = new B();
-            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
index a4a2719..693def5 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -18,8 +25,4 @@
     ;
 }
 static field self::C<self::B<dynamic>> c;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'A' here.
-class B<TypeU extends A> {}
-        ^^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
index a4a2719..693def5 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -18,8 +25,4 @@
     ;
 }
 static field self::C<self::B<dynamic>> c;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'A' here.
-class B<TypeU extends A> {}
-        ^^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
index 02c4ed2..ba808e0 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -13,8 +20,4 @@
     ;
 }
 static field self::B<dynamic> b;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'A' here.
-class B<TypeU extends A> {}
-        ^^^^^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
index 02c4ed2..ba808e0 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -13,8 +20,4 @@
     ;
 }
 static field self::B<dynamic> b;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'A' here.
-class B<TypeU extends A> {}
-        ^^^^^"]/* from null */;
 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 152e48b..ed6b34a 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
@@ -1,3 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// typedef void Fisk<TypeY extends Hest>();
+//              ^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: The typedef 'Fisk' has a reference to itself.
+// typedef void Fisk<TypeY extends Hest>();
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,10 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-typedef void Fisk<TypeY extends Hest>();
-             ^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: The typedef 'Fisk' has a reference to itself.
-typedef void Fisk<TypeY extends Hest>();
-             ^"]/* from null */;
 static method main() → dynamic {}
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 152e48b..ed6b34a 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
@@ -1,3 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// typedef void Fisk<TypeY extends Hest>();
+//              ^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: The typedef 'Fisk' has a reference to itself.
+// typedef void Fisk<TypeY extends Hest>();
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,10 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-typedef void Fisk<TypeY extends Hest>();
-             ^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: The typedef 'Fisk' has a reference to itself.
-typedef void Fisk<TypeY extends Hest>();
-             ^"]/* from null */;
 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 192b8ba..8e72408 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,8 +14,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Hest> {}
-           ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 192b8ba..8e72408 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,8 +14,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Hest> {}
-           ^^^^^"]/* from null */;
 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 8499ca8..9f68d44 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//                                ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,11 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Hest, TypeY extends Hest> {}
-           ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Hest, TypeY extends Hest> {}
-                               ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 8499ca8..9f68d44 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//                                ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,11 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Hest, TypeY extends Hest> {}
-           ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Hest, TypeY extends Hest> {}
-                               ^^^^^"]/* from null */;
 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 6760128..89d0cb6 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Map<Hest, Hest>> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,8 +14,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Map<Hest, Hest>> {}
-           ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 6760128..89d0cb6 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Map<Hest, Hest>> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,8 +14,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
-Try providing type arguments to 'Hest' here.
-class Hest<TypeX extends Map<Hest, Hest>> {}
-           ^^^^^"]/* from null */;
 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 5ae9bde..435843c 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//                                ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,11 +24,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
-           ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
-                               ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 5ae9bde..435843c 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//                                ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,11 +24,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
-           ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
-                               ^^^^^"]/* from null */;
 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 6b7a848..a835974 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'LinkedListEntry' here.
+// class Hest<X extends LinkedListEntry> {}
+//            ^
+
 library;
 import self as self;
 import "dart:collection" as col;
@@ -8,8 +15,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'LinkedListEntry' here.
-class Hest<X extends LinkedListEntry> {}
-           ^"]/* from null */;
 static method main() → dynamic {}
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 6b7a848..a835974 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'LinkedListEntry' here.
+// class Hest<X extends LinkedListEntry> {}
+//            ^
+
 library;
 import self as self;
 import "dart:collection" as col;
@@ -8,8 +15,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'LinkedListEntry' here.
-class Hest<X extends LinkedListEntry> {}
-           ^"]/* from null */;
 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 1e2ebae..c4f448b 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Fisk' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -17,11 +29,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
-              ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Fisk' here.
-class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
-              ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 1e2ebae..c4f448b 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Fisk' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -17,11 +29,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
-              ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Fisk' here.
-class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
-              ^^^^^"]/* from null */;
 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 aea6b8d..835bb6a 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// class Hest<TypeX extends lib.Hest> {}
+//       ^^^^
+
 library;
 import self as self;
 import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
@@ -8,8 +15,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-class Hest<TypeX extends lib.Hest> {}
-      ^^^^"]/* from null */;
 static method main() → dynamic {}
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 aea6b8d..835bb6a 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// class Hest<TypeX extends lib.Hest> {}
+//       ^^^^
+
 library;
 import self as self;
 import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
@@ -8,8 +15,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-class Hest<TypeX extends lib.Hest> {}
-      ^^^^"]/* from null */;
 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 bf31ea9..11e9935 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Map<Hest, Hest>> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,8 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Map<Hest, Hest>> {}
-           ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 bf31ea9..11e9935 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Map<Hest, Hest>> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,8 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Map<Hest, Hest>> {}
-           ^^^^^"]/* from null */;
 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 c1297fa..a7a478f 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -17,8 +24,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest> {}
-           ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 c1297fa..a7a478f 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -17,8 +24,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest> {}
-           ^^^^^"]/* from null */;
 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 67f553b..16fb364 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,8 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest> {}
-           ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 67f553b..16fb364 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,8 +19,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
-Try providing type arguments to 'Hest' here.
-class Fisk<TypeY extends Hest> {}
-           ^^^^^"]/* from null */;
 static method main() → dynamic {}
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 8392f75..60bcdea 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
@@ -1,3 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,13 +26,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-    var x = /*@error=NamedFunctionExpression*/ T() {};
-                                               ^", "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-        T() {};
-        ^", "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^"]/* from null */;
 static method test() → dynamic {
   self::T t;
   self::V v;
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 8392f75..60bcdea 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
@@ -1,3 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,13 +26,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-    var x = /*@error=NamedFunctionExpression*/ T() {};
-                                               ^", "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-        T() {};
-        ^", "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^"]/* from null */;
 static method test() → dynamic {
   self::T t;
   self::V v;
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 f93c202..0dde266 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
@@ -1,3 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
+//     void T(/*@error=NotAType*/ T t) {}
+//                                ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,15 +30,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-    var x = /*@error=NamedFunctionExpression*/ T() {};
-                                               ^", "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-        T() {};
-        ^", "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^", "pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
-    void T(/*@error=NotAType*/ T t) {}
-                               ^"]/* from null */;
 static method test() → dynamic {
   self::T t;
   self::V v;
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 051c027..c427566 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
@@ -1,3 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedNameCause*/ T>() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
+//     void T(/*@error=NotAType*/ T t) {}
+//                                ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,15 +30,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-    var x = /*@error=NamedFunctionExpression*/ T() {};
-                                               ^", "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-        T() {};
-        ^", "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-        T< /*@context=DuplicatedNameCause*/ T>() {};
-        ^", "pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
-    void T(/*@error=NotAType*/ T t) {}
-                               ^"]/* from null */;
 static method test() → dynamic {
   self::T t;
   self::V v;
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 7cab6c0..b8c3f6f 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).
+// Change to a subtype of #lib1::B.
+//   A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+//                                                   ^
+//
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
+//                                                         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -44,11 +56,4 @@
   get y() → self::A
     return null;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).
-Change to a subtype of #lib1::B.
-  A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
-                                                  ^", "pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
-  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
-                                                        ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
index 944f780..1079542 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
+// Change to a subtype of #lib1::A.
+//   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+//                                                        ^
+//
+// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
+//                                                         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -36,11 +48,4 @@
   get y() → core::Object
     return null;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
-Change to a subtype of #lib1::A.
-  Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
-                                                       ^", "pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
-  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
-                                                        ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
index 2790cab..a16ec7c 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// 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:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
+//                                                                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -34,11 +46,4 @@
   set x5(covariant core::String value) → void {}
   set x6(covariant self::A value) → void {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-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:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
-Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
-      covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
-                                                                ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
index 507e18b..118eae6 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
+//                                                     ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -36,8 +43,4 @@
     ;
   method f(self::B x) → void {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
-  void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
-                                                    ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
index 31a1120..14ce8e1 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
@@ -1,3 +1,25 @@
+// Errors:
+//
+// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
+// Change to a subtype of #lib1::A.
+//   Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
+//                                                    ^
+//
+// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E::f3' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// 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:26:54: Error: The parameter 'x' of the method 'E::f1' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// 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:27:55: Error: The parameter 'x' of the method 'E::f2' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
+//                                                       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -39,17 +61,4 @@
   method f3({self::B x = null}) → void {}
   method f4() → core::Object {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
-Change to a subtype of #lib1::A.
-  Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
-                                                   ^", "pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E::f3' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-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:26:54: Error: The parameter 'x' of the method 'E::f1' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-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:27:55: Error: The parameter 'x' of the method 'E::f2' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
-  void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
-                                                      ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
index 100a773..1ce77e1 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
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
+// 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:24:54: Error: The parameter 'x' of the method 'D::f4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
+// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+//   void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
+//                                                      ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -34,11 +46,4 @@
   method f5(covariant core::String x) → void {}
   method f6(covariant self::A x) → void {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
-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:24:54: Error: The parameter 'x' of the method 'D::f4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
-  void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
-                                                     ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
index 9d40d19..e062fce 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.expect
@@ -1,3 +1,13 @@
+// Errors:
+//
+// 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:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+
 library test.qualified.main;
 import self as self;
 import "dart:core" as core;
@@ -25,11 +35,6 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["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:19: Error: Type 'lib.Missing' not found.
-class Bad extends lib.Missing {
-                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
index 34fd3f9..a9175a1 100644
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
@@ -1,3 +1,13 @@
+// Errors:
+//
+// 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:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+
 library test.qualified.main;
 import self as self;
 import "dart:core" as core;
@@ -31,11 +41,6 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["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:19: Error: Type 'lib.Missing' not found.
-class Bad extends lib.Missing {
-                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 1b186df..fa6e54e 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -1,3 +1,17 @@
+// Errors:
+//
+// 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:12:3: Error: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+
 library test.qualified.main;
 import self as self;
 import "dart:core" as core;
@@ -25,13 +39,6 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["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:12:3: Error: Type 'lib.Missing' not found.
-  lib.Missing method() {}
-  ^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-class Bad extends lib.Missing {
-                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index b00d2b5..9894c5e 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -1,3 +1,17 @@
+// Errors:
+//
+// 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:12:3: Error: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^
+
 library test.qualified.main;
 import self as self;
 import "dart:core" as core;
@@ -31,13 +45,6 @@
   static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
     let <T extends core::Object = dynamic>() → lib::C<lib::C::b::T> #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
 }
-static const field dynamic #errors = const <dynamic>["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:12:3: Error: Type 'lib.Missing' not found.
-  lib.Missing method() {}
-  ^", "pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-class Bad extends lib.Missing {
-                  ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•<core::String>();
   new self::C::a<core::String>();
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 16429f7..58b020e 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,10 @@
+// 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;
@@ -7,10 +14,12 @@
     : 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: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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.\n    use(+super);\n        ^"]/* from null */;
 static method use(dynamic _) → dynamic
   return null;
 static method main() → 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 4f59cd7..c34187e 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
@@ -1,3 +1,14 @@
+// Errors:
+//
+// 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: ''.
+//     use(+super);
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,7 +21,6 @@
     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         ^")));
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.\n    use(+super);\n        ^"]/* from null */;
 static method use(dynamic _) → dynamic
   return null;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
index c8306b8..16a1f84 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
@@ -1,3 +1,23 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:6:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A()
+//   ^^^^^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a class member, but got ':'.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:7: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//     : x = 'foo'
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,7 +27,6 @@
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/malformed_const_constructor.dart:7:7: Error: Setter not found: 'x'.\n    : x = 'foo'\n      ^"
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a function body, but got ':'.\n    : x = 'foo'\n    ^", "pkg/front_end/testcases/rasta/malformed_const_constructor.dart: Error: A const constructor can't have a body."]/* from null */;
 static method main() → dynamic {
   const self::A::•();
   new self::A::•();
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
index c20357f..be30e1a 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
@@ -1,11 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 typedef Handle = (core::String) → dynamic;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
-typedef Handle Handle(String command);
-               ^"]/* from null */;
 static method main() → dynamic {
   (core::String) → dynamic h;
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
index c20357f..be30e1a 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
@@ -1,11 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 typedef Handle = (core::String) → dynamic;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
-typedef Handle Handle(String command);
-               ^"]/* from null */;
 static method main() → dynamic {
   (core::String) → dynamic h;
 }
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 431a0e1..0da6aee 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+
 library test.mixin_library;
 import self as self;
 import "dart:core" as core;
@@ -23,9 +29,6 @@
   method publicMethod() → dynamic
     return this.{self::Mixin::_privateMethod}();
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
-  foo() => super.foo() + f();
-                 ^^^"]/* from null */;
 static method f() → dynamic
   return 2;
 static method V() → dynamic
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.expect b/pkg/front_end/testcases/rasta/super.dart.direct.expect
index 7c9f7d6..9837936 100644
--- a/pkg/front_end/testcases/rasta/super.dart.direct.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.direct.expect
@@ -1,3 +1,15 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -51,8 +63,14 @@
     self::use(super.{self::A::~}());
     super.{self::A::unary-}();
     self::use(super.{self::A::unary-}());
-    this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use `super` as an expression.\n    +super;\n     ^");
-    self::use(this.•.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use `super` as an expression.\n    use(+super);\n         ^"));
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    +super;
+     ^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^");
     super.{self::A::==}(87);
     self::use(super.{self::A::==}(87));
     !super.{self::A::==}(87);
@@ -253,7 +271,6 @@
     self::use(super.{self::A::n} = super.{self::A::n}.-(42));
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.\nTry removing '+'.\n    +super;\n    ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.\nTry removing '+'.\n    use(+super);\n        ^"]/* from null */;
 static method use(dynamic x) → dynamic {
   if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
     throw "Shouldn't happen";
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 05c0a32..4d36a7b 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -1,3 +1,239 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: Getter not found: ''.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: Getter not found: ''.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:62:11: Error: Superclass has no getter named 'g'.
+//     super.g;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:63:15: Error: Superclass has no getter named 'g'.
+//     use(super.g);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:83:11: Error: Superclass has no setter named 'e'.
+//     super.e++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:84:15: Error: Superclass has no setter named 'e'.
+//     use(super.e++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:85:11: Error: Superclass has no setter named 'f'.
+//     super.f++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:86:15: Error: Superclass has no setter named 'f'.
+//     use(super.f++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:87:11: Error: Superclass has no getter named 'g'.
+//     super.g++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:88:15: Error: Superclass has no getter named 'g'.
+//     use(super.g++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:95:11: Error: Superclass has no setter named 'm'.
+//     super.m++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:96:15: Error: Superclass has no setter named 'm'.
+//     use(super.m++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:108:13: Error: Superclass has no setter named 'e'.
+//     ++super.e;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:109:17: Error: Superclass has no setter named 'e'.
+//     use(++super.e);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:110:13: Error: Superclass has no setter named 'f'.
+//     ++super.f;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:111:17: Error: Superclass has no setter named 'f'.
+//     use(++super.f);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:112:13: Error: Superclass has no getter named 'g'.
+//     ++super.g;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:113:17: Error: Superclass has no getter named 'g'.
+//     use(++super.g);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:120:13: Error: Superclass has no setter named 'm'.
+//     ++super.m;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:121:17: Error: Superclass has no setter named 'm'.
+//     use(++super.m);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:137:11: Error: Superclass has no method named 'g'.
+//     super.g();
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:138:15: Error: Superclass has no method named 'g'.
+//     use(super.g());
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:160:11: Error: Superclass has no setter named 'e'.
+//     super.e = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:161:15: Error: Superclass has no setter named 'e'.
+//     use(super.e = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:162:11: Error: Superclass has no setter named 'f'.
+//     super.f = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:163:15: Error: Superclass has no setter named 'f'.
+//     use(super.f = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:172:11: Error: Superclass has no setter named 'm'.
+//     super.m = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:173:15: Error: Superclass has no setter named 'm'.
+//     use(super.m = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:185:11: Error: Superclass has no setter named 'e'.
+//     super.e ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:186:15: Error: Superclass has no setter named 'e'.
+//     use(super.e ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:187:11: Error: Superclass has no setter named 'f'.
+//     super.f ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:188:15: Error: Superclass has no setter named 'f'.
+//     use(super.f ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:189:11: Error: Superclass has no getter named 'g'.
+//     super.g ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:190:15: Error: Superclass has no getter named 'g'.
+//     use(super.g ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:197:11: Error: Superclass has no setter named 'm'.
+//     super.m ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:198:15: Error: Superclass has no setter named 'm'.
+//     use(super.m ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:210:11: Error: Superclass has no setter named 'e'.
+//     super.e += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:211:15: Error: Superclass has no setter named 'e'.
+//     use(super.e += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:212:11: Error: Superclass has no setter named 'f'.
+//     super.f += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:213:15: Error: Superclass has no setter named 'f'.
+//     use(super.f += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:214:11: Error: Superclass has no getter named 'g'.
+//     super.g += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:215:15: Error: Superclass has no getter named 'g'.
+//     use(super.g += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:222:11: Error: Superclass has no setter named 'm'.
+//     super.m += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:223:15: Error: Superclass has no setter named 'm'.
+//     use(super.m += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:235:11: Error: Superclass has no setter named 'e'.
+//     super.e -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:236:15: Error: Superclass has no setter named 'e'.
+//     use(super.e -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:237:11: Error: Superclass has no setter named 'f'.
+//     super.f -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:238:15: Error: Superclass has no setter named 'f'.
+//     use(super.f -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:239:11: Error: Superclass has no getter named 'g'.
+//     super.g -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:240:15: Error: Superclass has no getter named 'g'.
+//     use(super.g -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:247:11: Error: Superclass has no setter named 'm'.
+//     super.m -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
+//     use(super.m -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments: 0 allowed, 1 given.
+//     super.m(87);
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments: 0 allowed, 1 given.
+//     use(super.m(87));
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments: 0 allowed, 1 given.
+//     super.n(87);
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments: 0 allowed, 1 given.
+//     use(super.n(87));
+//               ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -313,125 +549,6 @@
                 ^");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
-Try removing '+'.
-    +super;
-    ^", "pkg/front_end/testcases/rasta/super.dart:43:5: Error: Getter not found: ''.
-    +super;
-    ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
-Try removing '+'.
-    use(+super);
-        ^", "pkg/front_end/testcases/rasta/super.dart:44:9: Error: Getter not found: ''.
-    use(+super);
-        ^", "pkg/front_end/testcases/rasta/super.dart:62:11: Error: Superclass has no getter named 'g'.
-    super.g;
-          ^", "pkg/front_end/testcases/rasta/super.dart:63:15: Error: Superclass has no getter named 'g'.
-    use(super.g);
-              ^", "pkg/front_end/testcases/rasta/super.dart:83:11: Error: Superclass has no setter named 'e'.
-    super.e++;
-          ^", "pkg/front_end/testcases/rasta/super.dart:84:15: Error: Superclass has no setter named 'e'.
-    use(super.e++);
-              ^", "pkg/front_end/testcases/rasta/super.dart:85:11: Error: Superclass has no setter named 'f'.
-    super.f++;
-          ^", "pkg/front_end/testcases/rasta/super.dart:86:15: Error: Superclass has no setter named 'f'.
-    use(super.f++);
-              ^", "pkg/front_end/testcases/rasta/super.dart:87:11: Error: Superclass has no getter named 'g'.
-    super.g++;
-          ^", "pkg/front_end/testcases/rasta/super.dart:88:15: Error: Superclass has no getter named 'g'.
-    use(super.g++);
-              ^", "pkg/front_end/testcases/rasta/super.dart:95:11: Error: Superclass has no setter named 'm'.
-    super.m++;
-          ^", "pkg/front_end/testcases/rasta/super.dart:96:15: Error: Superclass has no setter named 'm'.
-    use(super.m++);
-              ^", "pkg/front_end/testcases/rasta/super.dart:108:13: Error: Superclass has no setter named 'e'.
-    ++super.e;
-            ^", "pkg/front_end/testcases/rasta/super.dart:109:17: Error: Superclass has no setter named 'e'.
-    use(++super.e);
-                ^", "pkg/front_end/testcases/rasta/super.dart:110:13: Error: Superclass has no setter named 'f'.
-    ++super.f;
-            ^", "pkg/front_end/testcases/rasta/super.dart:111:17: Error: Superclass has no setter named 'f'.
-    use(++super.f);
-                ^", "pkg/front_end/testcases/rasta/super.dart:112:13: Error: Superclass has no getter named 'g'.
-    ++super.g;
-            ^", "pkg/front_end/testcases/rasta/super.dart:113:17: Error: Superclass has no getter named 'g'.
-    use(++super.g);
-                ^", "pkg/front_end/testcases/rasta/super.dart:120:13: Error: Superclass has no setter named 'm'.
-    ++super.m;
-            ^", "pkg/front_end/testcases/rasta/super.dart:121:17: Error: Superclass has no setter named 'm'.
-    use(++super.m);
-                ^", "pkg/front_end/testcases/rasta/super.dart:137:11: Error: Superclass has no method named 'g'.
-    super.g();
-          ^", "pkg/front_end/testcases/rasta/super.dart:138:15: Error: Superclass has no method named 'g'.
-    use(super.g());
-              ^", "pkg/front_end/testcases/rasta/super.dart:160:11: Error: Superclass has no setter named 'e'.
-    super.e = 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:161:15: Error: Superclass has no setter named 'e'.
-    use(super.e = 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:162:11: Error: Superclass has no setter named 'f'.
-    super.f = 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:163:15: Error: Superclass has no setter named 'f'.
-    use(super.f = 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:172:11: Error: Superclass has no setter named 'm'.
-    super.m = 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:173:15: Error: Superclass has no setter named 'm'.
-    use(super.m = 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:185:11: Error: Superclass has no setter named 'e'.
-    super.e ??= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:186:15: Error: Superclass has no setter named 'e'.
-    use(super.e ??= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:187:11: Error: Superclass has no setter named 'f'.
-    super.f ??= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:188:15: Error: Superclass has no setter named 'f'.
-    use(super.f ??= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:189:11: Error: Superclass has no getter named 'g'.
-    super.g ??= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:190:15: Error: Superclass has no getter named 'g'.
-    use(super.g ??= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:197:11: Error: Superclass has no setter named 'm'.
-    super.m ??= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:198:15: Error: Superclass has no setter named 'm'.
-    use(super.m ??= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:210:11: Error: Superclass has no setter named 'e'.
-    super.e += 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:211:15: Error: Superclass has no setter named 'e'.
-    use(super.e += 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:212:11: Error: Superclass has no setter named 'f'.
-    super.f += 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:213:15: Error: Superclass has no setter named 'f'.
-    use(super.f += 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:214:11: Error: Superclass has no getter named 'g'.
-    super.g += 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:215:15: Error: Superclass has no getter named 'g'.
-    use(super.g += 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:222:11: Error: Superclass has no setter named 'm'.
-    super.m += 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:223:15: Error: Superclass has no setter named 'm'.
-    use(super.m += 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:235:11: Error: Superclass has no setter named 'e'.
-    super.e -= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:236:15: Error: Superclass has no setter named 'e'.
-    use(super.e -= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:237:11: Error: Superclass has no setter named 'f'.
-    super.f -= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:238:15: Error: Superclass has no setter named 'f'.
-    use(super.f -= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:239:11: Error: Superclass has no getter named 'g'.
-    super.g -= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:240:15: Error: Superclass has no getter named 'g'.
-    use(super.g -= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:247:11: Error: Superclass has no setter named 'm'.
-    super.m -= 42;
-          ^", "pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
-    use(super.m -= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments: 0 allowed, 1 given.
-    super.m(87);
-          ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments: 0 allowed, 1 given.
-    use(super.m(87));
-              ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments: 0 allowed, 1 given.
-    super.n(87);
-          ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments: 0 allowed, 1 given.
-    use(super.n(87));
-              ^"]/* from null */;
 static method use(dynamic x) → dynamic {
   if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
     throw "Shouldn't happen";
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 5cbd7ca..1cd4858 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -36,9 +42,6 @@
     : super self::Super::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
-  foo() => super.foo() + f();
-                 ^^^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::C::•<dynamic>().{mix::Mixin::foo}());
   core::print(new self::C2::•<dynamic>().{mix::Mixin::foo}());
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 ed6b3f9..d5f0745 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -35,11 +45,6 @@
     }
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
-    for (1 in x) {
-         ^", "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
-  for (1 in arguments) {
-       ^"]/* from null */;
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
   for (final dynamic #t6 in arguments) {
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 ed6b3f9..d5f0745 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -35,11 +45,6 @@
     }
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
-    for (1 in x) {
-         ^", "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
-  for (1 in arguments) {
-       ^"]/* from null */;
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
   for (final dynamic #t6 in arguments) {
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 eb883bc..6ec2d0c 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
@@ -5,8 +5,8 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → void
-    : 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: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
-Try changing the type of the left hand side, or casting the right hand side to '#lib1::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)
     ;
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 eb883bc..6ec2d0c 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
@@ -5,8 +5,8 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → void
-    : 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: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::Foo::T'.
-Try changing the type of the left hand side, or casting the right hand side to '#lib1::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)
     ;
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 610a217..12a281f 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
   constructor empty() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>() → 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, W extends core::Object> extends self::A<self::B::U> {
+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
     : super self::A::empty()
     ;
-  static factory •<U extends core::Object, W extends core::Object>() → 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, S extends core::Object, R extends core::Object> extends self::B<self::C::V, self::C::S> {
+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
     : super self::B::empty()
     ;
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
new file mode 100644
index 0000000..12a281f
--- /dev/null
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class A<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → void
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  constructor empty() → void
+    : 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
+    : super self::B::empty()
+    ;
+  method toString() → dynamic
+    return "${self::C::V},${self::C::S},${self::C::R}";
+}
+static method main() → dynamic {
+  exp::Expect::equals("${new self::C::•<core::int, core::num, core::String>()}", "int,num,String");
+}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect
index bf12ef7..24e8590 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-class A<T extends core::Object> extends core::Object {
+class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
   constructor empty() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>() → 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, W extends core::Object> extends self::A<self::B::U> {
+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
     : super self::A::empty()
     ;
-  static factory •<U extends core::Object, W extends core::Object>() → 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, S extends core::Object, R extends core::Object> extends self::B<self::C::V, self::C::S> {
+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
     : super self::B::empty()
     ;
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
new file mode 100644
index 0000000..2f29db1
--- /dev/null
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class A<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → void
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
+    let <U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W> #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  constructor empty() → void
+    : 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
+    : super self::B::empty()
+    ;
+  method toString() → core::String
+    return "${self::C::V},${self::C::S},${self::C::R}";
+}
+static method main() → dynamic {
+  exp::Expect::equals("${new self::C::•<core::int, core::num, core::String>()}", "int,num,String");
+}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect
index 4c2bb71..d706b30 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
   constructor empty() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>() → 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, W extends core::Object> extends self::A<self::B::U> {
+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
     : super self::A::empty()
     ;
-  static factory •<U extends core::Object, W extends core::Object>() → 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, S extends core::Object, R extends core::Object> extends self::B<self::C::V, self::C::S> {
+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
     : super self::B::empty()
     ;
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
new file mode 100644
index 0000000..d706b30
--- /dev/null
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+abstract class A<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → void
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  constructor empty() → void
+    : 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
+    : super self::B::empty()
+    ;
+  method toString() → dynamic
+    return "${self::C::V},${self::C::S},${self::C::R}";
+}
+static method main() → dynamic {
+  exp::Expect::equals("${new self::C::•<core::int, core::List<core::int>, core::Map<core::int, core::List<core::int>>>()}", "int,List<int>,Map<int, List<int>>");
+}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.expect
index a08282c..2305393 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
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 import "package:expect/expect.dart" as exp;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::•];
   constructor empty() → void
     : super core::Object::•()
     ;
-  static factory •<T extends core::Object>() → 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, W extends core::Object> extends self::A<self::B::U> {
+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
     : super self::A::empty()
     ;
-  static factory •<U extends core::Object, W extends core::Object>() → 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, S extends core::Object, R extends core::Object> extends self::B<self::C::V, self::C::S> {
+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
     : super self::B::empty()
     ;
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
new file mode 100644
index 0000000..48ff701
--- /dev/null
+++ b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+abstract class A<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → void
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
+    let <U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W> #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  constructor empty() → void
+    : 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
+    : super self::B::empty()
+    ;
+  method toString() → core::String
+    return "${self::C::V},${self::C::S},${self::C::R}";
+}
+static method main() → dynamic {
+  exp::Expect::equals("${new self::C::•<core::int, core::List<core::int>, core::Map<core::int, core::List<core::int>>>()}", "int,List<int>,Map<int, List<int>>");
+}
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
index d6d0df8..52e72a3 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
-  [f() {}];
-   ^"]/* from null */;
 static method main() → dynamic {
   <dynamic>[let final () → dynamic f = () → dynamic {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
index d6d0df8..52e72a3 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
-  [f() {}];
-   ^"]/* from null */;
 static method main() → dynamic {
   <dynamic>[let final () → dynamic f = () → dynamic {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
index 8a2672b..adc4090 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
-  [f() {}];
-   ^"]/* from null */;
 static method main() → dynamic {
   <() → core::Null>[let final () → core::Null f = () → core::Null {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
index 8a2672b..adc4090 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
-  [f() {}];
-   ^"]/* from null */;
 static method main() → dynamic {
   <() → core::Null>[let final () → core::Null f = () → core::Null {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
index 54e7b47..f07748e 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
+//   a.b c = null;
+//   ^^^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
-  a.b c = null;
-  ^^^"]/* from null */;
 static method main() → dynamic {
   core::String a = "";
   invalid-type c = null;
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
index 54e7b47..f07748e 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
+//   a.b c = null;
+//   ^^^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
-  a.b c = null;
-  ^^^"]/* from null */;
 static method main() → dynamic {
   core::String a = "";
   invalid-type c = null;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
index 16847ca..63a61b7 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
-Try adding {}.
-f() =
-    ^", "pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
-h() => null;
-^"]/* from null */;
 static method main() → dynamic {}
 static method f() → dynamic
   return let final () → dynamic h = () → dynamic => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
index 16847ca..63a61b7 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
-Try adding {}.
-f() =
-    ^", "pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
-h() => null;
-^"]/* from null */;
 static method main() → dynamic {}
 static method f() → dynamic
   return let final () → dynamic h = () → dynamic => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
index 4087b61..ec26782 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
-Try adding {}.
-f() =
-    ^", "pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
-h() => null;
-^"]/* from null */;
 static method main() → dynamic {}
 static method f() → dynamic
   return let final () → core::Null h = () → core::Null => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
index 4087b61..ec26782 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
-Try adding {}.
-f() =
-    ^", "pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
-h() => null;
-^"]/* from null */;
 static method main() → dynamic {}
 static method f() → dynamic
   return let final () → core::Null h = () → core::Null => null in h;
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 8c99e27..be4cec3 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
-  var C;
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 8c99e27..be4cec3 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
-  var C;
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 8c99e27..be4cec3 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
-  var C;
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 8c99e27..be4cec3 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+//   var C;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
-  var C;
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
index dd9f49e..aecaa47 100644
--- a/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.strong.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
+//   s.bool x = null;
+//   ^^^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
-  s.bool x = null;
-  ^^^^^^"]/* from null */;
 static method main() → dynamic {
   invalid-type x = null;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect
index dd9f49e..aecaa47 100644
--- a/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.strong.transformed.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
+//   s.bool x = null;
+//   ^^^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
-  s.bool x = null;
-  ^^^^^^"]/* from null */;
 static method main() → dynamic {
   invalid-type x = null;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
index 06e7304..55032f9 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
@@ -1,7 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.
+// typedef void F();
+//              ^
+
 library;
 import self as self;
 
 typedef F = () → void;
 typedef F = () → void;
-const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.\ntypedef void F();\n             ^"]/* from null */;
 static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
index 06e7304..55032f9 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
@@ -1,7 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.
+// typedef void F();
+//              ^
+
 library;
 import self as self;
 
 typedef F = () → void;
 typedef F = () → void;
-const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.\ntypedef void F();\n             ^"]/* from null */;
 static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
index 3c4327b..7bb3ead 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
@@ -1,21 +1,38 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
+// }
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character '\u0233' (U+00E9) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-    \"x\${x*\"'\"\u0233'}x
-             ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
-    \"x\${x*\"'\"\u0233'}x
-              ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '\${'.
-    \"x\${x*\"'\"\u0233'}x
-      ^", "pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with \" must end with \".", "pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.", "pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
-    \"x\${x*\"'\"\u0233'}x
-             ^", "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
-  )
-  ^", "pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
-}
-^"]/* from 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${(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
index 3c4327b..7bb3ead 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
@@ -1,21 +1,38 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
+// }
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character '\u0233' (U+00E9) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-    \"x\${x*\"'\"\u0233'}x
-             ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
-    \"x\${x*\"'\"\u0233'}x
-              ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '\${'.
-    \"x\${x*\"'\"\u0233'}x
-      ^", "pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with \" must end with \".", "pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.", "pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
-    \"x\${x*\"'\"\u0233'}x
-             ^", "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
-  )
-  ^", "pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
-}
-^"]/* from 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${(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
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 75e88e2..1e14bbe 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.strong.expect
@@ -1,25 +1,46 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with " must end with ".
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:9: Error: Getter not found: 'x'.
+//     "x${x*"'"é'}x
+//         ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:6:3: Error: Method not found: 'f'.
+//   f(
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
+// }
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: The non-ASCII character '\u0233' (U+00E9) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-    \"x\${x*\"'\"\u0233'}x
-             ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:15: Error: String starting with ' must end with '.
-    \"x\${x*\"'\"\u0233'}x
-              ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:7: Error: Can't find '}' to match '\${'.
-    \"x\${x*\"'\"\u0233'}x
-      ^", "pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: String starting with \" must end with \".", "pkg/front_end/testcases/regress/issue_29976.dart:10:1: Error: Expected a declaration, but got ''.", "pkg/front_end/testcases/regress/issue_29976.dart:7:9: Error: Getter not found: 'x'.
-    \"x\${x*\"'\"\u0233'}x
-        ^", "pkg/front_end/testcases/regress/issue_29976.dart:7:14: Error: Expected '}' before this.
-    \"x\${x*\"'\"\u0233'}x
-             ^", "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Expected a String, but got ')'.
-  )
-  ^", "pkg/front_end/testcases/regress/issue_29976.dart:6:3: Error: Method not found: 'f'.
-  f(
-  ^", "pkg/front_end/testcases/regress/issue_29976.dart:9:1: Error: Expected ';' before this.
-}
-^"]/* from 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${(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
index 3acc695..2e710dd 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
-  Invalid MIME type.
-import 'data:async';
-                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
index 3acc695..2e710dd 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
-  Invalid MIME type.
-import 'data:async';
-                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect
index 3acc695..2e710dd 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.strong.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
-  Invalid MIME type.
-import 'data:async';
-                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect
index 3acc695..2e710dd 100644
--- a/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.strong.transformed.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
-  Invalid MIME type.
-import 'data:async';
-                  ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
index cb1a576..e7d6daa 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
-  foo(null, f() {});
-            ^"]/* from null */;
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
index cb1a576..e7d6daa 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
-  foo(null, f() {});
-            ^"]/* from null */;
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
index 88d3285..8056564 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
-  foo(null, f() {});
-            ^"]/* from null */;
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
index 88d3285..8056564 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
-  foo(null, f() {});
-            ^"]/* from null */;
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
index 4a66e4c..c6c9753 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
-  (f() {})();
-   ^"]/* from null */;
 static method main() → dynamic {
   (let final () → dynamic f = () → dynamic {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
index 4a66e4c..c6c9753 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
-  (f() {})();
-   ^"]/* from null */;
 static method main() → dynamic {
   (let final () → dynamic f = () → dynamic {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
index b782e0e..14197c3 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
-  (f() {})();
-   ^"]/* from null */;
 static method main() → dynamic {
   (let final () → core::Null f = () → core::Null {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
index b782e0e..14197c3 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
@@ -1,10 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
-  (f() {})();
-   ^"]/* from null */;
 static method main() → dynamic {
   (let final () → core::Null f = () → core::Null {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
index d73d7b3..4a6574c 100644
--- a/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.strong.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
+//   x.y z;
+//   ^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
-  x.y z;
-  ^^^"]/* from null */;
 static method main() → dynamic {
   invalid-type z;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect
index d73d7b3..4a6574c 100644
--- a/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.strong.transformed.expect
@@ -1,9 +1,12 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
+//   x.y z;
+//   ^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
-  x.y z;
-  ^^^"]/* from null */;
 static method main() → dynamic {
   invalid-type z;
 }
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 5b58a21..080a6f0 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: 'C' expects 1 type arguments.
+//   C<String, String> field;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: 'C' expects 1 type arguments.
-  C<String, String> field;
-  ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::C::•<dynamic>());
 }
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 5b58a21..080a6f0 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: 'C' expects 1 type arguments.
+//   C<String, String> field;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: 'C' expects 1 type arguments.
-  C<String, String> field;
-  ^"]/* from null */;
 static method main() → dynamic {
   core::print(new self::C::•<dynamic>());
 }
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 f750a0b..324e30a 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
@@ -1,12 +1,17 @@
+// 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;
 
-static const field dynamic #errors = const <dynamic>["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;
-             ^^^^^"]/* from null */;
 static method f() → dynamic sync* {
   invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
   return missing;
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 7e6dc8d..688f612 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,12 +1,17 @@
+// 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;
 
-static const field dynamic #errors = const <dynamic>["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;
-             ^^^^^"]/* from null */;
 static method f() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
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 2f59826..689db8c 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -1,10 +1,13 @@
+// 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;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
-  for (int i = i;; false) {}
-               ^"]/* from null */;
 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) {}
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 609e28a..7db28e0 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,10 +1,13 @@
+// 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;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Getter not found: 'i'.
-  for (int i = i;; false) {}
-               ^"]/* from null */;
 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) {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
index f758e0f..4ef9968 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
+// }
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-  \u55357\u56603
-  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-}
-^"]/* from null */;
 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>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
index f758e0f..4ef9968 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
+// }
+// ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-  \u55357\u56603
-  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-}
-^"]/* from null */;
 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>{})));
 }
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 a54d2f6..9eae89d 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.strong.expect
@@ -1,15 +1,22 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before 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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-  \u55357\u56603
-  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-}
-^", "pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '\u55357\u56603'.
-  \u55357\u56603
-  ^^"]/* from null */;
 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>{})));
 }
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 a54d2f6..9eae89d 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
@@ -1,15 +1,22 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before 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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '\u55357\u56603' (U+1F51B) can't be used in identifiers, only in strings and comments.
-Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).
-  \u55357\u56603
-  ^", "pkg/front_end/testcases/regress/issue_29985.dart:7:1: Error: Expected ';' before this.
-}
-^", "pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Getter not found: '\u55357\u56603'.
-  \u55357\u56603
-  ^^"]/* from null */;
 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>{})));
 }
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
index e017490a..aa0c741 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
-Try adding {}.
-C(this.name);
-            ^", "pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
-Try removing 'this.'.
-C(this.name);
-  ^^^^"]/* from null */;
 static method main() → dynamic {}
 static abstract method C(dynamic name) → dynamic;
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
index e017490a..aa0c741 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
-Try adding {}.
-C(this.name);
-            ^", "pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
-Try removing 'this.'.
-C(this.name);
-  ^^^^"]/* from null */;
 static method main() → dynamic {}
 static abstract method C(dynamic name) → dynamic;
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect
index e017490a..aa0c741 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.strong.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
-Try adding {}.
-C(this.name);
-            ^", "pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
-Try removing 'this.'.
-C(this.name);
-  ^^^^"]/* from null */;
 static method main() → dynamic {}
 static abstract method C(dynamic name) → dynamic;
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect
index e017490a..aa0c741 100644
--- a/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.strong.transformed.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
-Try adding {}.
-C(this.name);
-            ^", "pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
-Try removing 'this.'.
-C(this.name);
-  ^^^^"]/* from null */;
 static method main() → dynamic {}
 static abstract method C(dynamic name) → dynamic;
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
index 51e6889..bd8fdba 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
-  Illegal scheme character.
-import \"dart_:core\";
-            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
index 51e6889..bd8fdba 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
-  Illegal scheme character.
-import \"dart_:core\";
-            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect
index 51e6889..bd8fdba 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.strong.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
-  Illegal scheme character.
-import \"dart_:core\";
-            ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect
index 51e6889..bd8fdba 100644
--- a/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.strong.transformed.expect
@@ -1,8 +1,11 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+
 library;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
-  Illegal scheme character.
-import \"dart_:core\";
-            ^"]/* from null */;
 static method main() → dynamic {}
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 e946ea8..37bfe50 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,9 +16,6 @@
     core::print("Actually, I'm a getter, not a constructor.");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
-  get A {
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::A::•();
 }
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 e946ea8..37bfe50 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,9 +16,6 @@
     core::print("Actually, I'm a getter, not a constructor.");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
-  get A {
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::A::•();
 }
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 e946ea8..37bfe50 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,9 +16,6 @@
     core::print("Actually, I'm a getter, not a constructor.");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
-  get A {
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::A::•();
 }
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 e946ea8..37bfe50 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+//   get A {
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,9 +16,6 @@
     core::print("Actually, I'm a getter, not a constructor.");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
-  get A {
-      ^"]/* from null */;
 static method main() → dynamic {
   new self::A::•();
 }
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
index a45c042..a31a78a 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
@@ -1,19 +1,34 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
 library lib;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
-part '\$foo';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
-part '\$foo/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
-part '\$for/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
-part '\${true}';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
-part 'the\${1}thing';
-         ^", "pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
-part 'part_\$foo\${'a'}.dart';
-           ^", "pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
-part 'part_\${'a'}_\$foo.dart';
-           ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
index a45c042..a31a78a 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
@@ -1,19 +1,34 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
 library lib;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
-part '\$foo';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
-part '\$foo/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
-part '\$for/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
-part '\${true}';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
-part 'the\${1}thing';
-         ^", "pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
-part 'part_\$foo\${'a'}.dart';
-           ^", "pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
-part 'part_\${'a'}_\$foo.dart';
-           ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect
index a45c042..a31a78a 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.strong.expect
@@ -1,19 +1,34 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
 library lib;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
-part '\$foo';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
-part '\$foo/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
-part '\$for/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
-part '\${true}';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
-part 'the\${1}thing';
-         ^", "pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
-part 'part_\$foo\${'a'}.dart';
-           ^", "pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
-part 'part_\${'a'}_\$foo.dart';
-           ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect
index a45c042..a31a78a 100644
--- a/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.strong.transformed.expect
@@ -1,19 +1,34 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+
 library lib;
 import self as self;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
-part '\$foo';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
-part '\$foo/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
-part '\$for/bar';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
-part '\${true}';
-      ^", "pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
-part 'the\${1}thing';
-         ^", "pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
-part 'part_\$foo\${'a'}.dart';
-           ^", "pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
-part 'part_\${'a'}_\$foo.dart';
-           ^"]/* from null */;
 static method main() → 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 cf914a5..226845f 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -1,3 +1,40 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
+//   var f = Map<A, B> {};
+//           ^^^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+//   var f = Map<A, B> {};
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
+//   var f = Map<A, B> {};
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -20,24 +57,4 @@
     ;
   operator >() → dynamic {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
-Try adding the keyword 'operator'.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
-  var f = Map<A, B> {};
-                      ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
-  var f = Map<A, B> {};
-          ^^^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
-Try adding a parameter list to the function declaration.
-  var f = Map<A, B> {};
-             ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
-  var f = Map<A, B> {};
-             ^"]/* from null */;
 static method main() → void {}
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 cf914a5..226845f 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
@@ -1,3 +1,40 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
+//   var f = Map<A, B> {};
+//           ^^^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+//   var f = Map<A, B> {};
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
+//   var f = Map<A, B> {};
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -20,24 +57,4 @@
     ;
   operator >() → dynamic {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
-Try adding the keyword 'operator'.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
-  var f = Map<A, B> {};
-                      ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
-  var f = Map<A, B> {};
-          ^^^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
-Try adding a parameter list to the function declaration.
-  var f = Map<A, B> {};
-             ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
-  var f = Map<A, B> {};
-             ^"]/* from null */;
 static method main() → void {}
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 da8a488..f4bc906 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -1,3 +1,40 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
+//   var f = Map<A, B> {};
+//           ^^^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+//   var f = Map<A, B> {};
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
+//   var f = Map<A, B> {};
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -23,24 +60,4 @@
     ;
   operator >() → dynamic {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
-Try adding the keyword 'operator'.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
-  var f = Map<A, B> {};
-                      ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
-  var f = Map<A, B> {};
-          ^^^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
-Try adding a parameter list to the function declaration.
-  var f = Map<A, B> {};
-             ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
-  var f = Map<A, B> {};
-             ^"]/* from null */;
 static method main() → void {}
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 f332e29..c20c97e 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
@@ -1,3 +1,40 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+//   var f = Map<A, B> {};
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+//   var f = Map<A, B> {};
+//                       ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
+//   var f = Map<A, B> {};
+//           ^^^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+//   var f = Map<A, B> {};
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
+//   var f = Map<A, B> {};
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -23,24 +60,4 @@
     ;
   operator >() → dynamic {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
-Try adding the keyword 'operator'.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
-  var f = Map<A, B> {};
-                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
-  var f = Map<A, B> {};
-                      ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A function expression can't have a name.
-  var f = Map<A, B> {};
-          ^^^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: A function declaration needs an explicit list of parameters.
-Try adding a parameter list to the function declaration.
-  var f = Map<A, B> {};
-             ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: Expected a function body, but got '<'.
-  var f = Map<A, B> {};
-             ^"]/* from null */;
 static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
index fa8d68a..fbeb2bc 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
@@ -1,14 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T = 
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 typedef T = dynamic;
 typedef F = () → core::Map<core::String, dynamic>;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-typedef T = 
-          ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
index fa8d68a..fbeb2bc 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
@@ -1,14 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T = 
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 typedef T = dynamic;
 typedef F = () → core::Map<core::String, dynamic>;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-typedef T = 
-          ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
index fa8d68a..fbeb2bc 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -1,14 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T = 
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 typedef T = dynamic;
 typedef F = () → core::Map<core::String, dynamic>;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-typedef T = 
-          ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
index fa8d68a..fbeb2bc 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -1,14 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T = 
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 typedef T = dynamic;
 typedef F = () → core::Map<core::String, dynamic>;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
-typedef F = Map<String, dynamic> Function();
-^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-typedef T = 
-          ^"]/* from null */;
 static method main() → 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 af19179..c09214e 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
@@ -1,3 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,12 +20,6 @@
   operator unary-() → dynamic
     return 0;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
-  operator unary- => 0;
-           ^^^^^", "pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  operator unary- => 0;
-                ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 af19179..c09214e 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
@@ -1,3 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,12 +20,6 @@
   operator unary-() → dynamic
     return 0;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
-  operator unary- => 0;
-           ^^^^^", "pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  operator unary- => 0;
-                ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 af19179..c09214e 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
@@ -1,3 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,12 +20,6 @@
   operator unary-() → dynamic
     return 0;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
-  operator unary- => 0;
-           ^^^^^", "pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  operator unary- => 0;
-                ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 af19179..c09214e 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
@@ -1,3 +1,14 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,12 +20,6 @@
   operator unary-() → dynamic
     return 0;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
-  operator unary- => 0;
-           ^^^^^", "pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
-Try adding a parameter list to the method declaration.
-  operator unary- => 0;
-                ^"]/* from null */;
 static method main() → dynamic {
   new self::C::•();
 }
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 4796ca3..8d617e0 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before 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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before 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++) {}
-                    ^"]/* from null */;
 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++) {}
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 4796ca3..8d617e0 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
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before 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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before 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++) {}
-                    ^"]/* from null */;
 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++) {}
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 63579fd..0485037 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -1,14 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before 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++) {}
+//                     ^
+//
+// 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;
 import "dart:core" as core;
 
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected ';' before 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++) {}
-                    ^", "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Getter not found: ''.
-  for (int i = 0, i > 10; i++) {}
-                    ^"]/* from null */;
 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++) {}
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
index bf6678e..3b34000 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+//   return i ++ (i);
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+//   return (i) ++ (i);
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 static field core::int i = 5;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
-  return i ++ (i);
-              ^", "pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
-  return (i) ++ (i);
-                ^"]/* from null */;
 static method test1() → core::int {
   return let final dynamic #t1 = self::i in let final dynamic #t2 = self::i = #t1.+(1) in #t1;
   self::i;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
index bf6678e..3b34000 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+//   return i ++ (i);
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+//   return (i) ++ (i);
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 static field core::int i = 5;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
-  return i ++ (i);
-              ^", "pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
-  return (i) ++ (i);
-                ^"]/* from null */;
 static method test1() → core::int {
   return let final dynamic #t1 = self::i in let final dynamic #t2 = self::i = #t1.+(1) in #t1;
   self::i;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
index a6e3919..96522f4 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+//   return i ++ (i);
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+//   return (i) ++ (i);
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 static field core::int i = 5;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
-  return i ++ (i);
-              ^", "pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
-  return (i) ++ (i);
-                ^"]/* from null */;
 static method test1() → core::int {
   return let final core::int #t1 = self::i in let final core::int #t2 = self::i = #t1.{core::num::+}(1) in #t1;
   self::i;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
index 719e1e1..a48a597 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
@@ -1,13 +1,18 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
+//   return i ++ (i);
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
+//   return (i) ++ (i);
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 static field core::int i = 5;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31185.dart:8:15: Error: Expected ';' before this.
-  return i ++ (i);
-              ^", "pkg/front_end/testcases/regress/issue_31185.dart:12:17: Error: Expected ';' before this.
-  return (i) ++ (i);
-                ^"]/* from null */;
 static method test1() → core::int {
   return let final core::int #t1 = self::i in let final core::int #t2 = self::i = #t1.{core::num::+}(1) in #t1;
   self::i;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
index c7b38c9..404127d 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 static field invalid-type B;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
-type T = Map<A, B>
-                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-type T = Map<A, B>
-                 ^"]/* from null */;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
index c7b38c9..404127d 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
@@ -1,12 +1,17 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 static field invalid-type B;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
-type T = Map<A, B>
-                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-type T = Map<A, B>
-                 ^"]/* from null */;
 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 86d47c4..51447393 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -1,3 +1,25 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+// type T = Map<A, B>
+// ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+// type T = Map<A, B>
+// ^^^^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+// type T = Map<A, B>
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,15 +29,4 @@
 type T = Map<A, B>
             ^";
 static field invalid-type B;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
-type T = Map<A, B>
-                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-type T = Map<A, B>
-                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
-type T = Map<A, B>
-^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
-type T = Map<A, B>
-^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
-type T = Map<A, B>
-             ^"]/* from null */;
 static method main() → dynamic {}
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 10e28a1..c128307 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
@@ -1,3 +1,25 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+// type T = Map<A, B>
+// ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+// type T = Map<A, B>
+// ^^^^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+// type T = Map<A, B>
+//              ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,15 +29,4 @@
 type T = Map<A, B>
             ^";
 static field invalid-type B;
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
-type T = Map<A, B>
-                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-type T = Map<A, B>
-                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
-type T = Map<A, B>
-^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
-type T = Map<A, B>
-^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
-type T = Map<A, B>
-             ^"]/* from null */;
 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 9fbedf8..64fefaf 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
@@ -1,3 +1,16 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.
+//   T<U> v;
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: 'T' expects 0 type arguments.
+//   T<U> v;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,10 +21,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
-Try removing the type arguments.", "pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.
-  T<U> v;
-    ^", "pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: 'T' expects 0 type arguments.
-  T<U> v;
-  ^"]/* from null */;
 static method main() → dynamic {}
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 9fbedf8..64fefaf 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
@@ -1,3 +1,16 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.
+//   T<U> v;
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: 'T' expects 0 type arguments.
+//   T<U> v;
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,10 +21,4 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31190.dart:1: Error: Can't use type arguments with type variable 'T'.
-Try removing the type arguments.", "pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.
-  T<U> v;
-    ^", "pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: 'T' expects 0 type arguments.
-  T<U> v;
-  ^"]/* from null */;
 static method main() → dynamic {}
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 29c3f87..94c1472 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,8 +16,4 @@
   Increment() : x++ {}
                 ^" {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
-To initialize a field, use the syntax 'name = value'.
-  Increment() : x++ {}
-                ^"]/* from null */;
 static method main() → dynamic {}
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 29c3f87..94c1472 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,8 +16,4 @@
   Increment() : x++ {}
                 ^" {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
-To initialize a field, use the syntax 'name = value'.
-  Increment() : x++ {}
-                ^"]/* from null */;
 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 29c3f87..94c1472 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,8 +16,4 @@
   Increment() : x++ {}
                 ^" {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
-To initialize a field, use the syntax 'name = value'.
-  Increment() : x++ {}
-                ^"]/* from null */;
 static method main() → dynamic {}
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 29c3f87..94c1472 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
@@ -1,3 +1,10 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -9,8 +16,4 @@
   Increment() : x++ {}
                 ^" {}
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
-To initialize a field, use the syntax 'name = value'.
-  Increment() : x++ {}
-                ^"]/* from null */;
 static method main() → dynamic {}
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 be6f8dc..2af900e 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
+//   A.foo() : m = 2;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
+//   int foo(int a, int b) => a + b * m;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -13,11 +23,6 @@
   method foo(core::int a, core::int b) → core::int
     return a.+(b.*(this.{self::A::m}));
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
-  A.foo() : m = 2;
-  ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
-  int foo(int a, int b) => a + b * m;
-      ^"]/* from null */;
 static method test() → dynamic {
   new self::A::•().foo();
   new self::A::•().foo(1, 2);
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 be6f8dc..2af900e 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
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
+//   A.foo() : m = 2;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
+//   int foo(int a, int b) => a + b * m;
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -13,11 +23,6 @@
   method foo(core::int a, core::int b) → core::int
     return a.+(b.*(this.{self::A::m}));
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
-  A.foo() : m = 2;
-  ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
-  int foo(int a, int b) => a + b * m;
-      ^"]/* from null */;
 static method test() → dynamic {
   new self::A::•().foo();
   new self::A::•().foo(1, 2);
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 1c01a1f..8a7471d 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -1,3 +1,21 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
+//   A.foo() : m = 2;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
+//   int foo(int a, int b) => a + b * m;
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments: 0 allowed, 2 given.
+//   new A.foo(1, 2);
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments: 2 required, 0 given.
+//   new A().foo();
+//           ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -13,15 +31,6 @@
   method foo(core::int a, core::int b) → core::int
     return a.{core::num::+}(b.{core::num::*}(this.{self::A::m}));
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Conflicts with member 'foo'.
-  A.foo() : m = 2;
-  ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
-  int foo(int a, int b) => a + b * m;
-      ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments: 0 allowed, 2 given.
-  new A.foo(1, 2);
-      ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments: 2 required, 0 given.
-  new A().foo();
-          ^"]/* from null */;
 static method test() → dynamic {
   new self::A::•().{self::A::foo}();
   new self::A::•().{self::A::foo}(1, 2);
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 d4cce8e..4253658 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
+//   self.Foo self;
+//   ^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
-  self.Foo self;
-  ^^^^^^^^"]/* from null */;
 static method main() → dynamic {
   self::Foo instance = new self::Foo::•();
   instance.{self::Foo::self} = instance;
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 d4cce8e..4253658 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
+//   self.Foo self;
+//   ^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -8,9 +14,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
-  self.Foo self;
-  ^^^^^^^^"]/* from null */;
 static method main() → dynamic {
   self::Foo instance = new self::Foo::•();
   instance.{self::Foo::self} = instance;
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 71970d1..d598469 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
@@ -1,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:8:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   var x = new ExistingClass.nonExistingConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:9:11: Error: Method not found: 'NonExistingClass'.
+//   x = new NonExistingClass();
+//           ^^^^^^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,11 +17,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_33452.dart:8:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-  var x = new ExistingClass.nonExistingConstructor();
-                            ^^^^^^^^^^^^^^^^^^^^^^", "pkg/front_end/testcases/regress/issue_33452.dart:9:11: Error: Method not found: 'NonExistingClass'.
-  x = new NonExistingClass();
-          ^^^^^^^^^^^^^^^^"]/* from null */;
 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(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
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 71970d1..d598469 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,3 +1,13 @@
+// Errors:
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:8:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   var x = new ExistingClass.nonExistingConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:9:11: Error: Method not found: 'NonExistingClass'.
+//   x = new NonExistingClass();
+//           ^^^^^^^^^^^^^^^^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -7,11 +17,6 @@
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_33452.dart:8:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
-  var x = new ExistingClass.nonExistingConstructor();
-                            ^^^^^^^^^^^^^^^^^^^^^^", "pkg/front_end/testcases/regress/issue_33452.dart:9:11: Error: Method not found: 'NonExistingClass'.
-  x = new NonExistingClass();
-          ^^^^^^^^^^^^^^^^"]/* from null */;
 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(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
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 3300422..5f06fd8 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
@@ -8,8 +8,8 @@
     ;
   method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.
+    this.{self::C::f}<self::C::g1::U>(let dynamic _ = null in let final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'test::C::g1::U'.
+Try changing the type of the parameter, or casting the argument to 'test::C::g1::U'.
     this.f<U>(1.5);
               ^" in let final dynamic #t2 = 1.5 in null);
   }
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 1de3ac1..57f48fc 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
@@ -8,8 +8,8 @@
     ;
   method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::C::g1::U'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::C::g1::U'.
+    this.{self::C::f}<self::C::g1::U>(let<BottomType> _ = null in let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'test::C::g1::U'.
+Try changing the type of the parameter, or casting the argument to 'test::C::g1::U'.
     this.f<U>(1.5);
               ^" in let final core::double #t2 = 1.5 in null);
   }
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 6c44f09..4c3a11f 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -57,8 +57,6 @@
 redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
 redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
 redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirection_chain_type_arguments: Fail # Issue 32130
-redirection_chain_type_arguments_subst: Fail # Issue 32130
 statements: Fail
 stringliteral: Fail
 super_rasta_copy: TypeCheckError
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index cc2cd34..b5aeddb 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -1,3 +1,213 @@
+// Errors:
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:60:11: Error: Superclass has no getter named 'g'.
+//     super.g;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:61:15: Error: Superclass has no getter named 'g'.
+//     use(super.g);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:79:11: Error: Superclass has no setter named 'e'.
+//     super.e++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:80:15: Error: Superclass has no setter named 'e'.
+//     use(super.e++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:81:11: Error: Superclass has no setter named 'f'.
+//     super.f++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:82:15: Error: Superclass has no setter named 'f'.
+//     use(super.f++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:83:11: Error: Superclass has no getter named 'g'.
+//     super.g++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:84:15: Error: Superclass has no getter named 'g'.
+//     use(super.g++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:91:11: Error: Superclass has no setter named 'm'.
+//     super.m++;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:92:15: Error: Superclass has no setter named 'm'.
+//     use(super.m++);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:102:13: Error: Superclass has no setter named 'e'.
+//     ++super.e;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:103:17: Error: Superclass has no setter named 'e'.
+//     use(++super.e);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:104:13: Error: Superclass has no setter named 'f'.
+//     ++super.f;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:105:17: Error: Superclass has no setter named 'f'.
+//     use(++super.f);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:106:13: Error: Superclass has no getter named 'g'.
+//     ++super.g;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:107:17: Error: Superclass has no getter named 'g'.
+//     use(++super.g);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:114:13: Error: Superclass has no setter named 'm'.
+//     ++super.m;
+//             ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:115:17: Error: Superclass has no setter named 'm'.
+//     use(++super.m);
+//                 ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:129:11: Error: Superclass has no method named 'g'.
+//     super.g();
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:130:15: Error: Superclass has no method named 'g'.
+//     use(super.g());
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:150:11: Error: Superclass has no setter named 'e'.
+//     super.e = 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:151:15: Error: Superclass has no setter named 'e'.
+//     use(super.e = 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:152:11: Error: Superclass has no setter named 'f'.
+//     super.f = 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:153:15: Error: Superclass has no setter named 'f'.
+//     use(super.f = 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:162:11: Error: Superclass has no setter named 'm'.
+//     super.m = 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:163:15: Error: Superclass has no setter named 'm'.
+//     use(super.m = 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:173:11: Error: Superclass has no setter named 'e'.
+//     super.e ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:174:15: Error: Superclass has no setter named 'e'.
+//     use(super.e ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:175:11: Error: Superclass has no setter named 'f'.
+//     super.f ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:176:15: Error: Superclass has no setter named 'f'.
+//     use(super.f ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:177:11: Error: Superclass has no getter named 'g'.
+//     super.g ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:178:15: Error: Superclass has no getter named 'g'.
+//     use(super.g ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:185:11: Error: Superclass has no setter named 'm'.
+//     super.m ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:186:15: Error: Superclass has no setter named 'm'.
+//     use(super.m ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:196:11: Error: Superclass has no setter named 'e'.
+//     super.e += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:197:15: Error: Superclass has no setter named 'e'.
+//     use(super.e += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:198:11: Error: Superclass has no setter named 'f'.
+//     super.f += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:199:15: Error: Superclass has no setter named 'f'.
+//     use(super.f += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:200:11: Error: Superclass has no getter named 'g'.
+//     super.g += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:201:15: Error: Superclass has no getter named 'g'.
+//     use(super.g += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:208:11: Error: Superclass has no setter named 'm'.
+//     super.m += 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:209:15: Error: Superclass has no setter named 'm'.
+//     use(super.m += 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:219:11: Error: Superclass has no setter named 'e'.
+//     super.e -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:220:15: Error: Superclass has no setter named 'e'.
+//     use(super.e -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:221:11: Error: Superclass has no setter named 'f'.
+//     super.f -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:222:15: Error: Superclass has no setter named 'f'.
+//     use(super.f -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:223:11: Error: Superclass has no getter named 'g'.
+//     super.g -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:224:15: Error: Superclass has no getter named 'g'.
+//     use(super.g -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:231:11: Error: Superclass has no setter named 'm'.
+//     super.m -= 42;
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.
+//     use(super.m -= 42);
+//               ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments: 0 allowed, 1 given.
+//     super.m(87);
+//           ^
+//
+// pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments: 0 allowed, 1 given.
+//     use(super.m(87));
+//               ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -257,111 +467,6 @@
                 ^");
   }
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/super_rasta_copy.dart:60:11: Error: Superclass has no getter named 'g'.
-    super.g;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:61:15: Error: Superclass has no getter named 'g'.
-    use(super.g);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:79:11: Error: Superclass has no setter named 'e'.
-    super.e++;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:80:15: Error: Superclass has no setter named 'e'.
-    use(super.e++);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:81:11: Error: Superclass has no setter named 'f'.
-    super.f++;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:82:15: Error: Superclass has no setter named 'f'.
-    use(super.f++);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:83:11: Error: Superclass has no getter named 'g'.
-    super.g++;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:84:15: Error: Superclass has no getter named 'g'.
-    use(super.g++);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:91:11: Error: Superclass has no setter named 'm'.
-    super.m++;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:92:15: Error: Superclass has no setter named 'm'.
-    use(super.m++);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:102:13: Error: Superclass has no setter named 'e'.
-    ++super.e;
-            ^", "pkg/front_end/testcases/super_rasta_copy.dart:103:17: Error: Superclass has no setter named 'e'.
-    use(++super.e);
-                ^", "pkg/front_end/testcases/super_rasta_copy.dart:104:13: Error: Superclass has no setter named 'f'.
-    ++super.f;
-            ^", "pkg/front_end/testcases/super_rasta_copy.dart:105:17: Error: Superclass has no setter named 'f'.
-    use(++super.f);
-                ^", "pkg/front_end/testcases/super_rasta_copy.dart:106:13: Error: Superclass has no getter named 'g'.
-    ++super.g;
-            ^", "pkg/front_end/testcases/super_rasta_copy.dart:107:17: Error: Superclass has no getter named 'g'.
-    use(++super.g);
-                ^", "pkg/front_end/testcases/super_rasta_copy.dart:114:13: Error: Superclass has no setter named 'm'.
-    ++super.m;
-            ^", "pkg/front_end/testcases/super_rasta_copy.dart:115:17: Error: Superclass has no setter named 'm'.
-    use(++super.m);
-                ^", "pkg/front_end/testcases/super_rasta_copy.dart:129:11: Error: Superclass has no method named 'g'.
-    super.g();
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:130:15: Error: Superclass has no method named 'g'.
-    use(super.g());
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:150:11: Error: Superclass has no setter named 'e'.
-    super.e = 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:151:15: Error: Superclass has no setter named 'e'.
-    use(super.e = 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:152:11: Error: Superclass has no setter named 'f'.
-    super.f = 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:153:15: Error: Superclass has no setter named 'f'.
-    use(super.f = 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:162:11: Error: Superclass has no setter named 'm'.
-    super.m = 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:163:15: Error: Superclass has no setter named 'm'.
-    use(super.m = 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:173:11: Error: Superclass has no setter named 'e'.
-    super.e ??= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:174:15: Error: Superclass has no setter named 'e'.
-    use(super.e ??= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:175:11: Error: Superclass has no setter named 'f'.
-    super.f ??= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:176:15: Error: Superclass has no setter named 'f'.
-    use(super.f ??= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:177:11: Error: Superclass has no getter named 'g'.
-    super.g ??= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:178:15: Error: Superclass has no getter named 'g'.
-    use(super.g ??= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:185:11: Error: Superclass has no setter named 'm'.
-    super.m ??= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:186:15: Error: Superclass has no setter named 'm'.
-    use(super.m ??= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:196:11: Error: Superclass has no setter named 'e'.
-    super.e += 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:197:15: Error: Superclass has no setter named 'e'.
-    use(super.e += 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:198:11: Error: Superclass has no setter named 'f'.
-    super.f += 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:199:15: Error: Superclass has no setter named 'f'.
-    use(super.f += 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:200:11: Error: Superclass has no getter named 'g'.
-    super.g += 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:201:15: Error: Superclass has no getter named 'g'.
-    use(super.g += 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:208:11: Error: Superclass has no setter named 'm'.
-    super.m += 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:209:15: Error: Superclass has no setter named 'm'.
-    use(super.m += 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:219:11: Error: Superclass has no setter named 'e'.
-    super.e -= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:220:15: Error: Superclass has no setter named 'e'.
-    use(super.e -= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:221:11: Error: Superclass has no setter named 'f'.
-    super.f -= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:222:15: Error: Superclass has no setter named 'f'.
-    use(super.f -= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:223:11: Error: Superclass has no getter named 'g'.
-    super.g -= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:224:15: Error: Superclass has no getter named 'g'.
-    use(super.g -= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:231:11: Error: Superclass has no setter named 'm'.
-    super.m -= 42;
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.
-    use(super.m -= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments: 0 allowed, 1 given.
-    super.m(87);
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments: 0 allowed, 1 given.
-    use(super.m(87));
-              ^"]/* from null */;
 static method use(dynamic x) → dynamic {
   if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
     throw "Shouldn't happen";
diff --git a/pkg/front_end/testcases/tabs.dart.strong.expect b/pkg/front_end/testcases/tabs.dart.strong.expect
index 83b1b86..e1519f3 100644
--- a/pkg/front_end/testcases/tabs.dart.strong.expect
+++ b/pkg/front_end/testcases/tabs.dart.strong.expect
@@ -1,18 +1,29 @@
+// 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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
-\tprint(one);
-\t      ^^^", "pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
-\t\tprint(two);
-\t\t      ^^^", "pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
-\t\t  print(three);
-\t\t        ^^^^^", "pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
-\t   \tprint(four);
-\t   \t      ^^^^", "pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
-\t   \t  print(five);
-\t   \t        ^^^^"]/* from null */;
 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>{}))));
diff --git a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
index 83b1b86..e1519f3 100644
--- a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
@@ -1,18 +1,29 @@
+// 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 const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
-\tprint(one);
-\t      ^^^", "pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
-\t\tprint(two);
-\t\t      ^^^", "pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
-\t\t  print(three);
-\t\t        ^^^^^", "pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
-\t   \tprint(four);
-\t   \t      ^^^^", "pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
-\t   \t  print(five);
-\t   \t        ^^^^"]/* from null */;
 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>{}))));
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect b/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
index 546ca24..770190e 100644
--- a/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
@@ -1,23 +1,36 @@
+// Errors:
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class A<T> extends T {}
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:7:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class B<T> extends T {
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
+// class C<T> extends T {}
+//       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object> extends core::Object {
+abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-abstract class B<T extends core::Object> extends core::Object {
+abstract class B<T extends core::Object = dynamic> extends core::Object {
   constructor •() → void
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object> extends core::Object {
+class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → void
     : super core::Object::•()
     ;
 }
-static const field dynamic #errors = const <dynamic>["Error: The type variable 'T' can't be used as supertype.", "Error: The type variable 'T' can't be used as supertype.", "Error: The type variable 'T' can't be used as supertype."]/* from null */;
 static method main() → dynamic {
   throw new core::AbstractClassInstantiationError::•("A");
   throw new core::AbstractClassInstantiationError::•("B");
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 fe1360b..6615790 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: Type 'T.String' not found.
+//   T.String method() => "Hello, World!";
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,9 +18,6 @@
   T.String method() => \"Hello, World!\";
                        ^" in let final dynamic #t2 = "Hello, World!" in null;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: Type 'T.String' not found.
-  T.String method() => \"Hello, World!\";
-  ^"]/* from null */;
 static method main() → dynamic {
   core::String s = let dynamic _ = null in let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
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 198bffd..6e7ca74 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
@@ -1,3 +1,9 @@
+// Errors:
+//
+// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: Type 'T.String' not found.
+//   T.String method() => "Hello, World!";
+//   ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -12,9 +18,6 @@
   T.String method() => \"Hello, World!\";
                        ^" in let final core::String #t2 = "Hello, World!" in null;
 }
-static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/type_variable_prefix.dart:8:3: Error: Type 'T.String' not found.
-  T.String method() => \"Hello, World!\";
-  ^"]/* from null */;
 static method main() → dynamic {
   core::String s = let<BottomType> _ = null in let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 5ae69a3..7e491f1 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -28,7 +28,8 @@
 
 Future<String> generateMessagesFile() async {
   Uri messagesFile = Platform.script.resolve("../../messages.yaml");
-  Map yaml = loadYaml(await new File.fromUri(messagesFile).readAsStringSync());
+  Map<dynamic, dynamic> yaml =
+      loadYaml(await new File.fromUri(messagesFile).readAsStringSync());
   StringBuffer sb = new StringBuffer();
 
   sb.writeln("""
@@ -50,7 +51,7 @@
     while (description is String) {
       description = yaml[description];
     }
-    Map map = description;
+    Map<dynamic, dynamic> map = description;
     if (map == null) {
       throw "No 'template:' in key $name.";
     }
diff --git a/pkg/kernel/bin/count_breakdown.dart b/pkg/kernel/bin/count_breakdown.dart
index b3dbc17..fe8353f 100755
--- a/pkg/kernel/bin/count_breakdown.dart
+++ b/pkg/kernel/bin/count_breakdown.dart
@@ -5,7 +5,7 @@
 
 import 'dart:io';
 import 'package:kernel/kernel.dart';
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
   print("Enumerates the different node types in the provided dill file");
diff --git a/pkg/kernel/bin/dump.dart b/pkg/kernel/bin/dump.dart
index fc69f95..3d76a9a 100755
--- a/pkg/kernel/bin/dump.dart
+++ b/pkg/kernel/bin/dump.dart
@@ -6,8 +6,7 @@
 import 'dart:io';
 
 import 'package:kernel/kernel.dart';
-
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
   print("Prints a dill file as a textual format.");
diff --git a/pkg/kernel/bin/eval.dart b/pkg/kernel/bin/eval.dart
index 491f726..0f9ce1a 100755
--- a/pkg/kernel/bin/eval.dart
+++ b/pkg/kernel/bin/eval.dart
@@ -7,8 +7,7 @@
 
 import 'package:kernel/kernel.dart';
 import 'package:kernel/interpreter/interpreter.dart';
-
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
   print("Interpreter for a dill file.");
diff --git a/pkg/kernel/bin/size_breakdown.dart b/pkg/kernel/bin/size_breakdown.dart
index c2608ed..b8a5386 100755
--- a/pkg/kernel/bin/size_breakdown.dart
+++ b/pkg/kernel/bin/size_breakdown.dart
@@ -7,8 +7,7 @@
 
 import 'package:kernel/kernel.dart';
 import 'package:kernel/binary/ast_from_binary.dart';
-
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
   print("Gives an overview of which parts of the dill file");
diff --git a/pkg/kernel/bin/split.dart b/pkg/kernel/bin/split.dart
index 8a4df58..9bacdfc 100755
--- a/pkg/kernel/bin/split.dart
+++ b/pkg/kernel/bin/split.dart
@@ -10,8 +10,7 @@
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/binary/limited_ast_to_binary.dart';
 import 'package:kernel/kernel.dart';
-
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
   print("Split a dill file into separate dill files (one library per file).");
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index ae16bda..9523e33 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -21,8 +21,7 @@
 // import 'package:kernel/verifier.dart';
 import 'package:kernel/transformations/coq.dart' as coq;
 import 'package:kernel/vm/constants_native_effects.dart';
-
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 ArgParser parser = new ArgParser()
   ..addOption('format',
diff --git a/pkg/kernel/bin/type_check.dart b/pkg/kernel/bin/type_check.dart
index e732ab6..24b78d3d 100755
--- a/pkg/kernel/bin/type_check.dart
+++ b/pkg/kernel/bin/type_check.dart
@@ -7,8 +7,7 @@
 
 import 'package:kernel/error_formatter.dart';
 import 'package:kernel/naive_type_checker.dart';
-
-import 'util.dart';
+import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
   print("Type checker that can be used to find strong mode");
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index eff9f14..ad5e3f1 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -131,7 +131,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 8;
+  UInt32 formatVersion = 9;
   Library[] libraries;
   UriSource sourceMap;
   List<CanonicalName> canonicalNames;
@@ -406,6 +406,7 @@
 type SuperInitializer extends Initializer {
   Byte tag = 9;
   Byte isSynthetic;
+  FileOffset fileOffset;
   ConstructorReference target;
   Arguments arguments;
 }
@@ -413,6 +414,7 @@
 type RedirectingInitializer extends Initializer {
   Byte tag = 10;
   Byte isSynthetic;
+  FileOffset fileOffset;
   ConstructorReference target;
   Arguments arguments;
 }
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index c088723..5332ba5 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1166,13 +1166,17 @@
         return new FieldInitializer.byReference(reference, value)
           ..isSynthetic = isSynthetic;
       case Tag.SuperInitializer:
+        int offset = readOffset();
         var reference = readMemberReference();
         var arguments = readArguments();
         return new SuperInitializer.byReference(reference, arguments)
-          ..isSynthetic = isSynthetic;
+          ..isSynthetic = isSynthetic
+          ..fileOffset = offset;
       case Tag.RedirectingInitializer:
+        int offset = readOffset();
         return new RedirectingInitializer.byReference(
-            readMemberReference(), readArguments());
+            readMemberReference(), readArguments())
+          ..fileOffset = offset;
       case Tag.LocalInitializer:
         return new LocalInitializer(readAndPushVariableDeclaration());
       case Tag.AssertInitializer:
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 84a6e59..b59903b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -917,6 +917,7 @@
   void visitSuperInitializer(SuperInitializer node) {
     writeByte(Tag.SuperInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
+    writeOffset(node.fileOffset);
     writeReference(node.targetReference);
     writeNode(node.arguments);
   }
@@ -925,6 +926,7 @@
   void visitRedirectingInitializer(RedirectingInitializer node) {
     writeByte(Tag.RedirectingInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
+    writeOffset(node.fileOffset);
     writeReference(node.targetReference);
     writeNode(node.arguments);
   }
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 44eb262..69a2c8fd 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -135,7 +135,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 8;
+  static const int BinaryFormatVersion = 9;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/bin/util.dart b/pkg/kernel/lib/src/tool/command_line_util.dart
similarity index 100%
rename from pkg/kernel/bin/util.dart
rename to pkg/kernel/lib/src/tool/command_line_util.dart
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 5584371..ef43700 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -225,7 +225,7 @@
   final NameSystem syntheticNames;
   final StringSink sink;
   final Annotator annotator;
-  final Map<String, MetadataRepository<dynamic>> metadata;
+  final Map<String, MetadataRepository<Object>> metadata;
   ImportTable importTable;
   int indentation = 0;
   int column = 0;
@@ -248,13 +248,17 @@
       this.metadata})
       : this.syntheticNames = syntheticNames ?? new NameSystem();
 
-  Printer._inner(Printer parent, this.importTable, this.metadata)
-      : sink = parent.sink,
-        syntheticNames = parent.syntheticNames,
-        annotator = parent.annotator,
-        showExternal = parent.showExternal,
-        showOffsets = parent.showOffsets,
-        showMetadata = parent.showMetadata;
+  Printer createInner(ImportTable importTable,
+      Map<String, MetadataRepository<Object>> metadata) {
+    return new Printer(sink,
+        importTable: importTable,
+        metadata: metadata,
+        syntheticNames: syntheticNames,
+        annotator: annotator,
+        showExternal: showExternal,
+        showOffsets: showOffsets,
+        showMetadata: showMetadata);
+  }
 
   bool shouldHighlight(Node node) {
     return false;
@@ -395,8 +399,7 @@
     }
 
     endLine();
-    var inner =
-        new Printer._inner(this, imports, library.enclosingComponent?.metadata);
+    var inner = createInner(imports, library.enclosingComponent?.metadata);
     library.typedefs.forEach(inner.writeNode);
     library.classes.forEach(inner.writeNode);
     library.fields.forEach(inner.writeNode);
@@ -405,7 +408,7 @@
 
   void writeComponentFile(Component component) {
     ImportTable imports = new ComponentImportTable(component);
-    var inner = new Printer._inner(this, imports, component.metadata);
+    var inner = createInner(imports, component.metadata);
     writeWord('main');
     writeSpaced('=');
     inner.writeMemberReferenceFromReference(component.mainMethodName);
@@ -553,7 +556,7 @@
 
   void writeType(DartType type) {
     if (type == null) {
-      print('<No DartType>');
+      write('<No DartType>');
     } else {
       type.accept(this);
     }
@@ -567,7 +570,7 @@
 
   visitSupertype(Supertype type) {
     if (type == null) {
-      print('<No Supertype>');
+      write('<No Supertype>');
     } else {
       writeClassReferenceFromReference(type.className);
       if (type.typeArguments.isNotEmpty) {
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 21da8d9..7977045 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -181,8 +181,12 @@
 
     // 4. If the expression was named then the variables used for children are
     // no longer live but the variable used for the expression is.
+    // On the other hand, a sibling to the left (yet to be processed) cannot
+    // reuse any of the variables used here, as the assignments in the children
+    // (here) would overwrite assignments in the siblings to the left,
+    // possibly before the use of the overwritten values.
     if (shouldName) {
-      nameIndex = index + 1;
+      if (index + 1 > nameIndex) nameIndex = index + 1;
       seenAwait = true;
     }
     return result;
@@ -443,7 +447,7 @@
     var index = nameIndex;
     arguments.positional[0] = expr.operand.accept(this)..parent = arguments;
 
-    if (shouldName) nameIndex = index + 1;
+    if (shouldName && index + 1 > nameIndex) nameIndex = index + 1;
     seenAwait = true;
     return result;
   }
@@ -479,7 +483,7 @@
         ..parent = variable;
       // Temporaries used in the initializer or the body are not live but the
       // temporary used for the body is.
-      nameIndex = index + 1;
+      if (index + 1 > nameIndex) nameIndex = index + 1;
       seenAwait = true;
       return body;
     } else {
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index 3678749..6566547 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -47,8 +47,10 @@
     switch (nativeName) {
       case 'Bool_fromEnvironment':
         final String name = (positionalArguments[0] as StringConstant).value;
-        final BoolConstant constant = namedArguments['defaultValue'];
-        final bool defaultValue = constant != null ? constant.value : false;
+        final Constant constant = namedArguments['defaultValue'];
+        final bool defaultValue = constant is BoolConstant
+            ? constant.value
+            : (constant is NullConstant ? null : false);
         bool value;
         if (defines != null) {
           value = defines[name] == 'true'
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 651c83e5..9325491 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.2
+version: 0.3.3
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -14,7 +14,7 @@
   package_config: ^1.0.0
 dev_dependencies:
   analyzer: '>=0.31.0 <0.33.0'
-  front_end: 0.1.2
+  front_end: 0.1.3
   test: ^0.12.15+6
   stack_trace: ^1.6.6
   test_reflective_loader: ^0.1.0
diff --git a/pkg/pkg.status b/pkg/pkg.status
index c64d77b..66c275c 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -98,16 +98,34 @@
 [ $runtime == vm ]
 analysis_server/test/benchmarks_test: Pass, Slow
 analysis_server/test/completion_test: Pass, Slow
-analysis_server/test/integration/analysis/error_test: Pass, Slow
-analysis_server/test/integration/analysis/lint_test: Pass, Slow
-analysis_server/test/integration/completion: Pass, Slow
-analysis_server/test/integration/edit/format_test: Pass, Slow
-analysis_server/test/integration/edit/import_elements_test: Pass, Slow
-analysis_server/test/integration/edit/organize_directives_test: Pass, Slow
+analysis_server/test/domain_completion_test: Pass, Slow
+analysis_server/test/edit/refactoring_test: Pass, Slow
+analysis_server/test/integration/*: Pass, Slow
 analysis_server/test/integration/search/find_top_level_declarations_test: Pass, RuntimeError # 31571
+analysis_server/test/services/completion/dart/imported_reference_contributor_test: Pass, Slow
+analysis_server/test/services/completion/dart/keyword_contributor_test: Pass, Slow
+analysis_server/test/services/completion/dart/local_constructor_contributor_test: Pass, Slow
+analysis_server/test/services/completion/dart/local_reference_contributor_test: Pass, Slow
+analysis_server/test/services/completion/dart/type_member_contributor_test: Pass, Slow
+analysis_server/test/services/correction/assist_test: Pass, Slow
+analysis_server/test/services/correction/fix_test: Pass, Slow
+analysis_server/test/services/refactoring/extract_method_test: Pass, Slow
+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/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
+analyzer/test/src/dart/analysis/driver_resolution_kernel_test: Pass, Slow
+analyzer/test/src/dart/analysis/driver_resolution_test: Pass, Slow
+analyzer/test/src/dart/analysis/driver_test: Pass, Slow
+analyzer/test/src/summary/resynthesize_ast_test: Pass, Slow
+analyzer/test/src/task/strong/front_end_inference_test: Pass, Slow
 analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
 analyzer_cli/test/driver_test: Pass, Slow, Timeout
+analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test: Pass, Slow
+analyzer_plugin/test/src/utilities/completion/optype_test: Pass, Slow
 mutation_observer: Skip # Skip tests on the VM if the package depends on dart:html
 
 [ $runtime != vm ]
@@ -189,23 +207,6 @@
 analyzer/test/*: Skip # Issue 26813
 analyzer/tool/*: Skip # Issue 26813
 
-# ILLEGAL_ASYNC_RETURN_TYPE warnings appear on some subset of Linux configurations,
-# but do not always fail.
-[ $compiler == dart2analyzer && $system == linux && !$preview_dart_2 && !$strong ]
-analyzer/test/src/dart/ast/ast_test: StaticWarning, Pass
-analyzer/test/src/summary/expr_builder_test: StaticWarning, Pass
-analyzer/test/src/summary/resynthesize_ast_test: StaticWarning, Pass
-analyzer/test/src/summary/resynthesize_kernel_test: StaticWarning, Pass
-front_end/test/incremental_dart2js_load_from_dill_test: StaticWarning, Pass
-
-# ILLEGAL_ASYNC_RETURN_TYPE warnings
-[ $compiler == dart2analyzer && !$preview_dart_2 && !$strong && ($system == macos || $system == windows) ]
-analyzer/test/src/dart/ast/ast_test: StaticWarning
-analyzer/test/src/summary/expr_builder_test: StaticWarning
-analyzer/test/src/summary/resynthesize_ast_test: StaticWarning
-analyzer/test/src/summary/resynthesize_kernel_test: StaticWarning
-front_end/test/incremental_dart2js_load_from_dill_test: StaticWarning
-
 # Analyze dev_compiler but only run its tests on the vm
 [ $compiler != dart2analyzer && $runtime != vm ]
 dev_compiler/test/*: Skip
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
index 0467305..a1842fb 100644
--- a/pkg/smith/lib/configuration.dart
+++ b/pkg/smith/lib/configuration.dart
@@ -340,7 +340,7 @@
         isHostChecked = isHostChecked ?? false,
         isMinified = isMinified ?? false,
         isStrong = isStrong ?? false,
-        previewDart2 = previewDart2 ?? false,
+        previewDart2 = previewDart2 ?? true,
         useBlobs = useBlobs ?? false,
         useDart2JSWithKernel = useDart2JSWithKernel ?? false,
         useDart2JSOldFrontEnd = useDart2JSOldFrontEnd ?? false,
diff --git a/pkg/status_file/analysis_options.yaml b/pkg/status_file/analysis_options.yaml
index 3acdae1..b5516058 100644
--- a/pkg/status_file/analysis_options.yaml
+++ b/pkg/status_file/analysis_options.yaml
@@ -3,8 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyzer:
-  strong-mode: true
   errors:
     # Allow having TODOs in the code
     todo: ignore
-    uses_dynamic_as_bottom: ignore
\ No newline at end of file
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 29f6545..ed7631b 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -231,7 +231,6 @@
 action("generate_version_cc_file") {
   inputs = [
     "../tools/utils.py",
-    "../tools/print_version.py",
     "../tools/VERSION",
     "vm/version_in.cc",
   ]
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 115bf3f..56cf4c9 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -1511,5 +1511,67 @@
              : CObject::NewOSError();
 }
 
+// Inspired by sdk/lib/core/uri.dart
+UriDecoder::UriDecoder(const char* uri) : uri_(uri) {
+  const char* ch = uri;
+  while ((*ch != 0) && (*ch != '%')) {
+    ch++;
+  }
+  if (*ch == 0) {
+    // if there are no '%', nothing to decode, refer to original as decoded.
+    decoded_ = const_cast<char*>(uri);
+    return;
+  }
+  const intptr_t len = strlen(uri);
+  // Decoded string should be shorter than original because of
+  // percent-encoding.
+  char* dest = reinterpret_cast<char*>(malloc(len + 1));
+  int i = ch - uri;
+  // Copy all characters up to first '%' at index i.
+  strncpy(dest, uri, i);
+  decoded_ = dest;
+  dest += i;
+  while (*ch) {
+    if (*ch != '%') {
+      *(dest++) = *(ch++);
+      continue;
+    }
+    if ((i + 3 > len) || !HexCharPairToByte(ch + 1, dest)) {
+      free(decoded_);
+      decoded_ = NULL;
+      return;
+    }
+    ++dest;
+    ch += 3;
+  }
+  *dest = 0;
+}
+
+UriDecoder::~UriDecoder() {
+  if (uri_ != decoded_ && decoded_ != NULL) {
+    free(decoded_);
+  }
+}
+
+bool UriDecoder::HexCharPairToByte(const char* pch, char* const dest) {
+  int byte = 0;
+  for (int i = 0; i < 2; i++) {
+    char char_code = *(pch + i);
+    if (0x30 <= char_code && char_code <= 0x39) {
+      byte = byte * 16 + char_code - 0x30;
+    } else {
+      // Check ranges A-F (0x41-0x46) and a-f (0x61-0x66).
+      char_code |= 0x20;
+      if (0x61 <= char_code && char_code <= 0x66) {
+        byte = byte * 16 + char_code - 0x57;
+      } else {
+        return false;
+      }
+    }
+  }
+  *dest = byte;
+  return true;
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index ae0096e..7bc55e0 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -286,6 +286,22 @@
   DISALLOW_COPY_AND_ASSIGN(File);
 };
 
+class UriDecoder {
+ public:
+  explicit UriDecoder(const char* uri);
+  ~UriDecoder();
+
+  const char* decoded() const { return decoded_; }
+
+ private:
+  bool HexCharPairToByte(const char* pch, char* dest);
+
+  char* decoded_;
+  const char* uri_;
+
+  DISALLOW_COPY_AND_ASSIGN(UriDecoder);
+};
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 3ac8908..918565a 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -239,7 +239,12 @@
 File* File::OpenUri(Namespace* namespc, const char* uri, FileOpenMode mode) {
   const char* path = (strlen(uri) >= 8 && strncmp(uri, "file:///", 8) == 0)
       ? uri + 7 : uri;
-  return File::Open(namespc, path, mode);
+  UriDecoder uri_decoder(path);
+  if (uri_decoder.decoded() == NULL) {
+    errno = EINVAL;
+    return NULL;
+  }
+  return File::Open(namespc, uri_decoder.decoded(), mode);
 }
 
 File* File::OpenStdio(int fd) {
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 3c2741d..0fd8939 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -218,7 +218,12 @@
 File* File::OpenUri(Namespace* namespc, const char* uri, FileOpenMode mode) {
   const char* path = (strlen(uri) >= 8 && strncmp(uri, "file:///", 8) == 0)
       ? uri + 7 : uri;
-  return File::Open(namespc, path, mode);
+  UriDecoder uri_decoder(path);
+  if (uri_decoder.decoded() == NULL) {
+    errno = EINVAL;
+    return NULL;
+  }
+  return File::Open(namespc, uri_decoder.decoded(), mode);
 }
 
 File* File::OpenStdio(int fd) {
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index c91b7f8..ee59efe 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -238,7 +238,12 @@
 File* File::OpenUri(Namespace* namespc, const char* uri, FileOpenMode mode) {
   const char* path = (strlen(uri) >= 8 && strncmp(uri, "file:///", 8) == 0)
       ? uri + 7 : uri;
-  return File::Open(namespc, path, mode);
+  UriDecoder uri_decoder(path);
+  if (uri_decoder.decoded() == NULL) {
+    errno = EINVAL;
+    return NULL;
+  }
+  return File::Open(namespc, uri_decoder.decoded(), mode);
 }
 
 File* File::OpenStdio(int fd) {
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 308be6d..244838f 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -238,7 +238,12 @@
 File* File::OpenUri(Namespace* namespc, const char* uri, FileOpenMode mode) {
   const char* path = (strlen(uri) >= 8 && strncmp(uri, "file:///", 8) == 0)
       ? uri + 7 : uri;
-  return File::Open(namespc, path, mode);
+  UriDecoder uri_decoder(path);
+  if (uri_decoder.decoded() == NULL) {
+    errno = EINVAL;
+    return NULL;
+  }
+  return File::Open(namespc, uri_decoder.decoded(), mode);
 }
 
 File* File::OpenStdio(int fd) {
diff --git a/runtime/bin/file_test.cc b/runtime/bin/file_test.cc
index 0ed3a35..548f7b4 100644
--- a/runtime/bin/file_test.cc
+++ b/runtime/bin/file_test.cc
@@ -34,6 +34,73 @@
   file->Release();
 }
 
+TEST_CASE(OpenUri) {
+  const char* kFilename = GetFileName("runtime/bin/file_test.cc");
+  char* encoded = reinterpret_cast<char*>(malloc(strlen(kFilename) * 3 + 1));
+  char* t = encoded;
+  // percent-encode all characters 'c'
+  for (const char* p = kFilename; *p; p++) {
+    if (*p == 'c') {
+      *t++ = '%';
+      *t++ = '6';
+      *t++ = '3';
+    } else {
+      *t++ = *p;
+    }
+  }
+  *t = 0;
+  File* file = File::OpenUri(NULL, encoded, File::kRead);
+  free(encoded);
+  EXPECT(file != NULL);
+  char buffer[16];
+  buffer[0] = '\0';
+  EXPECT(file->ReadFully(buffer, 13));  // ReadFully returns true.
+  buffer[13] = '\0';
+  EXPECT_STREQ("// Copyright ", buffer);
+  EXPECT(!file->WriteByte(1));  // Cannot write to a read-only file.
+  file->Release();
+}
+
+TEST_CASE(OpenUri_InvalidUriPercentEncoding) {
+  const char* kFilename = GetFileName("runtime/bin/file_test.cc");
+  char* encoded = reinterpret_cast<char*>(malloc(strlen(kFilename) * 3 + 1));
+  char* t = encoded;
+  // percent-encode all characters 'c'
+  for (const char* p = kFilename; *p; p++) {
+    if (*p == 'c') {
+      *t++ = '%';
+      *t++ = 'f';
+      *t++ = 'o';
+    } else {
+      *t++ = *p;
+    }
+  }
+  *t = 0;
+  File* file = File::OpenUri(NULL, encoded, File::kRead);
+  free(encoded);
+  EXPECT(file == NULL);
+}
+
+TEST_CASE(OpenUri_TruncatedUriPercentEncoding) {
+  const char* kFilename = GetFileName("runtime/bin/file_test.cc");
+  char* encoded = reinterpret_cast<char*>(malloc(strlen(kFilename) * 3 + 1));
+  char* t = encoded;
+  // percent-encode all characters 'c'
+  for (const char* p = kFilename; *p; p++) {
+    if (*p == 'c') {
+      *t++ = '%';
+      *t++ = 'f';
+      *t++ = 'o';
+    } else {
+      *t++ = *p;
+    }
+  }
+  *(t - 1) = 0;  // truncate last uri encoding
+  File* file = File::OpenUri(NULL, encoded, File::kRead);
+  free(encoded);
+  EXPECT(file == NULL);
+}
+
 TEST_CASE(FileLength) {
   const char* kFilename =
       GetFileName("runtime/tests/vm/data/fixed_length_file");
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 9c486cc..d7d5b3f 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -282,7 +282,13 @@
 }
 
 File* File::OpenUri(Namespace* namespc, const char* uri, FileOpenMode mode) {
-  Utf8ToWideScope uri_w(uri);
+  UriDecoder uri_decoder(uri);
+  if (uri_decoder.decoded() == NULL) {
+    SetLastError(ERROR_INVALID_NAME);
+    return NULL;
+  }
+
+  Utf8ToWideScope uri_w(uri_decoder.decoded());
   if (!UrlIsFileUrlW(uri_w.wide())) {
     return FileOpenW(uri_w.wide(), mode);
   }
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index 181a9cd..f9d1fee 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -2,78 +2,62 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("../../build/dart/dart_host_sdk_toolchain.gni")
-import("../../build/dart/prebuilt_dart_sdk.gni")
-import("../../build/executable_suffix.gni")
+import("../../build/dart/dart_action.gni")
 import("observatory_sources.gni")
 
-# Construct arguments to the observatory tool for finding pub.
-build_deps = []
-build_args = []
-if (!prebuilt_dart_exe_works) {
-  build_deps += [ "../bin:dart_bootstrap($dart_host_toolchain)" ]
+prebuilt_dart2js_action("build_observatory") {
+  script = "web/main.dart"
 
-  dart_out_dir = get_label_info("../bin:dart_bootstrap($dart_host_toolchain)",
-                                "root_out_dir")
-  dart_bootstrap = rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")
+  # dart2js produces a .deps file, but it is not in a format that is understood
+  # by ninja, so we explicitly list all the sources here.
+  inputs = [ ".packages" ] + observatory_sources
 
-  build_args = [
-    "--sdk=True",
-    "--dart-executable",
-    dart_bootstrap,
-  ]
-} else {
-  build_args = [ "--sdk=True" ]
-}
-
-current_dir = rebase_path(".", "//")
-
-action("build_observatory") {
-  deps = build_deps
-
-  sources = rebase_path(observatory_sources, "", ".")
-
-  inputs = sources + [ rebase_path(".packages") ]
-
-  script = "../../tools/observatory_tool.py"
-  args = build_args + [
-           "--silent=True",
-           "--directory",
-           rebase_path("."),
-           "--command",
-           "build",
-           rebase_path("web/main.dart"),
-           rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
-           rebase_path(".packages"),
-         ]
-
+  output = "$target_gen_dir/observatory/web/main.dart.js"
   outputs = [
-    "$target_gen_dir/observatory/web/main.dart.js",
+    output,
+  ]
+
+  version_string = exec_script("../../tools/make_version.py",
+                               [
+                                 "--quiet",
+                                 "--no_git_hash",
+                               ],  # Arguments to the script
+                               "trim string",  # Input conversions
+                               [
+                                 "../../tools/VERSION",
+                                 "../tools/utils.py",
+                               ])  # Dependencies
+
+  args = [
+    "--no-preview-dart-2",
+    "-DOBS_VER=${version_string}",
+    "-o",
+    rebase_path(output),
+    "--packages=" + rebase_path(".packages"),
+    "--minify",
   ]
 }
 
+# TODO(zra): Investigate using GN's copy() with set_sources_assignment_filter
+# instead of using a python script.
 action("deploy_observatory") {
-  deps = [ ":build_observatory" ] + build_deps
+  deps = [
+    ":build_observatory",
+  ]
 
   script = "../../tools/observatory_tool.py"
 
   inputs = [
-    script,
     "$target_gen_dir/observatory/web/main.dart.js",
   ]
 
-  args = build_args + [
-           "--silent=True",
-           "--directory",
-           rebase_path("$target_out_dir/observatory"),
-           "--command",
-           "deploy",
-           rebase_path("$target_out_dir/observatory/deployed"),
-           rebase_path("web"),
-           rebase_path("lib"),
-           rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
-           rebase_path("../../third_party/observatory_pub_packages/packages"),
-         ]
+  args = [
+    rebase_path("$target_out_dir/observatory/deployed"),
+    rebase_path("web"),
+    rebase_path("lib"),
+    rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
+    rebase_path("../../third_party/observatory_pub_packages/packages"),
+  ]
 
   outputs = [
     "$target_out_dir/observatory/deployed/web/main.dart.js",
diff --git a/runtime/observatory/tests/service/async_step_out_test.dart b/runtime/observatory/tests/service/async_step_out_test.dart
index 13949c9..588efd5 100644
--- a/runtime/observatory/tests/service/async_step_out_test.dart
+++ b/runtime/observatory/tests/service/async_step_out_test.dart
@@ -7,39 +7,44 @@
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
-const LINE_A = 17;
-const LINE_B = 18;
-const LINE_C = 23;
-const LINE_D = 24;
-const LINE_E = 25;
+const LINE_A = 18;
+const LINE_B = 19;
+const LINE_C = 20;
+const LINE_D = 25;
+const LINE_E = 26;
+const LINE_F = 27;
 
 helper() async {
-  print('helper'); // LINE_A.
-  print('foobar'); // LINE_B.
+  await null; // LINE_A.
+  print('helper'); // LINE_B.
+  print('foobar'); // LINE_C.
 }
 
 testMain() async {
   debugger();
-  print('mmmmm'); // LINE_C.
-  await helper(); // LINE_D.
-  print('z'); // LINE_E.
+  print('mmmmm'); // LINE_D.
+  await helper(); // LINE_E.
+  print('z'); // LINE_F.
 }
 
 var tests = <IsolateTest>[
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_C),
+  stoppedAtLine(LINE_D),
   stepOver, // print.
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_D),
+  stoppedAtLine(LINE_E),
   stepInto,
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_A),
-  stepOver, // print.
+  asyncNext,
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_B),
+  stepOver, // print.
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
   stepOut, // out of helper to awaiter testMain.
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_E),
+  stoppedAtLine(LINE_F),
 ];
 
 main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index dc5a2e0..b65243f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -116,7 +116,6 @@
 add_breakpoint_rpc_test: SkipByDesign # non-kernel specific version of add_breakpoint_rpc_kernel_test.
 async_star_single_step_into_test: RuntimeError # Issue 29158, Async debugging
 async_star_step_out_test: RuntimeError # Issue 29158, Async debugging
-async_step_out_test: RuntimeError # Issue 29158, Async debugging
 awaiter_async_stack_contents_test: RuntimeError # Issue 29158, Async debugging
 evaluate_activation_in_method_class_test: RuntimeError
 evaluate_activation_test/instance: RuntimeError
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 4bbd984..89d48c3 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -63,7 +63,7 @@
       # TODO(US-399): Remove time_service specific code when it is no longer
       # necessary.
       "//garnet/public/lib/app/cpp",
-      "//garnet/public/lib/time_zone/fidl",
+      "//garnet/public/fidl/fuchsia.timezone",
 
       # TODO(zra): When the platform-specific timeline code is moved out to
       # the embedder, this can go away.
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index de660dd..c688a31 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -2444,7 +2444,7 @@
       }
       s->Write<uint32_t>(ic->ptr()->state_bits_);
 #if defined(TAG_IC_DATA)
-      s->Write<int32_t>(ic->ptr()->tag_);
+      s->Write<int32_t>(static_cast<int32_t>(ic->ptr()->tag_));
 #endif
     }
   }
@@ -2489,7 +2489,7 @@
       NOT_IN_PRECOMPILED(ic->ptr()->deopt_id_ = d->Read<int32_t>());
       ic->ptr()->state_bits_ = d->Read<int32_t>();
 #if defined(TAG_IC_DATA)
-      ic->ptr()->tag_ = d->Read<int32_t>();
+      ic->ptr()->tag_ = static_cast<ICData::Tag>(d->Read<int32_t>());
 #endif
     }
   }
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 70bee17..e427841 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -2112,8 +2112,7 @@
       return kUnsignedWord;
     case kTypedDataInt64ArrayCid:
     case kTypedDataUint64ArrayCid:
-      UNREACHABLE();
-      return kByte;
+      return kDWord;
     case kTypedDataFloat32ArrayCid:
       return kSWord;
     case kTypedDataFloat64ArrayCid:
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 692d9c8..b566572 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2512,12 +2512,13 @@
                                              intptr_t cid,
                                              intptr_t index_scale,
                                              Register array,
-                                             intptr_t index) {
+                                             intptr_t index,
+                                             intptr_t extra_disp) {
   if (is_external) {
-    return Address(array, index * index_scale);
+    return Address(array, index * index_scale + extra_disp);
   } else {
     const int64_t disp = static_cast<int64_t>(index) * index_scale +
-                         Instance::DataOffsetFor(cid);
+                         Instance::DataOffsetFor(cid) + extra_disp;
     ASSERT(Utils::IsInt(32, disp));
     return FieldAddress(array, static_cast<int32_t>(disp));
   }
@@ -2549,12 +2550,13 @@
                                              intptr_t cid,
                                              intptr_t index_scale,
                                              Register array,
-                                             Register index) {
+                                             Register index,
+                                             intptr_t extra_disp) {
   if (is_external) {
-    return Address(array, index, ToScaleFactor(index_scale), 0);
+    return Address(array, index, ToScaleFactor(index_scale), extra_disp);
   } else {
     return FieldAddress(array, index, ToScaleFactor(index_scale),
-                        Instance::DataOffsetFor(cid));
+                        Instance::DataOffsetFor(cid) + extra_disp);
   }
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 6694a85..19a00b4 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -672,13 +672,15 @@
                                            intptr_t cid,
                                            intptr_t index_scale,
                                            Register array,
-                                           intptr_t index);
+                                           intptr_t index,
+                                           intptr_t extra_disp = 0);
 
   static Address ElementAddressForRegIndex(bool is_external,
                                            intptr_t cid,
                                            intptr_t index_scale,
                                            Register array,
-                                           Register index);
+                                           Register index,
+                                           intptr_t extra_disp = 0);
 
   static Address VMTagAddress() {
     return Address(THR, Thread::vm_tag_offset());
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index d82b788..a583585 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -14,8 +14,6 @@
 
 namespace dart {
 
-class FlowGraphBuilder;
-class ValueInliningContext;
 class VariableLivenessAnalysis;
 
 class BlockIterator : public ValueObject {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 5b941df..d180a24 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1649,7 +1649,7 @@
                           arguments_descriptor, deopt_id, num_args_tested,
                           ICData::kInstance));
 #if defined(TAG_IC_DATA)
-  ic_data.set_tag(Instruction::kInstanceCall);
+  ic_data.set_tag(ICData::Tag::kInstanceCall);
 #endif
   if (deopt_id_to_ic_data_ != NULL) {
     (*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
@@ -1683,7 +1683,7 @@
                   deopt_id, num_args_tested, rebind_rule));
   ic_data.AddTarget(target);
 #if defined(TAG_IC_DATA)
-  ic_data.set_tag(Instruction::kStaticCall);
+  ic_data.set_tag(ICData::Tag::kStaticCall);
 #endif
   if (deopt_id_to_ic_data_ != NULL) {
     (*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index b1ed153..0dd7ed5 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -320,9 +320,20 @@
     const ICData* result = ic_data_array[deopt_id_];
 #if defined(TAG_IC_DATA)
     if (result != NULL) {
-      if (result->tag() == -1) {
-        result->set_tag(tag());
-      } else if (result->tag() != tag()) {
+      ICData::Tag ic_data_tag = ICData::Tag::kUnknown;
+      switch (tag()) {
+        case kInstanceCall:
+          ic_data_tag = ICData::Tag::kInstanceCall;
+          break;
+        case kStaticCall:
+          ic_data_tag = ICData::Tag::kStaticCall;
+          break;
+        default:
+          UNREACHABLE();
+      }
+      if (result->tag() == ICData::Tag::kUnknown) {
+        result->set_tag(ic_data_tag);
+      } else if (result->tag() != ic_data_tag) {
         FATAL("ICData tag mismatch");
       }
     }
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 9ebff20..f6bff3f 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -27,7 +27,6 @@
 class Definition;
 class Environment;
 class FlowGraph;
-class FlowGraphBuilder;
 class FlowGraphCompiler;
 class FlowGraphVisitor;
 class Instruction;
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 694f8f2..36a33a2 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1131,6 +1131,8 @@
 
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return CompileType::Int();
 
     default:
@@ -1159,6 +1161,9 @@
       return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1213,9 +1218,12 @@
 
 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
                                                        bool opt) const {
+  const bool directly_addressable =
+      aligned() && representation() != kUnboxedInt64;
   const intptr_t kNumInputs = 2;
   intptr_t kNumTemps = 0;
-  if (!aligned()) {
+
+  if (!directly_addressable) {
     kNumTemps += 1;
     if (representation() == kUnboxedDouble) {
       kNumTemps += 1;
@@ -1251,11 +1259,16 @@
   } else if (representation() == kUnboxedInt32) {
     ASSERT(class_id() == kTypedDataInt32ArrayCid);
     locs->set_out(0, Location::RequiresRegister());
+  } else if (representation() == kUnboxedInt64) {
+    ASSERT(class_id() == kTypedDataInt64ArrayCid ||
+           class_id() == kTypedDataUint64ArrayCid);
+    locs->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
   } else {
     ASSERT(representation() == kTagged);
     locs->set_out(0, Location::RequiresRegister());
   }
-  if (!aligned()) {
+  if (!directly_addressable) {
     locs->set_temp(0, Location::RequiresRegister());
     if (representation() == kUnboxedDouble) {
       locs->set_temp(1, Location::RequiresRegister());
@@ -1265,13 +1278,16 @@
 }
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const bool directly_addressable =
+      aligned() && representation() != kUnboxedInt64;
   // The array register points to the backing store for external arrays.
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
-  const Register address = aligned() ? kNoRegister : locs()->temp(0).reg();
+  const Register address =
+      directly_addressable ? kNoRegister : locs()->temp(0).reg();
 
   Address element_address(kNoRegister);
-  if (aligned()) {
+  if (directly_addressable) {
     element_address = index.IsRegister()
                           ? __ ElementAddressForRegIndex(
                                 true,  // Load.
@@ -1368,6 +1384,25 @@
     return;
   }
 
+  if (representation() == kUnboxedInt64) {
+    ASSERT(!directly_addressable);  // need to add to register
+    ASSERT(class_id() == kTypedDataInt64ArrayCid ||
+           class_id() == kTypedDataUint64ArrayCid);
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* result_pair = locs()->out(0).AsPairLocation();
+    Register result_lo = result_pair->At(0).reg();
+    Register result_hi = result_pair->At(1).reg();
+    if (aligned()) {
+      __ ldr(result_lo, Address(address));
+      __ ldr(result_hi, Address(address, kWordSize));
+    } else {
+      __ LoadWordUnaligned(result_lo, address, TMP);
+      __ AddImmediate(address, address, kWordSize);
+      __ LoadWordUnaligned(result_hi, address, TMP);
+    }
+    return;
+  }
+
   ASSERT(representation() == kTagged);
 
   const Register result = locs()->out(0).reg();
@@ -1435,6 +1470,9 @@
       return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1452,6 +1490,9 @@
 
 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
+  const bool directly_addressable = aligned() &&
+                                    class_id() != kTypedDataInt64ArrayCid &&
+                                    class_id() != kTypedDataUint64ArrayCid;
   const intptr_t kNumInputs = 3;
   LocationSummary* locs;
 
@@ -1460,7 +1501,7 @@
   if (CanBeImmediateIndex(index(), class_id(), IsExternal(),
                           false,  // Store.
                           &needs_base)) {
-    if (!aligned()) {
+    if (!directly_addressable) {
       kNumTemps += 2;
     } else if (needs_base) {
       kNumTemps += 1;
@@ -1472,7 +1513,7 @@
     // CanBeImmediateIndex must return false for unsafe smis.
     locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
-    if (!aligned()) {
+    if (!directly_addressable) {
       kNumTemps += 2;
     }
 
@@ -1504,6 +1545,11 @@
     case kTypedDataUint32ArrayCid:
       locs->set_in(2, Location::RequiresRegister());
       break;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      locs->set_in(2, Location::Pair(Location::RequiresRegister(),
+                                     Location::RequiresRegister()));
+      break;
     case kTypedDataFloat32ArrayCid:
       // Need low register (<= Q7).
       locs->set_in(2, Location::FpuRegisterLocation(Q7));
@@ -1522,6 +1568,9 @@
 }
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const bool directly_addressable = aligned() &&
+                                    class_id() != kTypedDataInt64ArrayCid &&
+                                    class_id() != kTypedDataUint64ArrayCid;
   // The array register points to the backing store for external arrays.
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
@@ -1531,7 +1580,7 @@
       (locs()->temp_count() > 1) ? locs()->temp(1).reg() : kNoRegister;
 
   Address element_address(kNoRegister);
-  if (aligned()) {
+  if (directly_addressable) {
     element_address = index.IsRegister()
                           ? __ ElementAddressForRegIndex(
                                 false,  // Store.
@@ -1630,6 +1679,23 @@
       }
       break;
     }
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid: {
+      ASSERT(!directly_addressable);  // need to add to register
+      ASSERT(locs()->in(2).IsPairLocation());
+      PairLocation* value_pair = locs()->in(2).AsPairLocation();
+      Register value_lo = value_pair->At(0).reg();
+      Register value_hi = value_pair->At(1).reg();
+      if (aligned()) {
+        __ str(value_lo, Address(temp));
+        __ str(value_hi, Address(temp, kWordSize));
+      } else {
+        __ StoreWordUnaligned(value_lo, temp, temp2);
+        __ AddImmediate(temp, temp, kWordSize);
+        __ StoreWordUnaligned(value_hi, temp, temp2);
+      }
+      break;
+    }
     case kTypedDataFloat32ArrayCid: {
       const SRegister value_reg =
           EvenSRegisterOf(EvenDRegisterOf(locs()->in(2).fpu_reg()));
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 57f3b5d..41891ab 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1011,6 +1011,8 @@
 
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
       return CompileType::Int();
 
     default:
@@ -1039,6 +1041,9 @@
       return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1081,6 +1086,11 @@
   } else if (representation() == kUnboxedInt32) {
     ASSERT(class_id() == kTypedDataInt32ArrayCid);
     locs->set_out(0, Location::RequiresRegister());
+  } else if (representation() == kUnboxedInt64) {
+    ASSERT(class_id() == kTypedDataInt64ArrayCid ||
+           class_id() == kTypedDataUint64ArrayCid);
+    locs->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
   } else {
     ASSERT(representation() == kTagged);
     locs->set_out(0, Location::RequiresRegister());
@@ -1148,6 +1158,28 @@
     return;
   }
 
+  if (representation() == kUnboxedInt64) {
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* result_pair = locs()->out(0).AsPairLocation();
+    Register result_lo = result_pair->At(0).reg();
+    Register result_hi = result_pair->At(1).reg();
+    if ((index_scale() == 1) && index.IsRegister()) {
+      __ SmiUntag(index.reg());
+    }
+    ASSERT(class_id() == kTypedDataInt64ArrayCid ||
+           class_id() == kTypedDataUint64ArrayCid);
+    __ movl(result_lo, element_address);
+    element_address = index.IsRegister()
+                          ? Assembler::ElementAddressForRegIndex(
+                                IsExternal(), class_id(), index_scale(), array,
+                                index.reg(), kWordSize)
+                          : Assembler::ElementAddressForIntIndex(
+                                IsExternal(), class_id(), index_scale(), array,
+                                Smi::Cast(index.constant()).Value(), kWordSize);
+    __ movl(result_hi, element_address);
+    return;
+  }
+
   ASSERT(representation() == kTagged);
 
   Register result = locs()->out(0).reg();
@@ -1208,6 +1240,9 @@
       return kUnboxedInt32;
     case kTypedDataUint32ArrayCid:
       return kUnboxedUint32;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      return kUnboxedInt64;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
@@ -1264,6 +1299,11 @@
     case kTypedDataUint32ArrayCid:
       locs->set_in(2, Location::RequiresRegister());
       break;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      locs->set_in(2, Location::Pair(Location::RequiresRegister(),
+                                     Location::RequiresRegister()));
+      break;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       // TODO(srdjan): Support Float64 constants.
@@ -1364,6 +1404,24 @@
     case kTypedDataUint32ArrayCid:
       __ movl(element_address, locs()->in(2).reg());
       break;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid: {
+      ASSERT(locs()->in(2).IsPairLocation());
+      PairLocation* value_pair = locs()->in(2).AsPairLocation();
+      Register value_lo = value_pair->At(0).reg();
+      Register value_hi = value_pair->At(1).reg();
+      __ movl(element_address, value_lo);
+      element_address =
+          index.IsRegister()
+              ? Assembler::ElementAddressForRegIndex(IsExternal(), class_id(),
+                                                     index_scale(), array,
+                                                     index.reg(), kWordSize)
+              : Assembler::ElementAddressForIntIndex(
+                    IsExternal(), class_id(), index_scale(), array,
+                    Smi::Cast(index.constant()).Value(), kWordSize);
+      __ movl(element_address, value_hi);
+      break;
+    }
     case kTypedDataFloat32ArrayCid:
       __ movss(element_address, locs()->in(2).fpu_reg());
       break;
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 5acad65..f041b41 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -950,8 +950,8 @@
         FlowGraph* callee_graph;
         if (UseKernelFrontEndFor(parsed_function)) {
           kernel::FlowGraphBuilder builder(
-              parsed_function->function().kernel_offset(), parsed_function,
-              *ic_data_array, /* not building var desc */ NULL, exit_collector,
+              parsed_function, *ic_data_array, /* not building var desc */ NULL,
+              exit_collector,
               /* optimized = */ true, Compiler::kNoOSRDeoptId,
               caller_graph_->max_block_id() + 1);
           {
@@ -2258,8 +2258,7 @@
 }
 
 static bool ShouldInlineInt64ArrayOps() {
-  // TODO(ajcbik): look into doing this even for 32-bit targets.
-  return (kBitsPerWord == 64) && FlowGraphCompiler::SupportsUnboxedInt64();
+  return FlowGraphCompiler::SupportsUnboxedInt64();
 }
 
 static bool CanUnboxInt32() {
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 651a3e6..b34c1b5 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -2473,7 +2473,7 @@
 
         // Handle side effects, deoptimization and function return.
         if (instr->HasUnknownSideEffects() || instr->CanDeoptimize() ||
-            instr->IsThrow() || instr->IsReThrow() || instr->IsReturn()) {
+            instr->MayThrow() || instr->IsReturn()) {
           // Instructions that return from the function, instructions with side
           // effects and instructions that can deoptimize are considered as
           // loads from all places.
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 4faa42a..6b3556b 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -212,12 +212,12 @@
   }
 
   const Token::Kind op_kind = call->token_kind();
-  if (FLAG_precompiled_mode && FLAG_strong && kBitsPerWord == 64) {
-    // Avoid speculation for AOT Dart2 64-bit targets.
+  if (FLAG_precompiled_mode && FLAG_strong) {
+    // Avoid speculation for AOT Dart2 targets.
     //
     // TODO(ajcbik): expand this to more and more targets as we
     // investigate the performance impact of moving smi decision
-    // into a later phase.
+    // into a later phase, and recover from Meteor loss.
     //
   } else if (FLAG_guess_icdata_cid) {
     if (FLAG_precompiled_mode) {
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 09118db..578dc45 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -75,6 +75,8 @@
   "cha.h",
   "compiler_pass.cc",
   "compiler_pass.h",
+  "frontend/bytecode_reader.cc",
+  "frontend/bytecode_reader.h",
   "frontend/flow_graph_builder.cc",
   "frontend/flow_graph_builder.h",
   "frontend/kernel_binary_flowgraph.cc",
@@ -85,6 +87,8 @@
   "frontend/kernel_translation_helper.h",
   "frontend/prologue_builder.cc",
   "frontend/prologue_builder.h",
+  "frontend/scope_builder.cc",
+  "frontend/scope_builder.h",
   "intrinsifier.cc",
   "intrinsifier.h",
   "intrinsifier_arm.cc",
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
new file mode 100644
index 0000000..b3ed8a3
--- /dev/null
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -0,0 +1,612 @@
+// 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.
+
+#include "vm/compiler/frontend/bytecode_reader.h"
+
+#include "vm/bootstrap.h"
+#include "vm/code_descriptors.h"
+#include "vm/compiler/assembler/disassembler_kbc.h"
+#include "vm/dart_entry.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+#if defined(DART_USE_INTERPRETER)
+
+#define Z (zone_)
+#define H (translation_helper_)
+#define T (type_translator_)
+#define I Isolate::Current()
+
+namespace dart {
+
+DEFINE_FLAG(bool, dump_kernel_bytecode, false, "Dump kernel bytecode");
+
+namespace kernel {
+
+BytecodeMetadataHelper::BytecodeMetadataHelper(KernelReaderHelper* helper,
+                                               TypeTranslator* type_translator,
+                                               ActiveClass* active_class)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ false),
+      type_translator_(*type_translator),
+      active_class_(active_class) {}
+
+void BytecodeMetadataHelper::ReadMetadata(const Function& function) {
+  const intptr_t node_offset = function.kernel_offset();
+  const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    return;
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+
+  // Create object pool and read pool entries.
+  const intptr_t obj_count = helper_->reader_.ReadListLength();
+  const ObjectPool& pool =
+      ObjectPool::Handle(helper_->zone_, ObjectPool::New(obj_count));
+  ReadPoolEntries(function, function, pool, 0);
+
+  // Read bytecode and attach to function.
+  const Code& bytecode = Code::Handle(helper_->zone_, ReadBytecode(pool));
+  function.AttachBytecode(bytecode);
+
+  // Read exceptions table.
+  ReadExceptionsTable(bytecode);
+
+  if (FLAG_dump_kernel_bytecode) {
+    KernelBytecodeDisassembler::Disassemble(function);
+  }
+
+  // Read closures.
+  Function& closure = Function::Handle(helper_->zone_);
+  Code& closure_bytecode = Code::Handle(helper_->zone_);
+  intptr_t num_closures = helper_->ReadListLength();
+  for (intptr_t i = 0; i < num_closures; i++) {
+    intptr_t closure_index = helper_->ReadUInt();
+    ASSERT(closure_index < obj_count);
+    closure ^= pool.ObjectAt(closure_index);
+
+    // Read closure bytecode and attach to closure function.
+    closure_bytecode = ReadBytecode(pool);
+    closure.AttachBytecode(closure_bytecode);
+
+    // Read closure exceptions table.
+    ReadExceptionsTable(closure_bytecode);
+
+    if (FLAG_dump_kernel_bytecode) {
+      KernelBytecodeDisassembler::Disassemble(closure);
+    }
+  }
+}
+
+intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function,
+                                                 const Function& inner_function,
+                                                 const ObjectPool& pool,
+                                                 intptr_t from_index) {
+  // These enums and the code below reading the constant pool from kernel must
+  // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
+  enum ConstantPoolTag {
+    kInvalid,
+    kNull,
+    kString,
+    kInt,
+    kDouble,
+    kBool,
+    kArgDesc,
+    kICData,
+    kStaticICData,
+    kField,
+    kFieldOffset,
+    kClass,
+    kTypeArgumentsFieldOffset,
+    kTearOff,
+    kType,
+    kTypeArguments,
+    kList,
+    kInstance,
+    kSymbol,
+    kTypeArgumentsForInstanceAllocation,
+    kContextOffset,
+    kClosureFunction,
+    kEndClosureFunctionScope,
+    kNativeEntry,
+    kSubtypeTestCache,
+  };
+
+  enum InvocationKind {
+    method,  // x.foo(...) or foo(...)
+    getter,  // x.foo
+    setter   // x.foo = ...
+  };
+
+  Object& obj = Object::Handle(helper_->zone_);
+  Object& elem = Object::Handle(helper_->zone_);
+  Array& array = Array::Handle(helper_->zone_);
+  Field& field = Field::Handle(helper_->zone_);
+  Class& cls = Class::Handle(helper_->zone_);
+  String& name = String::Handle(helper_->zone_);
+  TypeArguments& type_args = TypeArguments::Handle(helper_->zone_);
+  const intptr_t obj_count = pool.Length();
+  for (intptr_t i = from_index; i < obj_count; ++i) {
+    const intptr_t tag = helper_->ReadTag();
+    switch (tag) {
+      case ConstantPoolTag::kInvalid:
+        UNREACHABLE();
+      case ConstantPoolTag::kNull:
+        obj = Object::null();
+        break;
+      case ConstantPoolTag::kString:
+        obj = H.DartString(helper_->ReadStringReference()).raw();
+        ASSERT(obj.IsString());
+        obj = H.Canonicalize(String::Cast(obj));
+        break;
+      case ConstantPoolTag::kInt: {
+        uint32_t low_bits = helper_->ReadUInt32();
+        int64_t value = helper_->ReadUInt32();
+        value = (value << 32) | low_bits;
+        obj = Integer::New(value);
+      } break;
+      case ConstantPoolTag::kDouble: {
+        uint32_t low_bits = helper_->ReadUInt32();
+        uint64_t bits = helper_->ReadUInt32();
+        bits = (bits << 32) | low_bits;
+        double value = bit_cast<double, uint64_t>(bits);
+        obj = Double::New(value);
+      } break;
+      case ConstantPoolTag::kBool:
+        if (helper_->ReadUInt() == 1) {
+          obj = Bool::True().raw();
+        } else {
+          obj = Bool::False().raw();
+        }
+        break;
+      case ConstantPoolTag::kArgDesc: {
+        intptr_t num_arguments = helper_->ReadUInt();
+        intptr_t num_type_args = helper_->ReadUInt();
+        intptr_t num_arg_names = helper_->ReadListLength();
+        if (num_arg_names == 0) {
+          obj = ArgumentsDescriptor::New(num_type_args, num_arguments);
+        } else {
+          array = Array::New(num_arg_names);
+          for (intptr_t j = 0; j < num_arg_names; j++) {
+            array.SetAt(j, H.DartSymbolPlain(helper_->ReadStringReference()));
+          }
+          obj = ArgumentsDescriptor::New(num_type_args, num_arguments, array);
+        }
+      } break;
+      case ConstantPoolTag::kICData: {
+        InvocationKind kind = static_cast<InvocationKind>(helper_->ReadByte());
+        if (kind == InvocationKind::getter) {
+          name = helper_->ReadNameAsGetterName().raw();
+        } else if (kind == InvocationKind::setter) {
+          name = helper_->ReadNameAsSetterName().raw();
+        } else {
+          ASSERT(kind == InvocationKind::method);
+          name = helper_->ReadNameAsMethodName().raw();
+        }
+        intptr_t arg_desc_index = helper_->ReadUInt();
+        ASSERT(arg_desc_index < i);
+        array ^= pool.ObjectAt(arg_desc_index);
+        // TODO(regis): Should num_args_tested be explicitly provided?
+        obj = ICData::New(function, name,
+                          array,  // Arguments descriptor.
+                          Thread::kNoDeoptId, 1 /* num_args_tested */,
+                          ICData::RebindRule::kInstance);
+#if defined(TAG_IC_DATA)
+        ICData::Cast(obj).set_tag(ICData::Tag::kInstanceCall);
+#endif
+      } break;
+      case ConstantPoolTag::kStaticICData: {
+        InvocationKind kind = static_cast<InvocationKind>(helper_->ReadByte());
+        NameIndex target = helper_->ReadCanonicalNameReference();
+        if (H.IsConstructor(target)) {
+          name = H.DartConstructorName(target).raw();
+          elem = H.LookupConstructorByKernelConstructor(target);
+        } else if (H.IsField(target)) {
+          if (kind == InvocationKind::getter) {
+            name = H.DartGetterName(target).raw();
+          } else if (kind == InvocationKind::setter) {
+            name = H.DartSetterName(target).raw();
+          } else {
+            ASSERT(kind == InvocationKind::method);
+            UNIMPLEMENTED();  // TODO(regis): Revisit.
+          }
+          field = H.LookupFieldByKernelField(target);
+          cls = field.Owner();
+          elem = cls.LookupFunctionAllowPrivate(name);
+        } else {
+          if ((kind == InvocationKind::method) && H.IsGetter(target)) {
+            UNIMPLEMENTED();  // TODO(regis): Revisit.
+          }
+          name = H.DartProcedureName(target).raw();
+          elem = H.LookupStaticMethodByKernelProcedure(target);
+        }
+        ASSERT(elem.IsFunction());
+        intptr_t arg_desc_index = helper_->ReadUInt();
+        ASSERT(arg_desc_index < i);
+        array ^= pool.ObjectAt(arg_desc_index);
+        obj = ICData::New(function, name,
+                          array,  // Arguments descriptor.
+                          Thread::kNoDeoptId, 0 /* num_args_tested */,
+                          ICData::RebindRule::kStatic);
+        ICData::Cast(obj).AddTarget(Function::Cast(elem));
+#if defined(TAG_IC_DATA)
+        ICData::Cast(obj).set_tag(ICData::Tag::kStaticCall);
+#endif
+      } break;
+      case ConstantPoolTag::kField:
+        obj = H.LookupFieldByKernelField(helper_->ReadCanonicalNameReference());
+        ASSERT(obj.IsField());
+        break;
+      case ConstantPoolTag::kFieldOffset:
+        obj = H.LookupFieldByKernelField(helper_->ReadCanonicalNameReference());
+        ASSERT(obj.IsField());
+        obj = Smi::New(Field::Cast(obj).Offset() / kWordSize);
+        break;
+      case ConstantPoolTag::kClass:
+        obj = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        ASSERT(obj.IsClass());
+        break;
+      case ConstantPoolTag::kTypeArgumentsFieldOffset:
+        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        obj = Smi::New(cls.type_arguments_field_offset() / kWordSize);
+        break;
+      case ConstantPoolTag::kTearOff:
+        obj = H.LookupStaticMethodByKernelProcedure(
+            helper_->ReadCanonicalNameReference());
+        ASSERT(obj.IsFunction());
+        obj = Function::Cast(obj).ImplicitClosureFunction();
+        ASSERT(obj.IsFunction());
+        obj = Function::Cast(obj).ImplicitStaticClosure();
+        ASSERT(obj.IsInstance());
+        obj = H.Canonicalize(Instance::Cast(obj));
+        break;
+      case ConstantPoolTag::kType:
+        obj = type_translator_.BuildType().raw();
+        ASSERT(obj.IsAbstractType());
+        break;
+      case ConstantPoolTag::kTypeArguments:
+        obj = type_translator_.BuildTypeArguments(helper_->ReadListLength())
+                  .raw();
+        ASSERT(obj.IsNull() || obj.IsTypeArguments());
+        break;
+      case ConstantPoolTag::kList: {
+        obj = type_translator_.BuildType().raw();
+        ASSERT(obj.IsAbstractType());
+        const intptr_t length = helper_->ReadListLength();
+        array = Array::New(length, AbstractType::Cast(obj));
+        for (intptr_t j = 0; j < length; j++) {
+          intptr_t elem_index = helper_->ReadUInt();
+          ASSERT(elem_index < i);
+          elem = pool.ObjectAt(elem_index);
+          array.SetAt(j, elem);
+        }
+        obj = H.Canonicalize(Array::Cast(array));
+        ASSERT(!obj.IsNull());
+      } break;
+      case ConstantPoolTag::kInstance: {
+        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        obj = Instance::New(cls, Heap::kOld);
+        intptr_t type_args_index = helper_->ReadUInt();
+        ASSERT(type_args_index < i);
+        type_args ^= pool.ObjectAt(type_args_index);
+        if (!type_args.IsNull()) {
+          Instance::Cast(obj).SetTypeArguments(type_args);
+        }
+        intptr_t num_fields = helper_->ReadUInt();
+        for (intptr_t j = 0; j < num_fields; j++) {
+          NameIndex field_name = helper_->ReadCanonicalNameReference();
+          ASSERT(H.IsField(field_name));
+          field = H.LookupFieldByKernelField(field_name);
+          intptr_t elem_index = helper_->ReadUInt();
+          ASSERT(elem_index < i);
+          elem = pool.ObjectAt(elem_index);
+          Instance::Cast(obj).SetField(field, elem);
+        }
+        obj = H.Canonicalize(Instance::Cast(obj));
+      } break;
+      case ConstantPoolTag::kSymbol:
+        obj = H.DartSymbolPlain(helper_->ReadStringReference()).raw();
+        ASSERT(String::Cast(obj).IsSymbol());
+        break;
+      case ConstantPoolTag::kTypeArgumentsForInstanceAllocation: {
+        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        obj =
+            type_translator_
+                .BuildInstantiatedTypeArguments(cls, helper_->ReadListLength())
+                .raw();
+        ASSERT(obj.IsNull() || obj.IsTypeArguments());
+      } break;
+      case ConstantPoolTag::kContextOffset: {
+        intptr_t index = helper_->ReadUInt();
+        if (index == 0) {
+          obj = Smi::New(Context::parent_offset() / kWordSize);
+        } else {
+          obj = Smi::New(Context::variable_offset(index - 1) / kWordSize);
+        }
+      } break;
+      case ConstantPoolTag::kClosureFunction: {
+        name = H.DartSymbolPlain(helper_->ReadStringReference()).raw();
+        const Function& closure = Function::Handle(
+            helper_->zone_,
+            Function::NewClosureFunction(name, inner_function,
+                                         TokenPosition::kNoSource));
+
+        FunctionNodeHelper function_node_helper(helper_);
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kTypeParameters);
+        type_translator_.LoadAndSetupTypeParameters(
+            active_class_, closure, helper_->ReadListLength(), closure);
+        function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+        // Scope remains opened until ConstantPoolTag::kEndClosureFunctionScope.
+        ActiveTypeParametersScope scope(
+            active_class_, &closure,
+            TypeArguments::Handle(helper_->zone_, closure.type_parameters()),
+            helper_->zone_);
+
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kPositionalParameters);
+
+        intptr_t required_parameter_count =
+            function_node_helper.required_parameter_count_;
+        intptr_t total_parameter_count =
+            function_node_helper.total_parameter_count_;
+
+        intptr_t positional_parameter_count = helper_->ReadListLength();
+
+        intptr_t named_parameter_count =
+            total_parameter_count - positional_parameter_count;
+
+        const intptr_t extra_parameters = 1;
+        closure.set_num_fixed_parameters(extra_parameters +
+                                         required_parameter_count);
+        if (named_parameter_count > 0) {
+          closure.SetNumOptionalParameters(named_parameter_count, false);
+        } else {
+          closure.SetNumOptionalParameters(
+              positional_parameter_count - required_parameter_count, true);
+        }
+        intptr_t parameter_count = extra_parameters + total_parameter_count;
+        closure.set_parameter_types(Array::Handle(
+            helper_->zone_, Array::New(parameter_count, Heap::kOld)));
+        closure.set_parameter_names(Array::Handle(
+            helper_->zone_, Array::New(parameter_count, Heap::kOld)));
+
+        intptr_t pos = 0;
+        closure.SetParameterTypeAt(pos, AbstractType::dynamic_type());
+        closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
+        pos++;
+
+        const Library& lib =
+            Library::Handle(helper_->zone_, active_class_->klass->library());
+        for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
+          VariableDeclarationHelper helper(helper_);
+          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+          const AbstractType& type = type_translator_.BuildVariableType();
+          Tag tag = helper_->ReadTag();  // read (first part of) initializer.
+          if (tag == kSomething) {
+            helper_->SkipExpression();  // read (actual) initializer.
+          }
+
+          closure.SetParameterTypeAt(pos, type);
+          closure.SetParameterNameAt(pos,
+                                     H.DartIdentifier(lib, helper.name_index_));
+        }
+
+        intptr_t named_parameter_count_check = helper_->ReadListLength();
+        ASSERT(named_parameter_count_check == named_parameter_count);
+        for (intptr_t j = 0; j < named_parameter_count; ++j, ++pos) {
+          VariableDeclarationHelper helper(helper_);
+          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+          const AbstractType& type = type_translator_.BuildVariableType();
+          Tag tag = helper_->ReadTag();  // read (first part of) initializer.
+          if (tag == kSomething) {
+            helper_->SkipExpression();  // read (actual) initializer.
+          }
+
+          closure.SetParameterTypeAt(pos, type);
+          closure.SetParameterNameAt(pos,
+                                     H.DartIdentifier(lib, helper.name_index_));
+        }
+
+        function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
+
+        const AbstractType& return_type = type_translator_.BuildVariableType();
+        closure.set_result_type(return_type);
+        function_node_helper.SetJustRead(FunctionNodeHelper::kReturnType);
+        // The closure has no body.
+        function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
+
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+        pool.SetObjectAt(i, closure);
+
+        // Continue reading the constant pool entries inside the opened
+        // ActiveTypeParametersScope until the scope gets closed by a
+        // kEndClosureFunctionScope tag, in which case control returns here.
+        i = ReadPoolEntries(function, closure, pool, i + 1);
+        // Pool entry at index i has been set to null, because it was a
+        // kEndClosureFunctionScope.
+        ASSERT(pool.ObjectAt(i) == Object::null());
+        continue;
+      }
+      case ConstantPoolTag::kEndClosureFunctionScope: {
+        // Entry is not used and set to null.
+        obj = Object::null();
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+        pool.SetObjectAt(i, obj);
+        return i;  // The caller will close the scope.
+      } break;
+      case ConstantPoolTag::kNativeEntry: {
+        name = H.DartString(helper_->ReadStringReference()).raw();
+        obj = NativeEntry(function, name);
+      } break;
+      case ConstantPoolTag::kSubtypeTestCache: {
+        obj = SubtypeTestCache::New();
+      } break;
+      default:
+        UNREACHABLE();
+    }
+    pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+    pool.SetObjectAt(i, obj);
+  }
+  // Return the index of the last read pool entry.
+  return obj_count - 1;
+}
+
+RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
+  intptr_t size = helper_->reader_.ReadUInt();
+  intptr_t offset = helper_->reader_.offset();
+  const uint8_t* data = helper_->reader_.BufferAt(offset);
+  helper_->reader_.set_offset(offset + size);
+
+  // Create and return code object.
+  return Code::FinalizeBytecode(reinterpret_cast<const void*>(data), size,
+                                pool);
+}
+
+void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
+  const intptr_t try_block_count = helper_->reader_.ReadListLength();
+  if (try_block_count > 0) {
+    const ObjectPool& pool =
+        ObjectPool::Handle(helper_->zone_, bytecode.object_pool());
+    AbstractType& handler_type = AbstractType::Handle(helper_->zone_);
+    Array& handler_types = Array::ZoneHandle(helper_->zone_);
+    DescriptorList* pc_descriptors_list =
+        new (helper_->zone_) DescriptorList(64);
+    ExceptionHandlerList* exception_handlers_list =
+        new (helper_->zone_) ExceptionHandlerList();
+
+    // Encoding of ExceptionsTable is described in
+    // pkg/vm/lib/bytecode/exceptions.dart.
+    for (intptr_t try_index = 0; try_index < try_block_count; try_index++) {
+      intptr_t outer_try_index_plus1 = helper_->reader_.ReadUInt();
+      intptr_t outer_try_index = outer_try_index_plus1 - 1;
+      intptr_t start_pc = helper_->reader_.ReadUInt();
+      intptr_t end_pc = helper_->reader_.ReadUInt();
+      intptr_t handler_pc = helper_->reader_.ReadUInt();
+      uint8_t flags = helper_->reader_.ReadByte();
+      const uint8_t kFlagNeedsStackTrace = 1 << 0;
+      const uint8_t kFlagIsSynthetic = 1 << 1;
+      const bool needs_stacktrace = (flags & kFlagNeedsStackTrace) != 0;
+      const bool is_generated = (flags & kFlagIsSynthetic) != 0;
+      intptr_t type_count = helper_->reader_.ReadListLength();
+      ASSERT(type_count > 0);
+      handler_types = Array::New(type_count, Heap::kOld);
+      for (intptr_t i = 0; i < type_count; i++) {
+        intptr_t type_index = helper_->reader_.ReadUInt();
+        ASSERT(type_index < pool.Length());
+        handler_type ^= pool.ObjectAt(type_index);
+        handler_types.SetAt(i, handler_type);
+      }
+      pc_descriptors_list->AddDescriptor(RawPcDescriptors::kOther, start_pc,
+                                         Thread::kNoDeoptId,
+                                         TokenPosition::kNoSource, try_index);
+      pc_descriptors_list->AddDescriptor(RawPcDescriptors::kOther, end_pc,
+                                         Thread::kNoDeoptId,
+                                         TokenPosition::kNoSource, -1);
+
+      exception_handlers_list->AddHandler(
+          try_index, outer_try_index, handler_pc, TokenPosition::kNoSource,
+          is_generated, handler_types, needs_stacktrace);
+    }
+    const PcDescriptors& descriptors = PcDescriptors::Handle(
+        helper_->zone_,
+        pc_descriptors_list->FinalizePcDescriptors(bytecode.PayloadStart()));
+    bytecode.set_pc_descriptors(descriptors);
+    const ExceptionHandlers& handlers = ExceptionHandlers::Handle(
+        helper_->zone_, exception_handlers_list->FinalizeExceptionHandlers(
+                            bytecode.PayloadStart()));
+    bytecode.set_exception_handlers(handlers);
+  } else {
+    bytecode.set_pc_descriptors(Object::empty_descriptors());
+    bytecode.set_exception_handlers(Object::empty_exception_handlers());
+  }
+}
+
+RawTypedData* BytecodeMetadataHelper::NativeEntry(const Function& function,
+                                                  const String& external_name) {
+  Zone* zone = helper_->zone_;
+  MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
+  // This list of recognized methods must be kept in sync with the list of
+  // methods handled specially by the NativeCall bytecode in the interpreter.
+  switch (kind) {
+    case MethodRecognizer::kObjectEquals:
+    case MethodRecognizer::kStringBaseLength:
+    case MethodRecognizer::kStringBaseIsEmpty:
+    case MethodRecognizer::kGrowableArrayLength:
+    case MethodRecognizer::kObjectArrayLength:
+    case MethodRecognizer::kImmutableArrayLength:
+    case MethodRecognizer::kTypedDataLength:
+    case MethodRecognizer::kClassIDgetID:
+    case MethodRecognizer::kGrowableArrayCapacity:
+    case MethodRecognizer::kListFactory:
+    case MethodRecognizer::kObjectArrayAllocate:
+    case MethodRecognizer::kLinkedHashMap_getIndex:
+    case MethodRecognizer::kLinkedHashMap_setIndex:
+    case MethodRecognizer::kLinkedHashMap_getData:
+    case MethodRecognizer::kLinkedHashMap_setData:
+    case MethodRecognizer::kLinkedHashMap_getHashMask:
+    case MethodRecognizer::kLinkedHashMap_setHashMask:
+    case MethodRecognizer::kLinkedHashMap_getUsedData:
+    case MethodRecognizer::kLinkedHashMap_setUsedData:
+    case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
+    case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
+      break;
+    default:
+      kind = MethodRecognizer::kUnknown;
+  }
+  NativeFunctionWrapper trampoline = NULL;
+  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 {
+      const Class& cls = Class::Handle(zone, function.Owner());
+      const Library& library = Library::Handle(zone, cls.library());
+      Dart_NativeEntryResolver resolver = library.native_entry_resolver();
+      const bool is_bootstrap_native = Bootstrap::IsBootstrapResolver(resolver);
+      const int num_params =
+          NativeArguments::ParameterCountForResolution(function);
+      bool is_auto_scope = true;
+      native_function = NativeEntry::ResolveNative(library, external_name,
+                                                   num_params, &is_auto_scope);
+      ASSERT(native_function != NULL);  // TODO(regis): Should we throw instead?
+      if (is_bootstrap_native) {
+        trampoline = &NativeEntry::BootstrapNativeCallWrapper;
+      } else if (is_auto_scope) {
+        trampoline = &NativeEntry::AutoScopeNativeCallWrapper;
+      } else {
+        trampoline = &NativeEntry::NoScopeNativeCallWrapper;
+      }
+    }
+    argc_tag = NativeArguments::ComputeArgcTag(function);
+  }
+  // TODO(regis): Introduce a new VM class subclassing Object and containing
+  // these four untagged values.
+#ifdef ARCH_IS_32_BIT
+  const TypedData& native_entry = TypedData::Handle(
+      zone, TypedData::New(kTypedDataUint32ArrayCid, 4, Heap::kOld));
+  native_entry.SetUint32(0 << 2, static_cast<uint32_t>(kind));
+  native_entry.SetUint32(1 << 2, reinterpret_cast<uint32_t>(trampoline));
+  native_entry.SetUint32(2 << 2, reinterpret_cast<uint32_t>(native_function));
+  native_entry.SetUint32(3 << 2, static_cast<uint32_t>(argc_tag));
+#else
+  const TypedData& native_entry = TypedData::Handle(
+      zone, TypedData::New(kTypedDataUint64ArrayCid, 4, Heap::kOld));
+  native_entry.SetUint64(0 << 3, static_cast<uint64_t>(kind));
+  native_entry.SetUint64(1 << 3, reinterpret_cast<uint64_t>(trampoline));
+  native_entry.SetUint64(2 << 3, reinterpret_cast<uint64_t>(native_function));
+  native_entry.SetUint64(3 << 3, static_cast<uint64_t>(argc_tag));
+#endif
+  return native_entry.raw();
+}
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // defined(DART_USE_INTERPRETER)
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
new file mode 100644
index 0000000..e32cf14
--- /dev/null
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -0,0 +1,48 @@
+// 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.
+
+#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
+#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
+
+#include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/object.h"
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+#if defined(DART_USE_INTERPRETER)
+
+namespace dart {
+namespace kernel {
+
+// Helper class which provides access to bytecode metadata.
+class BytecodeMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.bytecode"; }
+
+  explicit BytecodeMetadataHelper(KernelReaderHelper* helper,
+                                  TypeTranslator* type_translator,
+                                  ActiveClass* active_class);
+
+  void ReadMetadata(const Function& function);
+
+ private:
+  // Returns the index of the last read pool entry.
+  intptr_t ReadPoolEntries(const Function& function,
+                           const Function& inner_function,
+                           const ObjectPool& pool,
+                           intptr_t from_index);
+  RawCode* ReadBytecode(const ObjectPool& pool);
+  void ReadExceptionsTable(const Code& bytecode);
+  RawTypedData* NativeEntry(const Function& function,
+                            const String& external_name);
+
+  TypeTranslator& type_translator_;
+  ActiveClass* const active_class_;
+};
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // defined(DART_USE_INTERPRETER)
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 3a8f5cb..46dba1a 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -4,10 +4,8 @@
 
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
 
-#include "vm/bootstrap.h"
-#include "vm/code_descriptors.h"
 #include "vm/compiler/aot/precompiler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
@@ -19,11 +17,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 namespace dart {
-
-#if defined(DART_USE_INTERPRETER)
-DEFINE_FLAG(bool, dump_kernel_bytecode, false, "Dump kernel bytecode");
-#endif  // defined(DART_USE_INTERPRETER)
-
 namespace kernel {
 
 #define Z (zone_)
@@ -32,2852 +25,6 @@
 #define I Isolate::Current()
 #define B (flow_graph_builder_)
 
-static bool IsFieldInitializer(const Function& function, Zone* zone) {
-  return (function.kind() == RawFunction::kImplicitStaticFinalGetter) &&
-         String::Handle(zone, function.name())
-             .StartsWith(Symbols::InitPrefix());
-}
-
-// Returns true if the given method can skip type checks for all arguments
-// that are not covariant or generic covariant in its implementation.
-static bool MethodCanSkipTypeChecksForNonCovariantArguments(
-    const Function& method,
-    const ProcedureAttributesMetadata& attrs) {
-  // Dart 2 type system at non-dynamic call sites statically guarantees that
-  // argument values match declarated parameter types for all non-covariant
-  // and non-generic-covariant parameters. The same applies to type parameters
-  // bounds for type parameters of generic functions.
-  // In JIT mode we dynamically generate trampolines (dynamic invocation
-  // forwarders) that perform type checks when arriving to a method from a
-  // dynamic call-site.
-  // In AOT mode we don't dynamically generate such trampolines but
-  // instead rely on a static analysis to discover which methods can
-  // be invoked dynamically.
-  if (method.name() == Symbols::Call().raw()) {
-    // Currently we consider all call methods to be invoked dynamically and
-    // don't mangle their names.
-    // TODO(vegorov) remove this once we also introduce special type checking
-    // entry point for closures.
-    return false;
-  }
-  return !FLAG_precompiled_mode || !attrs.has_dynamic_invocations;
-}
-
-DirectCallMetadataHelper::DirectCallMetadataHelper(KernelReaderHelper* helper)
-    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
-
-bool DirectCallMetadataHelper::ReadMetadata(intptr_t node_offset,
-                                            NameIndex* target_name,
-                                            bool* check_receiver_for_null) {
-  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
-  if (md_offset < 0) {
-    return false;
-  }
-
-  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
-                              md_offset);
-
-  *target_name = helper_->ReadCanonicalNameReference();
-  *check_receiver_for_null = helper_->ReadBool();
-  return true;
-}
-
-DirectCallMetadata DirectCallMetadataHelper::GetDirectTargetForPropertyGet(
-    intptr_t node_offset) {
-  NameIndex kernel_name;
-  bool check_receiver_for_null = false;
-  if (!ReadMetadata(node_offset, &kernel_name, &check_receiver_for_null)) {
-    return DirectCallMetadata(Function::null_function(), false);
-  }
-
-  if (H.IsProcedure(kernel_name) && !H.IsGetter(kernel_name)) {
-    // Tear-off. Use method extractor as direct call target.
-    const String& method_name = H.DartMethodName(kernel_name);
-    const Function& target_method = Function::ZoneHandle(
-        helper_->zone_, H.LookupMethodByMember(kernel_name, method_name));
-    const String& getter_name = H.DartGetterName(kernel_name);
-    return DirectCallMetadata(
-        Function::ZoneHandle(helper_->zone_,
-                             target_method.GetMethodExtractor(getter_name)),
-        check_receiver_for_null);
-  } else {
-    const String& getter_name = H.DartGetterName(kernel_name);
-    const Function& target = Function::ZoneHandle(
-        helper_->zone_, H.LookupMethodByMember(kernel_name, getter_name));
-    ASSERT(target.IsGetterFunction() || target.IsImplicitGetterFunction());
-    return DirectCallMetadata(target, check_receiver_for_null);
-  }
-}
-
-DirectCallMetadata DirectCallMetadataHelper::GetDirectTargetForPropertySet(
-    intptr_t node_offset) {
-  NameIndex kernel_name;
-  bool check_receiver_for_null = false;
-  if (!ReadMetadata(node_offset, &kernel_name, &check_receiver_for_null)) {
-    return DirectCallMetadata(Function::null_function(), false);
-  }
-
-  const String& method_name = H.DartSetterName(kernel_name);
-  const Function& target = Function::ZoneHandle(
-      helper_->zone_, H.LookupMethodByMember(kernel_name, method_name));
-  ASSERT(target.IsSetterFunction() || target.IsImplicitSetterFunction());
-
-  return DirectCallMetadata(target, check_receiver_for_null);
-}
-
-DirectCallMetadata DirectCallMetadataHelper::GetDirectTargetForMethodInvocation(
-    intptr_t node_offset) {
-  NameIndex kernel_name;
-  bool check_receiver_for_null = false;
-  if (!ReadMetadata(node_offset, &kernel_name, &check_receiver_for_null)) {
-    return DirectCallMetadata(Function::null_function(), false);
-  }
-
-  const String& method_name = H.DartProcedureName(kernel_name);
-  const Function& target = Function::ZoneHandle(
-      helper_->zone_, H.LookupMethodByMember(kernel_name, method_name));
-
-  return DirectCallMetadata(target, check_receiver_for_null);
-}
-
-bool ProcedureAttributesMetadataHelper::ReadMetadata(
-    intptr_t node_offset,
-    ProcedureAttributesMetadata* metadata) {
-  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
-  if (md_offset < 0) {
-    return false;
-  }
-
-  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
-                              md_offset);
-
-  const int kDynamicUsesBit = 1 << 0;
-  const int kNonThisUsesBit = 1 << 1;
-  const int kTearOffUsesBit = 1 << 2;
-
-  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;
-  return true;
-}
-
-ProcedureAttributesMetadataHelper::ProcedureAttributesMetadataHelper(
-    KernelReaderHelper* helper)
-    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
-
-ProcedureAttributesMetadata
-ProcedureAttributesMetadataHelper::GetProcedureAttributes(
-    intptr_t node_offset) {
-  ProcedureAttributesMetadata metadata;
-  ReadMetadata(node_offset, &metadata);
-  return metadata;
-}
-
-InferredTypeMetadataHelper::InferredTypeMetadataHelper(
-    KernelReaderHelper* helper)
-    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
-
-InferredTypeMetadata InferredTypeMetadataHelper::GetInferredType(
-    intptr_t node_offset) {
-  const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
-  if (md_offset < 0) {
-    return InferredTypeMetadata(kDynamicCid, true);
-  }
-
-  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
-                              md_offset);
-
-  const NameIndex kernel_name = helper_->ReadCanonicalNameReference();
-  const bool nullable = helper_->ReadBool();
-
-  if (H.IsRoot(kernel_name)) {
-    return InferredTypeMetadata(kDynamicCid, nullable);
-  }
-
-  const Class& klass =
-      Class::Handle(helper_->zone_, H.LookupClassByKernelClass(kernel_name));
-  ASSERT(!klass.IsNull());
-
-  intptr_t cid = klass.id();
-  if (cid == kClosureCid) {
-    // VM uses more specific function types and doesn't expect instances of
-    // _Closure class, so inferred _Closure class doesn't make sense for the VM.
-    cid = kDynamicCid;
-  }
-
-  return InferredTypeMetadata(cid, nullable);
-}
-
-#if defined(DART_USE_INTERPRETER)
-
-BytecodeMetadataHelper::BytecodeMetadataHelper(KernelReaderHelper* helper,
-                                               TypeTranslator* type_translator,
-                                               ActiveClass* active_class)
-    : MetadataHelper(helper, tag(), /* precompiler_only = */ false),
-      type_translator_(*type_translator),
-      active_class_(active_class) {}
-
-void BytecodeMetadataHelper::ReadMetadata(const Function& function) {
-  const intptr_t node_offset = function.kernel_offset();
-  const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
-  if (md_offset < 0) {
-    return;
-  }
-
-  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
-                              md_offset);
-
-  // Create object pool and read pool entries.
-  const intptr_t obj_count = helper_->reader_.ReadListLength();
-  const ObjectPool& pool =
-      ObjectPool::Handle(helper_->zone_, ObjectPool::New(obj_count));
-  ReadPoolEntries(function, function, pool, 0);
-
-  // Read bytecode and attach to function.
-  const Code& bytecode = Code::Handle(helper_->zone_, ReadBytecode(pool));
-  function.AttachBytecode(bytecode);
-
-  // Read exceptions table.
-  ReadExceptionsTable(bytecode);
-
-  if (FLAG_dump_kernel_bytecode) {
-    KernelBytecodeDisassembler::Disassemble(function);
-  }
-
-  // Read closures.
-  Function& closure = Function::Handle(helper_->zone_);
-  Code& closure_bytecode = Code::Handle(helper_->zone_);
-  intptr_t num_closures = helper_->ReadListLength();
-  for (intptr_t i = 0; i < num_closures; i++) {
-    intptr_t closure_index = helper_->ReadUInt();
-    ASSERT(closure_index < obj_count);
-    closure ^= pool.ObjectAt(closure_index);
-
-    // Read closure bytecode and attach to closure function.
-    closure_bytecode = ReadBytecode(pool);
-    closure.AttachBytecode(closure_bytecode);
-
-    // Read closure exceptions table.
-    ReadExceptionsTable(closure_bytecode);
-
-    if (FLAG_dump_kernel_bytecode) {
-      KernelBytecodeDisassembler::Disassemble(closure);
-    }
-  }
-}
-
-intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function,
-                                                 const Function& inner_function,
-                                                 const ObjectPool& pool,
-                                                 intptr_t from_index) {
-  // These enums and the code below reading the constant pool from kernel must
-  // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
-  enum ConstantPoolTag {
-    kInvalid,
-    kNull,
-    kString,
-    kInt,
-    kDouble,
-    kBool,
-    kArgDesc,
-    kICData,
-    kStaticICData,
-    kField,
-    kFieldOffset,
-    kClass,
-    kTypeArgumentsFieldOffset,
-    kTearOff,
-    kType,
-    kTypeArguments,
-    kList,
-    kInstance,
-    kSymbol,
-    kTypeArgumentsForInstanceAllocation,
-    kContextOffset,
-    kClosureFunction,
-    kEndClosureFunctionScope,
-    kNativeEntry,
-    kSubtypeTestCache,
-  };
-
-  enum InvocationKind {
-    method,  // x.foo(...) or foo(...)
-    getter,  // x.foo
-    setter   // x.foo = ...
-  };
-
-  Object& obj = Object::Handle(helper_->zone_);
-  Object& elem = Object::Handle(helper_->zone_);
-  Array& array = Array::Handle(helper_->zone_);
-  Field& field = Field::Handle(helper_->zone_);
-  Class& cls = Class::Handle(helper_->zone_);
-  String& name = String::Handle(helper_->zone_);
-  TypeArguments& type_args = TypeArguments::Handle(helper_->zone_);
-  const intptr_t obj_count = pool.Length();
-  for (intptr_t i = from_index; i < obj_count; ++i) {
-    const intptr_t tag = helper_->ReadTag();
-    switch (tag) {
-      case ConstantPoolTag::kInvalid:
-        UNREACHABLE();
-      case ConstantPoolTag::kNull:
-        obj = Object::null();
-        break;
-      case ConstantPoolTag::kString:
-        obj = H.DartString(helper_->ReadStringReference()).raw();
-        ASSERT(obj.IsString());
-        obj = H.Canonicalize(String::Cast(obj));
-        break;
-      case ConstantPoolTag::kInt: {
-        uint32_t low_bits = helper_->ReadUInt32();
-        int64_t value = helper_->ReadUInt32();
-        value = (value << 32) | low_bits;
-        obj = Integer::New(value);
-      } break;
-      case ConstantPoolTag::kDouble: {
-        uint32_t low_bits = helper_->ReadUInt32();
-        uint64_t bits = helper_->ReadUInt32();
-        bits = (bits << 32) | low_bits;
-        double value = bit_cast<double, uint64_t>(bits);
-        obj = Double::New(value);
-      } break;
-      case ConstantPoolTag::kBool:
-        if (helper_->ReadUInt() == 1) {
-          obj = Bool::True().raw();
-        } else {
-          obj = Bool::False().raw();
-        }
-        break;
-      case ConstantPoolTag::kArgDesc: {
-        intptr_t num_arguments = helper_->ReadUInt();
-        intptr_t num_type_args = helper_->ReadUInt();
-        intptr_t num_arg_names = helper_->ReadListLength();
-        if (num_arg_names == 0) {
-          obj = ArgumentsDescriptor::New(num_type_args, num_arguments);
-        } else {
-          array = Array::New(num_arg_names);
-          for (intptr_t j = 0; j < num_arg_names; j++) {
-            array.SetAt(j, H.DartSymbolPlain(helper_->ReadStringReference()));
-          }
-          obj = ArgumentsDescriptor::New(num_type_args, num_arguments, array);
-        }
-      } break;
-      case ConstantPoolTag::kICData: {
-        InvocationKind kind = static_cast<InvocationKind>(helper_->ReadByte());
-        if (kind == InvocationKind::getter) {
-          name = helper_->ReadNameAsGetterName().raw();
-        } else if (kind == InvocationKind::setter) {
-          name = helper_->ReadNameAsSetterName().raw();
-        } else {
-          ASSERT(kind == InvocationKind::method);
-          name = helper_->ReadNameAsMethodName().raw();
-        }
-        intptr_t arg_desc_index = helper_->ReadUInt();
-        ASSERT(arg_desc_index < i);
-        array ^= pool.ObjectAt(arg_desc_index);
-        // TODO(regis): Should num_args_tested be explicitly provided?
-        obj = ICData::New(function, name,
-                          array,  // Arguments descriptor.
-                          Thread::kNoDeoptId, 1 /* num_args_tested */,
-                          ICData::RebindRule::kInstance);
-#if defined(TAG_IC_DATA)
-        ICData::Cast(obj).set_tag(Instruction::kInstanceCall);
-#endif
-      } break;
-      case ConstantPoolTag::kStaticICData: {
-        InvocationKind kind = static_cast<InvocationKind>(helper_->ReadByte());
-        NameIndex target = helper_->ReadCanonicalNameReference();
-        if (H.IsConstructor(target)) {
-          name = H.DartConstructorName(target).raw();
-          elem = H.LookupConstructorByKernelConstructor(target);
-        } else if (H.IsField(target)) {
-          if (kind == InvocationKind::getter) {
-            name = H.DartGetterName(target).raw();
-          } else if (kind == InvocationKind::setter) {
-            name = H.DartSetterName(target).raw();
-          } else {
-            ASSERT(kind == InvocationKind::method);
-            UNIMPLEMENTED();  // TODO(regis): Revisit.
-          }
-          field = H.LookupFieldByKernelField(target);
-          cls = field.Owner();
-          elem = cls.LookupFunctionAllowPrivate(name);
-        } else {
-          if ((kind == InvocationKind::method) && H.IsGetter(target)) {
-            UNIMPLEMENTED();  // TODO(regis): Revisit.
-          }
-          name = H.DartProcedureName(target).raw();
-          elem = H.LookupStaticMethodByKernelProcedure(target);
-        }
-        ASSERT(elem.IsFunction());
-        intptr_t arg_desc_index = helper_->ReadUInt();
-        ASSERT(arg_desc_index < i);
-        array ^= pool.ObjectAt(arg_desc_index);
-        obj = ICData::New(function, name,
-                          array,  // Arguments descriptor.
-                          Thread::kNoDeoptId, 0 /* num_args_tested */,
-                          ICData::RebindRule::kStatic);
-        ICData::Cast(obj).AddTarget(Function::Cast(elem));
-#if defined(TAG_IC_DATA)
-        ICData::Cast(obj).set_tag(Instruction::kStaticCall);
-#endif
-      } break;
-      case ConstantPoolTag::kField:
-        obj = H.LookupFieldByKernelField(helper_->ReadCanonicalNameReference());
-        ASSERT(obj.IsField());
-        break;
-      case ConstantPoolTag::kFieldOffset:
-        obj = H.LookupFieldByKernelField(helper_->ReadCanonicalNameReference());
-        ASSERT(obj.IsField());
-        obj = Smi::New(Field::Cast(obj).Offset() / kWordSize);
-        break;
-      case ConstantPoolTag::kClass:
-        obj = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
-        break;
-      case ConstantPoolTag::kTypeArgumentsFieldOffset:
-        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
-        obj = Smi::New(cls.type_arguments_field_offset() / kWordSize);
-        break;
-      case ConstantPoolTag::kTearOff:
-        obj = H.LookupStaticMethodByKernelProcedure(
-            helper_->ReadCanonicalNameReference());
-        ASSERT(obj.IsFunction());
-        obj = Function::Cast(obj).ImplicitClosureFunction();
-        ASSERT(obj.IsFunction());
-        obj = Function::Cast(obj).ImplicitStaticClosure();
-        ASSERT(obj.IsInstance());
-        obj = H.Canonicalize(Instance::Cast(obj));
-        break;
-      case ConstantPoolTag::kType:
-        obj = type_translator_.BuildType().raw();
-        ASSERT(obj.IsAbstractType());
-        break;
-      case ConstantPoolTag::kTypeArguments:
-        obj = type_translator_.BuildTypeArguments(helper_->ReadListLength())
-                  .raw();
-        ASSERT(obj.IsNull() || obj.IsTypeArguments());
-        break;
-      case ConstantPoolTag::kList: {
-        obj = type_translator_.BuildType().raw();
-        ASSERT(obj.IsAbstractType());
-        const intptr_t length = helper_->ReadListLength();
-        array = Array::New(length, AbstractType::Cast(obj));
-        for (intptr_t j = 0; j < length; j++) {
-          intptr_t elem_index = helper_->ReadUInt();
-          ASSERT(elem_index < i);
-          elem = pool.ObjectAt(elem_index);
-          array.SetAt(j, elem);
-        }
-        obj = H.Canonicalize(Array::Cast(array));
-        ASSERT(!obj.IsNull());
-      } break;
-      case ConstantPoolTag::kInstance: {
-        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
-        obj = Instance::New(cls, Heap::kOld);
-        intptr_t type_args_index = helper_->ReadUInt();
-        ASSERT(type_args_index < i);
-        type_args ^= pool.ObjectAt(type_args_index);
-        if (!type_args.IsNull()) {
-          Instance::Cast(obj).SetTypeArguments(type_args);
-        }
-        intptr_t num_fields = helper_->ReadUInt();
-        for (intptr_t j = 0; j < num_fields; j++) {
-          NameIndex field_name = helper_->ReadCanonicalNameReference();
-          ASSERT(H.IsField(field_name));
-          field = H.LookupFieldByKernelField(field_name);
-          intptr_t elem_index = helper_->ReadUInt();
-          ASSERT(elem_index < i);
-          elem = pool.ObjectAt(elem_index);
-          Instance::Cast(obj).SetField(field, elem);
-        }
-        obj = H.Canonicalize(Instance::Cast(obj));
-      } break;
-      case ConstantPoolTag::kSymbol:
-        obj = H.DartSymbolPlain(helper_->ReadStringReference()).raw();
-        ASSERT(String::Cast(obj).IsSymbol());
-        break;
-      case ConstantPoolTag::kTypeArgumentsForInstanceAllocation: {
-        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
-        obj =
-            type_translator_
-                .BuildInstantiatedTypeArguments(cls, helper_->ReadListLength())
-                .raw();
-        ASSERT(obj.IsNull() || obj.IsTypeArguments());
-      } break;
-      case ConstantPoolTag::kContextOffset: {
-        intptr_t index = helper_->ReadUInt();
-        if (index == 0) {
-          obj = Smi::New(Context::parent_offset() / kWordSize);
-        } else {
-          obj = Smi::New(Context::variable_offset(index - 1) / kWordSize);
-        }
-      } break;
-      case ConstantPoolTag::kClosureFunction: {
-        name = H.DartSymbolPlain(helper_->ReadStringReference()).raw();
-        const Function& closure = Function::Handle(
-            helper_->zone_,
-            Function::NewClosureFunction(name, inner_function,
-                                         TokenPosition::kNoSource));
-
-        FunctionNodeHelper function_node_helper(helper_);
-        function_node_helper.ReadUntilExcluding(
-            FunctionNodeHelper::kTypeParameters);
-        type_translator_.LoadAndSetupTypeParameters(
-            active_class_, closure, helper_->ReadListLength(), closure);
-        function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
-
-        // Scope remains opened until ConstantPoolTag::kEndClosureFunctionScope.
-        ActiveTypeParametersScope scope(
-            active_class_, &closure,
-            TypeArguments::Handle(helper_->zone_, closure.type_parameters()),
-            helper_->zone_);
-
-        function_node_helper.ReadUntilExcluding(
-            FunctionNodeHelper::kPositionalParameters);
-
-        intptr_t required_parameter_count =
-            function_node_helper.required_parameter_count_;
-        intptr_t total_parameter_count =
-            function_node_helper.total_parameter_count_;
-
-        intptr_t positional_parameter_count = helper_->ReadListLength();
-
-        intptr_t named_parameter_count =
-            total_parameter_count - positional_parameter_count;
-
-        const intptr_t extra_parameters = 1;
-        closure.set_num_fixed_parameters(extra_parameters +
-                                         required_parameter_count);
-        if (named_parameter_count > 0) {
-          closure.SetNumOptionalParameters(named_parameter_count, false);
-        } else {
-          closure.SetNumOptionalParameters(
-              positional_parameter_count - required_parameter_count, true);
-        }
-        intptr_t parameter_count = extra_parameters + total_parameter_count;
-        closure.set_parameter_types(Array::Handle(
-            helper_->zone_, Array::New(parameter_count, Heap::kOld)));
-        closure.set_parameter_names(Array::Handle(
-            helper_->zone_, Array::New(parameter_count, Heap::kOld)));
-
-        intptr_t pos = 0;
-        closure.SetParameterTypeAt(pos, AbstractType::dynamic_type());
-        closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
-        pos++;
-
-        const Library& lib =
-            Library::Handle(helper_->zone_, active_class_->klass->library());
-        for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
-          VariableDeclarationHelper helper(helper_);
-          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-          const AbstractType& type = type_translator_.BuildVariableType();
-          Tag tag = helper_->ReadTag();  // read (first part of) initializer.
-          if (tag == kSomething) {
-            helper_->SkipExpression();  // read (actual) initializer.
-          }
-
-          closure.SetParameterTypeAt(pos, type);
-          closure.SetParameterNameAt(pos,
-                                     H.DartIdentifier(lib, helper.name_index_));
-        }
-
-        intptr_t named_parameter_count_check = helper_->ReadListLength();
-        ASSERT(named_parameter_count_check == named_parameter_count);
-        for (intptr_t j = 0; j < named_parameter_count; ++j, ++pos) {
-          VariableDeclarationHelper helper(helper_);
-          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-          const AbstractType& type = type_translator_.BuildVariableType();
-          Tag tag = helper_->ReadTag();  // read (first part of) initializer.
-          if (tag == kSomething) {
-            helper_->SkipExpression();  // read (actual) initializer.
-          }
-
-          closure.SetParameterTypeAt(pos, type);
-          closure.SetParameterNameAt(pos,
-                                     H.DartIdentifier(lib, helper.name_index_));
-        }
-
-        function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
-
-        const AbstractType& return_type = type_translator_.BuildVariableType();
-        closure.set_result_type(return_type);
-        function_node_helper.SetJustRead(FunctionNodeHelper::kReturnType);
-        // The closure has no body.
-        function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
-
-        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
-        pool.SetObjectAt(i, closure);
-
-        // Continue reading the constant pool entries inside the opened
-        // ActiveTypeParametersScope until the scope gets closed by a
-        // kEndClosureFunctionScope tag, in which case control returns here.
-        i = ReadPoolEntries(function, closure, pool, i + 1);
-        // Pool entry at index i has been set to null, because it was a
-        // kEndClosureFunctionScope.
-        ASSERT(pool.ObjectAt(i) == Object::null());
-        continue;
-      }
-      case ConstantPoolTag::kEndClosureFunctionScope: {
-        // Entry is not used and set to null.
-        obj = Object::null();
-        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
-        pool.SetObjectAt(i, obj);
-        return i;  // The caller will close the scope.
-      } break;
-      case ConstantPoolTag::kNativeEntry: {
-        name = H.DartString(helper_->ReadStringReference()).raw();
-        obj = NativeEntry(function, name);
-      } break;
-      case ConstantPoolTag::kSubtypeTestCache: {
-        obj = SubtypeTestCache::New();
-      } break;
-      default:
-        UNREACHABLE();
-    }
-    pool.SetTypeAt(i, ObjectPool::kTaggedObject);
-    pool.SetObjectAt(i, obj);
-  }
-  // Return the index of the last read pool entry.
-  return obj_count - 1;
-}
-
-RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
-  intptr_t size = helper_->reader_.ReadUInt();
-  intptr_t offset = helper_->reader_.offset();
-  const uint8_t* data = helper_->reader_.BufferAt(offset);
-  helper_->reader_.set_offset(offset + size);
-
-  // Create and return code object.
-  return Code::FinalizeBytecode(reinterpret_cast<const void*>(data), size,
-                                pool);
-}
-
-void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
-  const intptr_t try_block_count = helper_->reader_.ReadListLength();
-  if (try_block_count > 0) {
-    const ObjectPool& pool =
-        ObjectPool::Handle(helper_->zone_, bytecode.object_pool());
-    AbstractType& handler_type = AbstractType::Handle(helper_->zone_);
-    Array& handler_types = Array::ZoneHandle(helper_->zone_);
-    DescriptorList* pc_descriptors_list =
-        new (helper_->zone_) DescriptorList(64);
-    ExceptionHandlerList* exception_handlers_list =
-        new (helper_->zone_) ExceptionHandlerList();
-
-    // Encoding of ExceptionsTable is described in
-    // pkg/vm/lib/bytecode/exceptions.dart.
-    for (intptr_t try_index = 0; try_index < try_block_count; try_index++) {
-      intptr_t outer_try_index_plus1 = helper_->reader_.ReadUInt();
-      intptr_t outer_try_index = outer_try_index_plus1 - 1;
-      intptr_t start_pc = helper_->reader_.ReadUInt();
-      intptr_t end_pc = helper_->reader_.ReadUInt();
-      intptr_t handler_pc = helper_->reader_.ReadUInt();
-      uint8_t flags = helper_->reader_.ReadByte();
-      const uint8_t kFlagNeedsStackTrace = 1 << 0;
-      const uint8_t kFlagIsSynthetic = 1 << 1;
-      const bool needs_stacktrace = (flags & kFlagNeedsStackTrace) != 0;
-      const bool is_generated = (flags & kFlagIsSynthetic) != 0;
-      intptr_t type_count = helper_->reader_.ReadListLength();
-      ASSERT(type_count > 0);
-      handler_types = Array::New(type_count, Heap::kOld);
-      for (intptr_t i = 0; i < type_count; i++) {
-        intptr_t type_index = helper_->reader_.ReadUInt();
-        ASSERT(type_index < pool.Length());
-        handler_type ^= pool.ObjectAt(type_index);
-        handler_types.SetAt(i, handler_type);
-      }
-      pc_descriptors_list->AddDescriptor(RawPcDescriptors::kOther, start_pc,
-                                         Thread::kNoDeoptId,
-                                         TokenPosition::kNoSource, try_index);
-      pc_descriptors_list->AddDescriptor(RawPcDescriptors::kOther, end_pc,
-                                         Thread::kNoDeoptId,
-                                         TokenPosition::kNoSource, -1);
-
-      exception_handlers_list->AddHandler(
-          try_index, outer_try_index, handler_pc, TokenPosition::kNoSource,
-          is_generated, handler_types, needs_stacktrace);
-    }
-    const PcDescriptors& descriptors = PcDescriptors::Handle(
-        helper_->zone_,
-        pc_descriptors_list->FinalizePcDescriptors(bytecode.PayloadStart()));
-    bytecode.set_pc_descriptors(descriptors);
-    const ExceptionHandlers& handlers = ExceptionHandlers::Handle(
-        helper_->zone_, exception_handlers_list->FinalizeExceptionHandlers(
-                            bytecode.PayloadStart()));
-    bytecode.set_exception_handlers(handlers);
-  } else {
-    bytecode.set_pc_descriptors(Object::empty_descriptors());
-    bytecode.set_exception_handlers(Object::empty_exception_handlers());
-  }
-}
-
-RawTypedData* BytecodeMetadataHelper::NativeEntry(const Function& function,
-                                                  const String& external_name) {
-  Zone* zone = helper_->zone_;
-  MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
-  // This list of recognized methods must be kept in sync with the list of
-  // methods handled specially by the NativeCall bytecode in the interpreter.
-  switch (kind) {
-    case MethodRecognizer::kObjectEquals:
-    case MethodRecognizer::kStringBaseLength:
-    case MethodRecognizer::kStringBaseIsEmpty:
-    case MethodRecognizer::kGrowableArrayLength:
-    case MethodRecognizer::kObjectArrayLength:
-    case MethodRecognizer::kImmutableArrayLength:
-    case MethodRecognizer::kTypedDataLength:
-    case MethodRecognizer::kClassIDgetID:
-    case MethodRecognizer::kGrowableArrayCapacity:
-    case MethodRecognizer::kListFactory:
-    case MethodRecognizer::kObjectArrayAllocate:
-    case MethodRecognizer::kLinkedHashMap_getIndex:
-    case MethodRecognizer::kLinkedHashMap_setIndex:
-    case MethodRecognizer::kLinkedHashMap_getData:
-    case MethodRecognizer::kLinkedHashMap_setData:
-    case MethodRecognizer::kLinkedHashMap_getHashMask:
-    case MethodRecognizer::kLinkedHashMap_setHashMask:
-    case MethodRecognizer::kLinkedHashMap_getUsedData:
-    case MethodRecognizer::kLinkedHashMap_setUsedData:
-    case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
-    case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
-      break;
-    default:
-      kind = MethodRecognizer::kUnknown;
-  }
-  NativeFunctionWrapper trampoline = NULL;
-  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 {
-      const Class& cls = Class::Handle(zone, function.Owner());
-      const Library& library = Library::Handle(zone, cls.library());
-      Dart_NativeEntryResolver resolver = library.native_entry_resolver();
-      const bool is_bootstrap_native = Bootstrap::IsBootstrapResolver(resolver);
-      const int num_params =
-          NativeArguments::ParameterCountForResolution(function);
-      bool is_auto_scope = true;
-      native_function = NativeEntry::ResolveNative(library, external_name,
-                                                   num_params, &is_auto_scope);
-      ASSERT(native_function != NULL);  // TODO(regis): Should we throw instead?
-      if (is_bootstrap_native) {
-        trampoline = &NativeEntry::BootstrapNativeCallWrapper;
-      } else if (is_auto_scope) {
-        trampoline = &NativeEntry::AutoScopeNativeCallWrapper;
-      } else {
-        trampoline = &NativeEntry::NoScopeNativeCallWrapper;
-      }
-    }
-    argc_tag = NativeArguments::ComputeArgcTag(function);
-  }
-  // TODO(regis): Introduce a new VM class subclassing Object and containing
-  // these four untagged values.
-#ifdef ARCH_IS_32_BIT
-  const TypedData& native_entry = TypedData::Handle(
-      zone, TypedData::New(kTypedDataUint32ArrayCid, 4, Heap::kOld));
-  native_entry.SetUint32(0 << 2, static_cast<uint32_t>(kind));
-  native_entry.SetUint32(1 << 2, reinterpret_cast<uint32_t>(trampoline));
-  native_entry.SetUint32(2 << 2, reinterpret_cast<uint32_t>(native_function));
-  native_entry.SetUint32(3 << 2, static_cast<uint32_t>(argc_tag));
-#else
-  const TypedData& native_entry = TypedData::Handle(
-      zone, TypedData::New(kTypedDataUint64ArrayCid, 4, Heap::kOld));
-  native_entry.SetUint64(0 << 3, static_cast<uint64_t>(kind));
-  native_entry.SetUint64(1 << 3, reinterpret_cast<uint64_t>(trampoline));
-  native_entry.SetUint64(2 << 3, reinterpret_cast<uint64_t>(native_function));
-  native_entry.SetUint64(3 << 3, static_cast<uint64_t>(argc_tag));
-#endif
-  return native_entry.raw();
-}
-#endif  // defined(DART_USE_INTERPRETER)
-
-StreamingScopeBuilder::StreamingScopeBuilder(ParsedFunction* parsed_function)
-    : result_(NULL),
-      parsed_function_(parsed_function),
-      translation_helper_(Thread::Current()),
-      zone_(translation_helper_.zone()),
-      current_function_scope_(NULL),
-      scope_(NULL),
-      depth_(0),
-      name_index_(0),
-      needs_expr_temp_(false),
-      builder_(new StreamingFlowGraphBuilder(
-          &translation_helper_,
-          Script::Handle(Z, parsed_function->function().script()),
-          zone_,
-          ExternalTypedData::Handle(Z,
-                                    parsed_function->function().KernelData()),
-          parsed_function->function().KernelDataProgramOffset(),
-          &active_class_)),
-      type_translator_(builder_, &active_class_, /*finalize=*/true) {
-  H.InitFromScript(builder_->script());
-  ASSERT(type_translator_.active_class_ == &active_class_);
-  ASSERT(builder_->type_translator_.active_class_ == &active_class_);
-}
-
-StreamingScopeBuilder::~StreamingScopeBuilder() {
-  delete builder_;
-}
-
-ScopeBuildingResult* StreamingScopeBuilder::BuildScopes() {
-  if (result_ != NULL) return result_;
-
-  ASSERT(scope_ == NULL && depth_.loop_ == 0 && depth_.function_ == 0);
-  result_ = new (Z) ScopeBuildingResult();
-
-  const Function& function = parsed_function_->function();
-
-  // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
-  // e.g. for type translation.
-  const Class& klass = Class::Handle(zone_, function.Owner());
-
-  Function& outermost_function = Function::Handle(Z);
-  builder_->DiscoverEnclosingElements(Z, function, &outermost_function);
-
-  ActiveClassScope active_class_scope(&active_class_, &klass);
-  ActiveMemberScope active_member(&active_class_, &outermost_function);
-  ActiveTypeParametersScope active_type_params(&active_class_, function, Z);
-
-  LocalScope* enclosing_scope = NULL;
-  if (function.IsImplicitClosureFunction() && !function.is_static()) {
-    // Create artificial enclosing scope for the tear-off that contains
-    // captured receiver value. This ensure that AssertAssignable will correctly
-    // load instantiator type arguments if they are needed.
-    Class& klass = Class::Handle(Z, function.Owner());
-    Type& klass_type = H.GetCanonicalType(klass);
-    result_->this_variable =
-        MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                     Symbols::This(), klass_type);
-    result_->this_variable->set_index(VariableIndex(0));
-    result_->this_variable->set_is_captured();
-    enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
-    enclosing_scope->set_context_level(0);
-    enclosing_scope->AddVariable(result_->this_variable);
-  } else if (function.IsLocalFunction()) {
-    enclosing_scope = LocalScope::RestoreOuterScope(
-        ContextScope::Handle(Z, function.context_scope()));
-  }
-  current_function_scope_ = scope_ = new (Z) LocalScope(enclosing_scope, 0, 0);
-  scope_->set_begin_token_pos(function.token_pos());
-  scope_->set_end_token_pos(function.end_token_pos());
-
-  // Add function type arguments variable before current context variable.
-  if (I->reify_generic_functions() &&
-      (function.IsGeneric() || function.HasGenericParent())) {
-    LocalVariable* type_args_var = MakeVariable(
-        TokenPosition::kNoSource, TokenPosition::kNoSource,
-        Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
-    scope_->AddVariable(type_args_var);
-    parsed_function_->set_function_type_arguments(type_args_var);
-  }
-
-  if (parsed_function_->has_arg_desc_var()) {
-    needs_expr_temp_ = true;
-    scope_->AddVariable(parsed_function_->arg_desc_var());
-  }
-
-  LocalVariable* context_var = parsed_function_->current_context_var();
-  context_var->set_is_forced_stack();
-  scope_->AddVariable(context_var);
-
-  parsed_function_->SetNodeSequence(
-      new SequenceNode(TokenPosition::kNoSource, scope_));
-
-  builder_->SetOffset(function.kernel_offset());
-
-  FunctionNodeHelper function_node_helper(builder_);
-  const ProcedureAttributesMetadata attrs =
-      builder_->procedure_attributes_metadata_helper_.GetProcedureAttributes(
-          function.kernel_offset());
-
-  switch (function.kind()) {
-    case RawFunction::kClosureFunction:
-    case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kRegularFunction:
-    case RawFunction::kGetterFunction:
-    case RawFunction::kSetterFunction:
-    case RawFunction::kConstructor: {
-      const Tag tag = builder_->PeekTag();
-      builder_->ReadUntilFunctionNode();
-      function_node_helper.ReadUntilExcluding(
-          FunctionNodeHelper::kPositionalParameters);
-      current_function_async_marker_ = function_node_helper.async_marker_;
-      // NOTE: FunctionNode is read further below the if.
-
-      intptr_t pos = 0;
-      if (function.IsClosureFunction()) {
-        LocalVariable* closure_parameter = MakeVariable(
-            TokenPosition::kNoSource, TokenPosition::kNoSource,
-            Symbols::ClosureParameter(), AbstractType::dynamic_type());
-        closure_parameter->set_is_forced_stack();
-        scope_->InsertParameterAt(pos++, closure_parameter);
-      } else if (!function.is_static()) {
-        // We use [is_static] instead of [IsStaticFunction] because the latter
-        // returns `false` for constructors.
-        Class& klass = Class::Handle(Z, function.Owner());
-        Type& klass_type = H.GetCanonicalType(klass);
-        LocalVariable* variable =
-            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         Symbols::This(), klass_type);
-        scope_->InsertParameterAt(pos++, variable);
-        result_->this_variable = variable;
-
-        // We visit instance field initializers because they might contain
-        // [Let] expressions and we need to have a mapping.
-        if (tag == kConstructor) {
-          Class& parent_class = Class::Handle(Z, function.Owner());
-          Array& class_fields = Array::Handle(Z, parent_class.fields());
-          Field& class_field = Field::Handle(Z);
-          for (intptr_t i = 0; i < class_fields.Length(); ++i) {
-            class_field ^= class_fields.At(i);
-            if (!class_field.is_static()) {
-              ExternalTypedData& kernel_data =
-                  ExternalTypedData::Handle(Z, class_field.KernelData());
-              ASSERT(!kernel_data.IsNull());
-              intptr_t field_offset = class_field.kernel_offset();
-              AlternativeReadingScope alt(&builder_->reader_, &kernel_data,
-                                          field_offset);
-              FieldHelper field_helper(builder_);
-              field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
-              Tag initializer_tag =
-                  builder_->ReadTag();  // read first part of initializer.
-              if (initializer_tag == kSomething) {
-                EnterScope(field_offset);
-                VisitExpression();  // read initializer.
-                ExitScope(field_helper.position_, field_helper.end_position_);
-              }
-            }
-          }
-        }
-      } else if (function.IsFactory()) {
-        LocalVariable* variable = MakeVariable(
-            TokenPosition::kNoSource, TokenPosition::kNoSource,
-            Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type());
-        scope_->InsertParameterAt(pos++, variable);
-        result_->type_arguments_variable = variable;
-      }
-
-      ParameterTypeCheckMode type_check_mode = kTypeCheckAllParameters;
-      if (function.IsNonImplicitClosureFunction()) {
-        type_check_mode = kTypeCheckAllParameters;
-      } else if (function.IsImplicitClosureFunction()) {
-        if (MethodCanSkipTypeChecksForNonCovariantArguments(
-                Function::Handle(Z, function.parent_function()), attrs)) {
-          // This is a tear-off of an instance method that can not be reached
-          // from any dynamic invocation. The method would not check any
-          // parameters except covariant ones and those annotated with
-          // generic-covariant-impl. Which means that we have to check
-          // the rest in the tear-off itself.
-          type_check_mode =
-              kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod;
-        }
-      } else {
-        if (function.is_static()) {
-          // In static functions we don't check anything.
-          type_check_mode = kTypeCheckForStaticFunction;
-        } else if (MethodCanSkipTypeChecksForNonCovariantArguments(function,
-                                                                   attrs)) {
-          // If the current function is never a target of a dynamic invocation
-          // and this parameter is not marked with generic-covariant-impl
-          // (which means that among all super-interfaces no type parameters
-          // ever occur at the position of this parameter) then we don't need
-          // to check this parameter on the callee side, because strong mode
-          // guarantees that it was checked at the caller side.
-          type_check_mode = kTypeCheckForNonDynamicallyInvokedMethod;
-        }
-      }
-
-      // Continue reading FunctionNode:
-      // read positional_parameters and named_parameters.
-      AddPositionalAndNamedParameters(pos, type_check_mode, attrs);
-
-      // We generate a synthetic body for implicit closure functions - which
-      // will forward the call to the real function.
-      //     -> see BuildGraphOfImplicitClosureFunction
-      if (!function.IsImplicitClosureFunction()) {
-        builder_->SetOffset(function.kernel_offset());
-        first_body_token_position_ = TokenPosition::kNoSource;
-        VisitNode();
-
-        // TODO(jensj): HACK: Push the begin token to after any parameters to
-        // avoid crash when breaking on definition line of async method in
-        // debugger. It seems that another scope needs to be added
-        // in which captures are made, but I can't make that work.
-        // This 'solution' doesn't crash, but I cannot see the parameters at
-        // that particular breakpoint either.
-        // Also push the end token to after the "}" to avoid crashing on
-        // stepping past the last line (to the "}" character).
-        if (first_body_token_position_.IsReal()) {
-          scope_->set_begin_token_pos(first_body_token_position_);
-        }
-        if (scope_->end_token_pos().IsReal()) {
-          scope_->set_end_token_pos(scope_->end_token_pos().Next());
-        }
-      }
-      break;
-    }
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitStaticFinalGetter:
-    case RawFunction::kImplicitSetter: {
-      ASSERT(builder_->PeekTag() == kField);
-      if (IsFieldInitializer(function, Z)) {
-        VisitNode();
-        break;
-      }
-      const bool is_setter = function.IsImplicitSetterFunction();
-      const bool is_method = !function.IsStaticFunction();
-      intptr_t pos = 0;
-      if (is_method) {
-        Class& klass = Class::Handle(Z, function.Owner());
-        Type& klass_type = H.GetCanonicalType(klass);
-        LocalVariable* variable =
-            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         Symbols::This(), klass_type);
-        scope_->InsertParameterAt(pos++, variable);
-        result_->this_variable = variable;
-      }
-      if (is_setter) {
-        result_->setter_value = MakeVariable(
-            TokenPosition::kNoSource, TokenPosition::kNoSource,
-            Symbols::Value(),
-            AbstractType::ZoneHandle(Z, function.ParameterTypeAt(pos)));
-        scope_->InsertParameterAt(pos++, result_->setter_value);
-
-        if (is_method &&
-            MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
-          FieldHelper field_helper(builder_);
-          field_helper.ReadUntilIncluding(FieldHelper::kFlags);
-
-          if (!field_helper.IsCovariant() &&
-              (!field_helper.IsGenericCovariantImpl() ||
-               (!attrs.has_non_this_uses && !attrs.has_tearoff_uses))) {
-            result_->setter_value->set_type_check_mode(
-                LocalVariable::kTypeCheckedByCaller);
-          }
-        }
-      }
-      break;
-    }
-    case RawFunction::kDynamicInvocationForwarder: {
-      if (builder_->PeekTag() == kField) {
-#ifdef DEBUG
-        String& name = String::Handle(Z, function.name());
-        ASSERT(Function::IsDynamicInvocationForwaderName(name));
-        name = Function::DemangleDynamicInvocationForwarderName(name);
-        ASSERT(Field::IsSetterName(name));
-#endif
-        // Create [this] variable.
-        const Class& klass = Class::Handle(Z, function.Owner());
-        result_->this_variable =
-            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         Symbols::This(), H.GetCanonicalType(klass));
-        scope_->InsertParameterAt(0, result_->this_variable);
-
-        // Create setter value variable.
-        result_->setter_value = MakeVariable(
-            TokenPosition::kNoSource, TokenPosition::kNoSource,
-            Symbols::Value(),
-            AbstractType::ZoneHandle(Z, function.ParameterTypeAt(1)));
-        scope_->InsertParameterAt(1, result_->setter_value);
-      } else {
-        builder_->ReadUntilFunctionNode();
-        function_node_helper.ReadUntilExcluding(
-            FunctionNodeHelper::kPositionalParameters);
-
-        // Create [this] variable.
-        intptr_t pos = 0;
-        Class& klass = Class::Handle(Z, function.Owner());
-        result_->this_variable =
-            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         Symbols::This(), H.GetCanonicalType(klass));
-        scope_->InsertParameterAt(pos++, result_->this_variable);
-
-        // Create all positional and named parameters.
-        AddPositionalAndNamedParameters(
-            pos, kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
-            attrs);
-      }
-      break;
-    }
-    case RawFunction::kMethodExtractor: {
-      // Add a receiver parameter.  Though it is captured, we emit code to
-      // explicitly copy it to a fixed offset in a freshly-allocated context
-      // instead of using the generic code for regular functions.
-      // Therefore, it isn't necessary to mark it as captured here.
-      Class& klass = Class::Handle(Z, function.Owner());
-      Type& klass_type = H.GetCanonicalType(klass);
-      LocalVariable* variable =
-          MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                       Symbols::This(), klass_type);
-      scope_->InsertParameterAt(0, variable);
-      result_->this_variable = variable;
-      break;
-    }
-    case RawFunction::kNoSuchMethodDispatcher:
-    case RawFunction::kInvokeFieldDispatcher:
-      for (intptr_t i = 0; i < function.NumParameters(); ++i) {
-        LocalVariable* variable =
-            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         String::ZoneHandle(Z, function.ParameterNameAt(i)),
-                         AbstractType::dynamic_type());
-        scope_->InsertParameterAt(i, variable);
-      }
-      break;
-    case RawFunction::kSignatureFunction:
-    case RawFunction::kIrregexpFunction:
-      UNREACHABLE();
-  }
-  if (needs_expr_temp_ || function.is_no_such_method_forwarder()) {
-    scope_->AddVariable(parsed_function_->EnsureExpressionTemp());
-  }
-  parsed_function_->AllocateVariables();
-
-  return result_;
-}
-
-void StreamingScopeBuilder::ReportUnexpectedTag(const char* variant, Tag tag) {
-  H.ReportError(builder_->script(), TokenPosition::kNoSource,
-                "Unexpected tag %d (%s) in %s, expected %s", tag,
-                Reader::TagName(tag),
-                parsed_function_->function().ToQualifiedCString(), variant);
-}
-
-void StreamingScopeBuilder::VisitNode() {
-  Tag tag = builder_->PeekTag();
-  switch (tag) {
-    case kConstructor:
-      VisitConstructor();
-      return;
-    case kProcedure:
-      VisitProcedure();
-      return;
-    case kField:
-      VisitField();
-      return;
-    case kFunctionNode:
-      VisitFunctionNode();
-      return;
-    default:
-      UNIMPLEMENTED();
-      return;
-  }
-}
-
-void StreamingScopeBuilder::VisitConstructor() {
-  // Field initializers that come from non-static field declarations are
-  // compiled as if they appear in the constructor initializer list.  This is
-  // important for closure-valued field initializers because the VM expects the
-  // corresponding closure functions to appear as if they were nested inside the
-  // constructor.
-  ConstructorHelper constructor_helper(builder_);
-  constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
-  {
-    const Function& function = parsed_function_->function();
-    Class& parent_class = Class::Handle(Z, function.Owner());
-    Array& class_fields = Array::Handle(Z, parent_class.fields());
-    Field& class_field = Field::Handle(Z);
-    for (intptr_t i = 0; i < class_fields.Length(); ++i) {
-      class_field ^= class_fields.At(i);
-      if (!class_field.is_static()) {
-        ExternalTypedData& kernel_data =
-            ExternalTypedData::Handle(Z, class_field.KernelData());
-        ASSERT(!kernel_data.IsNull());
-        intptr_t field_offset = class_field.kernel_offset();
-        AlternativeReadingScope alt(&builder_->reader_, &kernel_data,
-                                    field_offset);
-        FieldHelper field_helper(builder_);
-        field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
-        Tag initializer_tag = builder_->ReadTag();
-        if (initializer_tag == kSomething) {
-          VisitExpression();  // read initializer.
-        }
-      }
-    }
-  }
-
-  // Visit children (note that there's no reason to visit the name).
-  VisitFunctionNode();
-  intptr_t list_length =
-      builder_->ReadListLength();  // read initializers list length.
-  for (intptr_t i = 0; i < list_length; i++) {
-    VisitInitializer();
-  }
-}
-
-void StreamingScopeBuilder::VisitProcedure() {
-  ProcedureHelper procedure_helper(builder_);
-  procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
-  if (builder_->ReadTag() == kSomething) {
-    VisitFunctionNode();
-  }
-}
-
-void StreamingScopeBuilder::VisitField() {
-  FieldHelper field_helper(builder_);
-  field_helper.ReadUntilExcluding(FieldHelper::kType);
-  VisitDartType();                // read type.
-  Tag tag = builder_->ReadTag();  // read initializer (part 1).
-  if (tag == kSomething) {
-    VisitExpression();  // read initializer (part 2).
-  }
-}
-
-void StreamingScopeBuilder::VisitFunctionNode() {
-  FunctionNodeHelper function_node_helper(builder_);
-  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
-
-  intptr_t list_length =
-      builder_->ReadListLength();  // read type_parameters list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    TypeParameterHelper helper(builder_);
-    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
-    VisitDartType();                    // read ith bound.
-    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
-    if (builder_->ReadTag() == kSomething) {
-      VisitDartType();  // read ith default type.
-    }
-    helper.Finish();
-  }
-  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
-
-  if (FLAG_causal_async_stacks &&
-      (function_node_helper.dart_async_marker_ == FunctionNodeHelper::kAsync ||
-       function_node_helper.dart_async_marker_ ==
-           FunctionNodeHelper::kAsyncStar)) {
-    LocalVariable* asyncStackTraceVar = MakeVariable(
-        TokenPosition::kNoSource, TokenPosition::kNoSource,
-        Symbols::AsyncStackTraceVar(), AbstractType::dynamic_type());
-    scope_->AddVariable(asyncStackTraceVar);
-  }
-
-  if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
-    LocalScope* scope = parsed_function_->node_sequence()->scope();
-    intptr_t offset = parsed_function_->function().num_fixed_parameters();
-    for (intptr_t i = 0;
-         i < parsed_function_->function().NumOptionalPositionalParameters();
-         i++) {
-      scope->VariableAt(offset + i)->set_is_forced_stack();
-    }
-  }
-
-  // Read (but don't visit) the positional and named parameters, because they've
-  // already been added to the scope.
-  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody);
-
-  if (builder_->ReadTag() == kSomething) {
-    PositionScope scope(&builder_->reader_);
-    VisitStatement();  // Read body
-    first_body_token_position_ = builder_->reader_.min_position();
-  }
-
-  // Ensure that :await_jump_var, :await_ctx_var, :async_op,
-  // :async_completer and :async_stack_trace are captured.
-  if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
-    {
-      LocalVariable* temp = NULL;
-      LookupCapturedVariableByName(
-          (depth_.function_ == 0) ? &result_->yield_jump_variable : &temp,
-          Symbols::AwaitJumpVar());
-    }
-    {
-      LocalVariable* temp = NULL;
-      LookupCapturedVariableByName(
-          (depth_.function_ == 0) ? &result_->yield_context_variable : &temp,
-          Symbols::AwaitContextVar());
-    }
-    {
-      LocalVariable* temp =
-          scope_->LookupVariable(Symbols::AsyncOperation(), true);
-      if (temp != NULL) {
-        scope_->CaptureVariable(temp);
-      }
-    }
-    {
-      LocalVariable* temp =
-          scope_->LookupVariable(Symbols::AsyncCompleter(), true);
-      if (temp != NULL) {
-        scope_->CaptureVariable(temp);
-      }
-    }
-    if (FLAG_causal_async_stacks) {
-      LocalVariable* temp =
-          scope_->LookupVariable(Symbols::AsyncStackTraceVar(), true);
-      if (temp != NULL) {
-        scope_->CaptureVariable(temp);
-      }
-    }
-  }
-}
-
-void StreamingScopeBuilder::VisitInitializer() {
-  Tag tag = builder_->ReadTag();
-  builder_->ReadByte();  // read isSynthetic flag.
-  switch (tag) {
-    case kInvalidInitializer:
-      return;
-    case kFieldInitializer:
-      builder_->SkipCanonicalNameReference();  // read field_reference.
-      VisitExpression();                       // read value.
-      return;
-    case kSuperInitializer:
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      VisitArguments();                        // read arguments.
-      return;
-    case kRedirectingInitializer:
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      VisitArguments();                        // read arguments.
-      return;
-    case kLocalInitializer:
-      VisitVariableDeclaration();  // read variable.
-      return;
-    case kAssertInitializer:
-      VisitStatement();
-      return;
-    default:
-      ReportUnexpectedTag("initializer", tag);
-      UNREACHABLE();
-  }
-}
-
-void StreamingScopeBuilder::VisitExpression() {
-  uint8_t payload = 0;
-  Tag tag = builder_->ReadTag(&payload);
-  switch (tag) {
-    case kInvalidExpression:
-      builder_->ReadPosition();
-      builder_->SkipStringReference();
-      return;
-    case kVariableGet: {
-      builder_->ReadPosition();  // read position.
-      intptr_t variable_kernel_offset =
-          builder_->ReadUInt();          // read kernel position.
-      builder_->ReadUInt();              // read relative variable index.
-      builder_->SkipOptionalDartType();  // read promoted type.
-      LookupVariable(variable_kernel_offset);
-      return;
-    }
-    case kSpecializedVariableGet: {
-      builder_->ReadPosition();  // read position.
-      intptr_t variable_kernel_offset =
-          builder_->ReadUInt();  // read kernel position.
-      LookupVariable(variable_kernel_offset);
-      return;
-    }
-    case kVariableSet: {
-      builder_->ReadPosition();  // read position.
-      intptr_t variable_kernel_offset =
-          builder_->ReadUInt();  // read kernel position.
-      builder_->ReadUInt();      // read relative variable index.
-      LookupVariable(variable_kernel_offset);
-      VisitExpression();  // read expression.
-      return;
-    }
-    case kSpecializedVariableSet: {
-      builder_->ReadPosition();  // read position.
-      intptr_t variable_kernel_offset =
-          builder_->ReadUInt();  // read kernel position.
-      LookupVariable(variable_kernel_offset);
-      VisitExpression();  // read expression.
-      return;
-    }
-    case kPropertyGet:
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read receiver.
-      builder_->SkipName();      // read name.
-      // read interface_target_reference.
-      builder_->SkipCanonicalNameReference();
-      return;
-    case kPropertySet:
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read receiver.
-      builder_->SkipName();      // read name.
-      VisitExpression();         // read value.
-      // read interface_target_reference.
-      builder_->SkipCanonicalNameReference();
-      return;
-    case kDirectPropertyGet:
-      builder_->ReadPosition();                // read position.
-      VisitExpression();                       // read receiver.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      return;
-    case kDirectPropertySet:
-      builder_->ReadPosition();                // read position.
-      VisitExpression();                       // read receiver.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      VisitExpression();                       // read value·
-      return;
-    case kSuperPropertyGet:
-      HandleSpecialLoad(&result_->this_variable, Symbols::This());
-      builder_->ReadPosition();                // read position.
-      builder_->SkipName();                    // read name.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      return;
-    case kSuperPropertySet:
-      HandleSpecialLoad(&result_->this_variable, Symbols::This());
-      builder_->ReadPosition();                // read position.
-      builder_->SkipName();                    // read name.
-      VisitExpression();                       // read value.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      return;
-    case kStaticGet:
-      builder_->ReadPosition();                // read position.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      return;
-    case kStaticSet:
-      builder_->ReadPosition();                // read position.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      VisitExpression();                       // read expression.
-      return;
-    case kMethodInvocation:
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read receiver.
-      builder_->SkipName();      // read name.
-      VisitArguments();          // read arguments.
-      // read interface_target_reference.
-      builder_->SkipCanonicalNameReference();
-      return;
-    case kDirectMethodInvocation:
-      builder_->ReadPosition();                // read position.
-      VisitExpression();                       // read receiver.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      VisitArguments();                        // read arguments.
-      return;
-    case kSuperMethodInvocation:
-      HandleSpecialLoad(&result_->this_variable, Symbols::This());
-      builder_->ReadPosition();  // read position.
-      builder_->SkipName();      // read name.
-      VisitArguments();          // read arguments.
-      // read interface_target_reference.
-      builder_->SkipCanonicalNameReference();
-      return;
-    case kStaticInvocation:
-    case kConstStaticInvocation:
-      builder_->ReadPosition();                // read position.
-      builder_->SkipCanonicalNameReference();  // read procedure_reference.
-      VisitArguments();                        // read arguments.
-      return;
-    case kConstructorInvocation:
-    case kConstConstructorInvocation:
-      builder_->ReadPosition();                // read position.
-      builder_->SkipCanonicalNameReference();  // read target_reference.
-      VisitArguments();                        // read arguments.
-      return;
-    case kNot:
-      VisitExpression();  // read expression.
-      return;
-    case kLogicalExpression:
-      needs_expr_temp_ = true;
-      VisitExpression();       // read left.
-      builder_->SkipBytes(1);  // read operator.
-      VisitExpression();       // read right.
-      return;
-    case kConditionalExpression: {
-      needs_expr_temp_ = true;
-      VisitExpression();                 // read condition.
-      VisitExpression();                 // read then.
-      VisitExpression();                 // read otherwise.
-      builder_->SkipOptionalDartType();  // read unused static type.
-      return;
-    }
-    case kStringConcatenation: {
-      builder_->ReadPosition();                           // read position.
-      intptr_t list_length = builder_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitExpression();  // read ith expression.
-      }
-      return;
-    }
-    case kIsExpression:
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read operand.
-      VisitDartType();           // read type.
-      return;
-    case kAsExpression:
-      builder_->ReadPosition();  // read position.
-      builder_->ReadFlags();     // read flags.
-      VisitExpression();         // read operand.
-      VisitDartType();           // read type.
-      return;
-    case kSymbolLiteral:
-      builder_->SkipStringReference();  // read index into string table.
-      return;
-    case kTypeLiteral:
-      VisitDartType();  // read type.
-      return;
-    case kThisExpression:
-      HandleSpecialLoad(&result_->this_variable, Symbols::This());
-      return;
-    case kRethrow:
-      builder_->ReadPosition();  // read position.
-      return;
-    case kThrow:
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read expression.
-      return;
-    case kListLiteral:
-    case kConstListLiteral: {
-      builder_->ReadPosition();                           // read position.
-      VisitDartType();                                    // read type.
-      intptr_t list_length = builder_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitExpression();  // read ith expression.
-      }
-      return;
-    }
-    case kMapLiteral:
-    case kConstMapLiteral: {
-      builder_->ReadPosition();                           // read position.
-      VisitDartType();                                    // read key type.
-      VisitDartType();                                    // read value type.
-      intptr_t list_length = builder_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitExpression();  // read ith key.
-        VisitExpression();  // read ith value.
-      }
-      return;
-    }
-    case kFunctionExpression: {
-      intptr_t offset =
-          builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-      builder_->ReadPosition();          // read position.
-      HandleLocalFunction(offset);       // read function node.
-      return;
-    }
-    case kLet: {
-      PositionScope scope(&builder_->reader_);
-      intptr_t offset =
-          builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-
-      EnterScope(offset);
-
-      VisitVariableDeclaration();  // read variable declaration.
-      VisitExpression();           // read expression.
-
-      ExitScope(builder_->reader_.min_position(),
-                builder_->reader_.max_position());
-      return;
-    }
-    case kBigIntLiteral:
-      builder_->SkipStringReference();  // read string reference.
-      return;
-    case kStringLiteral:
-      builder_->SkipStringReference();  // read string reference.
-      return;
-    case kSpecializedIntLiteral:
-      return;
-    case kNegativeIntLiteral:
-      builder_->ReadUInt();  // read value.
-      return;
-    case kPositiveIntLiteral:
-      builder_->ReadUInt();  // read value.
-      return;
-    case kDoubleLiteral:
-      builder_->ReadDouble();  // read value.
-      return;
-    case kTrueLiteral:
-      return;
-    case kFalseLiteral:
-      return;
-    case kNullLiteral:
-      return;
-    case kConstantExpression: {
-      builder_->SkipConstantReference();
-      return;
-    }
-    case kInstantiation: {
-      VisitExpression();
-      const intptr_t list_length =
-          builder_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitDartType();  // read ith type.
-      }
-      return;
-    }
-    case kLoadLibrary:
-    case kCheckLibraryIsLoaded:
-      builder_->ReadUInt();  // library index
-      break;
-    default:
-      ReportUnexpectedTag("expression", tag);
-      UNREACHABLE();
-  }
-}
-
-void StreamingScopeBuilder::VisitStatement() {
-  Tag tag = builder_->ReadTag();  // read tag.
-  switch (tag) {
-    case kExpressionStatement:
-      VisitExpression();  // read expression.
-      return;
-    case kBlock: {
-      PositionScope scope(&builder_->reader_);
-      intptr_t offset =
-          builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-
-      EnterScope(offset);
-
-      intptr_t list_length =
-          builder_->ReadListLength();  // read number of statements.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitStatement();  // read ith statement.
-      }
-
-      ExitScope(builder_->reader_.min_position(),
-                builder_->reader_.max_position());
-      return;
-    }
-    case kEmptyStatement:
-      return;
-    case kAssertBlock:
-      if (I->asserts()) {
-        PositionScope scope(&builder_->reader_);
-        intptr_t offset =
-            builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-
-        EnterScope(offset);
-
-        intptr_t list_length =
-            builder_->ReadListLength();  // read number of statements.
-        for (intptr_t i = 0; i < list_length; ++i) {
-          VisitStatement();  // read ith statement.
-        }
-
-        ExitScope(builder_->reader_.min_position(),
-                  builder_->reader_.max_position());
-      } else {
-        builder_->SkipStatementList();
-      }
-      return;
-    case kAssertStatement:
-      if (I->asserts()) {
-        VisitExpression();              // Read condition.
-        builder_->ReadPosition();       // read condition start offset.
-        builder_->ReadPosition();       // read condition end offset.
-        Tag tag = builder_->ReadTag();  // read (first part of) message.
-        if (tag == kSomething) {
-          VisitExpression();  // read (rest of) message.
-        }
-      } else {
-        builder_->SkipExpression();     // Read condition.
-        builder_->ReadPosition();       // read condition start offset.
-        builder_->ReadPosition();       // read condition end offset.
-        Tag tag = builder_->ReadTag();  // read (first part of) message.
-        if (tag == kSomething) {
-          builder_->SkipExpression();  // read (rest of) message.
-        }
-      }
-      return;
-    case kLabeledStatement:
-      VisitStatement();  // read body.
-      return;
-    case kBreakStatement:
-      builder_->ReadPosition();  // read position.
-      builder_->ReadUInt();      // read target_index.
-      return;
-    case kWhileStatement:
-      ++depth_.loop_;
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read condition.
-      VisitStatement();          // read body.
-      --depth_.loop_;
-      return;
-    case kDoStatement:
-      ++depth_.loop_;
-      builder_->ReadPosition();  // read position.
-      VisitStatement();          // read body.
-      VisitExpression();         // read condition.
-      --depth_.loop_;
-      return;
-    case kForStatement: {
-      PositionScope scope(&builder_->reader_);
-
-      intptr_t offset =
-          builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-
-      ++depth_.loop_;
-      EnterScope(offset);
-
-      TokenPosition position = builder_->ReadPosition();  // read position.
-      intptr_t list_length =
-          builder_->ReadListLength();  // read number of variables.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitVariableDeclaration();  // read ith variable.
-      }
-
-      Tag tag = builder_->ReadTag();  // Read first part of condition.
-      if (tag == kSomething) {
-        VisitExpression();  // read rest of condition.
-      }
-      list_length = builder_->ReadListLength();  // read number of updates.
-      for (intptr_t i = 0; i < list_length; ++i) {
-        VisitExpression();  // read ith update.
-      }
-      VisitStatement();  // read body.
-
-      ExitScope(position, builder_->reader_.max_position());
-      --depth_.loop_;
-      return;
-    }
-    case kForInStatement:
-    case kAsyncForInStatement: {
-      PositionScope scope(&builder_->reader_);
-
-      intptr_t start_offset =
-          builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-
-      builder_->ReadPosition();  // read position.
-      TokenPosition body_position =
-          builder_->ReadPosition();  // read body position.
-
-      // Notice the ordering: We skip the variable, read the iterable, go back,
-      // re-read the variable, go forward to after having read the iterable.
-      intptr_t offset = builder_->ReaderOffset();
-      builder_->SkipVariableDeclaration();  // read variable.
-      VisitExpression();                    // read iterable.
-
-      ++depth_.for_in_;
-      AddIteratorVariable();
-      ++depth_.loop_;
-      EnterScope(start_offset);
-
-      {
-        AlternativeReadingScope alt(&builder_->reader_, offset);
-        VisitVariableDeclaration();  // read variable.
-      }
-      VisitStatement();  // read body.
-
-      if (!body_position.IsReal()) {
-        body_position = builder_->reader_.min_position();
-      }
-      // TODO(jensj): From kernel_binary.cc
-      // forinstmt->variable_->set_end_position(forinstmt->position_);
-      ExitScope(body_position, builder_->reader_.max_position());
-      --depth_.loop_;
-      --depth_.for_in_;
-      return;
-    }
-    case kSwitchStatement: {
-      AddSwitchVariable();
-      builder_->ReadPosition();                     // read position.
-      VisitExpression();                            // read condition.
-      int case_count = builder_->ReadListLength();  // read number of cases.
-      for (intptr_t i = 0; i < case_count; ++i) {
-        int expression_count =
-            builder_->ReadListLength();  // read number of expressions.
-        for (intptr_t j = 0; j < expression_count; ++j) {
-          builder_->ReadPosition();  // read jth position.
-          VisitExpression();         // read jth expression.
-        }
-        builder_->ReadBool();  // read is_default.
-        VisitStatement();      // read body.
-      }
-      return;
-    }
-    case kContinueSwitchStatement:
-      builder_->ReadPosition();  // read position.
-      builder_->ReadUInt();      // read target_index.
-      return;
-    case kIfStatement:
-      builder_->ReadPosition();  // read position.
-      VisitExpression();         // read condition.
-      VisitStatement();          // read then.
-      VisitStatement();          // read otherwise.
-      return;
-    case kReturnStatement: {
-      if ((depth_.function_ == 0) && (depth_.finally_ > 0) &&
-          (result_->finally_return_variable == NULL)) {
-        const String& name = Symbols::TryFinallyReturnValue();
-        LocalVariable* variable =
-            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         name, AbstractType::dynamic_type());
-        current_function_scope_->AddVariable(variable);
-        result_->finally_return_variable = variable;
-      }
-
-      builder_->ReadPosition();       // read position
-      Tag tag = builder_->ReadTag();  // read (first part of) expression.
-      if (tag == kSomething) {
-        VisitExpression();  // read (rest of) expression.
-      }
-      return;
-    }
-    case kTryCatch: {
-      ++depth_.try_;
-      AddTryVariables();
-      VisitStatement();  // read body.
-      --depth_.try_;
-
-      ++depth_.catch_;
-      AddCatchVariables();
-
-      builder_->ReadByte();  // read flags
-      intptr_t catch_count =
-          builder_->ReadListLength();  // read number of catches.
-      for (intptr_t i = 0; i < catch_count; ++i) {
-        PositionScope scope(&builder_->reader_);
-        intptr_t offset = builder_->ReaderOffset();  // Catch has no tag.
-
-        EnterScope(offset);
-
-        builder_->ReadPosition();   // read position.
-        VisitDartType();            // Read the guard.
-        tag = builder_->ReadTag();  // read first part of exception.
-        if (tag == kSomething) {
-          VisitVariableDeclaration();  // read exception.
-        }
-        tag = builder_->ReadTag();  // read first part of stack trace.
-        if (tag == kSomething) {
-          VisitVariableDeclaration();  // read stack trace.
-        }
-        VisitStatement();  // read body.
-
-        ExitScope(builder_->reader_.min_position(),
-                  builder_->reader_.max_position());
-      }
-
-      FinalizeCatchVariables();
-
-      --depth_.catch_;
-      return;
-    }
-    case kTryFinally: {
-      ++depth_.try_;
-      ++depth_.finally_;
-      AddTryVariables();
-
-      VisitStatement();  // read body.
-
-      --depth_.finally_;
-      --depth_.try_;
-      ++depth_.catch_;
-      AddCatchVariables();
-
-      VisitStatement();  // read finalizer.
-
-      FinalizeCatchVariables();
-
-      --depth_.catch_;
-      return;
-    }
-    case kYieldStatement: {
-      builder_->ReadPosition();           // read position.
-      word flags = builder_->ReadByte();  // read flags.
-      VisitExpression();                  // read expression.
-
-      ASSERT(flags == kNativeYieldFlags);
-      if (depth_.function_ == 0) {
-        AddSwitchVariable();
-        // Promote all currently visible local variables into the context.
-        // TODO(27590) CaptureLocalVariables promotes to many variables into
-        // the scope. Mark those variables as stack_local.
-        // TODO(27590) we don't need to promote those variables that are
-        // not used across yields.
-        scope_->CaptureLocalVariables(current_function_scope_);
-      }
-      return;
-    }
-    case kVariableDeclaration:
-      VisitVariableDeclaration();  // read variable declaration.
-      return;
-    case kFunctionDeclaration: {
-      intptr_t offset =
-          builder_->ReaderOffset() - 1;  // -1 to include tag byte.
-      builder_->ReadPosition();          // read position.
-      VisitVariableDeclaration();        // read variable declaration.
-      HandleLocalFunction(offset);       // read function node.
-      return;
-    }
-    default:
-      ReportUnexpectedTag("declaration", tag);
-      UNREACHABLE();
-  }
-}
-
-void StreamingScopeBuilder::VisitArguments() {
-  builder_->ReadUInt();  // read argument_count.
-
-  // Types
-  intptr_t list_length = builder_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    VisitDartType();  // read ith type.
-  }
-
-  // Positional.
-  list_length = builder_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    VisitExpression();  // read ith positional.
-  }
-
-  // Named.
-  list_length = builder_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    builder_->SkipStringReference();  // read ith name index.
-    VisitExpression();                // read ith expression.
-  }
-}
-
-void StreamingScopeBuilder::VisitVariableDeclaration() {
-  PositionScope scope(&builder_->reader_);
-
-  intptr_t kernel_offset_no_tag = builder_->ReaderOffset();
-  VariableDeclarationHelper helper(builder_);
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-  AbstractType& type = BuildAndVisitVariableType();
-
-  // In case `declaration->IsConst()` the flow graph building will take care of
-  // evaluating the constant and setting it via
-  // `declaration->SetConstantValue()`.
-  const String& name = (H.StringSize(helper.name_index_) == 0)
-                           ? GenerateName(":var", name_index_++)
-                           : H.DartSymbolObfuscate(helper.name_index_);
-
-  Tag tag = builder_->ReadTag();  // read (first part of) initializer.
-  if (tag == kSomething) {
-    VisitExpression();  // read (actual) initializer.
-  }
-
-  // Go to next token position so it ends *after* the last potentially
-  // debuggable position in the initializer.
-  TokenPosition end_position = builder_->reader_.max_position();
-  if (end_position.IsReal()) {
-    end_position.Next();
-  }
-  LocalVariable* variable =
-      MakeVariable(helper.position_, end_position, name, type);
-  if (helper.IsFinal()) {
-    variable->set_is_final();
-  }
-  scope_->AddVariable(variable);
-  result_->locals.Insert(builder_->data_program_offset_ + kernel_offset_no_tag,
-                         variable);
-}
-
-AbstractType& StreamingScopeBuilder::BuildAndVisitVariableType() {
-  const intptr_t offset = builder_->ReaderOffset();
-  AbstractType& type = T.BuildVariableType();
-  builder_->SetOffset(offset);  // rewind
-  VisitDartType();
-  return type;
-}
-
-void StreamingScopeBuilder::VisitDartType() {
-  Tag tag = builder_->ReadTag();
-  switch (tag) {
-    case kInvalidType:
-    case kDynamicType:
-    case kVoidType:
-    case kBottomType:
-      // those contain nothing.
-      return;
-    case kInterfaceType:
-      VisitInterfaceType(false);
-      return;
-    case kSimpleInterfaceType:
-      VisitInterfaceType(true);
-      return;
-    case kFunctionType:
-      VisitFunctionType(false);
-      return;
-    case kSimpleFunctionType:
-      VisitFunctionType(true);
-      return;
-    case kTypeParameterType:
-      VisitTypeParameterType();
-      return;
-    default:
-      ReportUnexpectedTag("type", tag);
-      UNREACHABLE();
-  }
-}
-
-void StreamingScopeBuilder::VisitInterfaceType(bool simple) {
-  builder_->ReadUInt();  // read klass_name.
-  if (!simple) {
-    intptr_t length = builder_->ReadListLength();  // read number of types.
-    for (intptr_t i = 0; i < length; ++i) {
-      VisitDartType();  // read the ith type.
-    }
-  }
-}
-
-void StreamingScopeBuilder::VisitFunctionType(bool simple) {
-  if (!simple) {
-    intptr_t list_length =
-        builder_->ReadListLength();  // read type_parameters list length.
-    for (int i = 0; i < list_length; ++i) {
-      TypeParameterHelper helper(builder_);
-      helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
-      VisitDartType();  // read bound.
-      helper.ReadUntilExcludingAndSetJustRead(
-          TypeParameterHelper::kDefaultType);
-      if (builder_->ReadTag() == kSomething) {
-        VisitDartType();  // read default type.
-      }
-      helper.Finish();
-    }
-    builder_->ReadUInt();  // read required parameter count.
-    builder_->ReadUInt();  // read total parameter count.
-  }
-
-  const intptr_t positional_count =
-      builder_->ReadListLength();  // read positional_parameters list length.
-  for (intptr_t i = 0; i < positional_count; ++i) {
-    VisitDartType();  // read ith positional parameter.
-  }
-
-  if (!simple) {
-    const intptr_t named_count =
-        builder_->ReadListLength();  // read named_parameters list length.
-    for (intptr_t i = 0; i < named_count; ++i) {
-      // read string reference (i.e. named_parameters[i].name).
-      builder_->SkipStringReference();
-      VisitDartType();  // read named_parameters[i].type.
-    }
-  }
-
-  builder_->SkipListOfStrings();  // read positional parameter names.
-
-  if (!simple) {
-    builder_->SkipCanonicalNameReference();  // read typedef reference.
-  }
-
-  VisitDartType();  // read return type.
-}
-
-void StreamingScopeBuilder::VisitTypeParameterType() {
-  Function& function = Function::Handle(Z, parsed_function_->function().raw());
-  while (function.IsClosureFunction()) {
-    function = function.parent_function();
-  }
-
-  // The index here is the index identifying the type parameter binding site
-  // inside the DILL file, which uses a different indexing system than the VM
-  // uses for its 'TypeParameter's internally. This index includes both class
-  // and function type parameters.
-
-  intptr_t index = builder_->ReadUInt();  // read index for parameter.
-
-  if (function.IsFactory()) {
-    // The type argument vector is passed as the very first argument to the
-    // factory constructor function.
-    HandleSpecialLoad(&result_->type_arguments_variable,
-                      Symbols::TypeArgumentsParameter());
-  } else {
-    // If the type parameter is a parameter to this or an enclosing function, we
-    // can read it directly from the function type arguments vector later.
-    // Otherwise, the type arguments vector we need is stored on the instance
-    // object, so we need to capture 'this'.
-    Class& parent_class = Class::Handle(Z, function.Owner());
-    if (index < parent_class.NumTypeParameters()) {
-      HandleSpecialLoad(&result_->this_variable, Symbols::This());
-    }
-  }
-
-  builder_->SkipOptionalDartType();  // read bound bound.
-}
-
-void StreamingScopeBuilder::HandleLocalFunction(intptr_t parent_kernel_offset) {
-  // "Peek" ahead into the function node
-  intptr_t offset = builder_->ReaderOffset();
-
-  FunctionNodeHelper function_node_helper(builder_);
-  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
-
-  LocalScope* saved_function_scope = current_function_scope_;
-  FunctionNodeHelper::AsyncMarker saved_function_async_marker =
-      current_function_async_marker_;
-  DepthState saved_depth_state = depth_;
-  depth_ = DepthState(depth_.function_ + 1);
-  EnterScope(parent_kernel_offset);
-  current_function_scope_ = scope_;
-  current_function_async_marker_ = function_node_helper.async_marker_;
-  if (depth_.function_ == 1) {
-    FunctionScope function_scope = {offset, scope_};
-    result_->function_scopes.Add(function_scope);
-  }
-
-  int num_type_params = 0;
-  {
-    AlternativeReadingScope _(&builder_->reader_);
-    num_type_params = builder_->ReadListLength();
-  }
-  // Adding this scope here informs the type translator the type parameters of
-  // this function are now in scope, although they are not defined and will be
-  // filled in with dynamic. This is OK, since their definitions are not needed
-  // for scope building of the enclosing function.
-  TypeTranslator::TypeParameterScope scope(&type_translator_, num_type_params);
-
-  // read positional_parameters and named_parameters.
-  function_node_helper.ReadUntilExcluding(
-      FunctionNodeHelper::kPositionalParameters);
-
-  ProcedureAttributesMetadata default_attrs;
-  AddPositionalAndNamedParameters(0, kTypeCheckAllParameters, default_attrs);
-
-  // "Peek" is now done.
-  builder_->SetOffset(offset);
-
-  VisitFunctionNode();  // read function node.
-
-  ExitScope(function_node_helper.position_, function_node_helper.end_position_);
-  depth_ = saved_depth_state;
-  current_function_scope_ = saved_function_scope;
-  current_function_async_marker_ = saved_function_async_marker;
-}
-
-void StreamingScopeBuilder::EnterScope(intptr_t kernel_offset) {
-  scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_);
-  ASSERT(kernel_offset >= 0);
-  result_->scopes.Insert(kernel_offset, scope_);
-}
-
-void StreamingScopeBuilder::ExitScope(TokenPosition start_position,
-                                      TokenPosition end_position) {
-  scope_->set_begin_token_pos(start_position);
-  scope_->set_end_token_pos(end_position);
-  scope_ = scope_->parent();
-}
-
-void StreamingScopeBuilder::AddPositionalAndNamedParameters(
-    intptr_t pos,
-    ParameterTypeCheckMode type_check_mode /* = kTypeCheckAllParameters*/,
-    const ProcedureAttributesMetadata& attrs) {
-  // List of positional.
-  intptr_t list_length = builder_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    AddVariableDeclarationParameter(pos++, type_check_mode, attrs);
-  }
-
-  // List of named.
-  list_length = builder_->ReadListLength();  // read list length.
-  for (intptr_t i = 0; i < list_length; ++i) {
-    AddVariableDeclarationParameter(pos++, type_check_mode, attrs);
-  }
-}
-
-void StreamingScopeBuilder::AddVariableDeclarationParameter(
-    intptr_t pos,
-    ParameterTypeCheckMode type_check_mode,
-    const ProcedureAttributesMetadata& attrs) {
-  intptr_t kernel_offset = builder_->ReaderOffset();  // no tag.
-  const InferredTypeMetadata parameter_type =
-      builder_->inferred_type_metadata_helper_.GetInferredType(kernel_offset);
-  VariableDeclarationHelper helper(builder_);
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-  String& name = H.DartSymbolObfuscate(helper.name_index_);
-  AbstractType& type = BuildAndVisitVariableType();  // read type.
-  helper.SetJustRead(VariableDeclarationHelper::kType);
-  helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
-
-  LocalVariable* variable = MakeVariable(helper.position_, helper.position_,
-                                         name, type, &parameter_type);
-  if (helper.IsFinal()) {
-    variable->set_is_final();
-  }
-  if (variable->name().raw() == Symbols::IteratorParameter().raw()) {
-    variable->set_is_forced_stack();
-  }
-
-  const bool needs_covariant_check_in_method =
-      helper.IsCovariant() ||
-      (helper.IsGenericCovariantImpl() && attrs.has_non_this_uses);
-
-  switch (type_check_mode) {
-    case kTypeCheckAllParameters:
-      variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
-      break;
-    case kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod:
-      if (needs_covariant_check_in_method) {
-        // Don't type check covariant parameters - they will be checked by
-        // a function we forward to. Their types however are not known.
-        variable->set_type_check_mode(LocalVariable::kSkipTypeCheck);
-      } else {
-        variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
-      }
-      break;
-    case kTypeCheckForNonDynamicallyInvokedMethod:
-      if (needs_covariant_check_in_method) {
-        variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
-      } else {
-        // Types of non-covariant parameters are guaranteed to match by
-        // front-end enforcing strong mode types at call site.
-        variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
-      }
-      break;
-    case kTypeCheckForStaticFunction:
-      variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
-      break;
-  }
-  scope_->InsertParameterAt(pos, variable);
-  result_->locals.Insert(builder_->data_program_offset_ + kernel_offset,
-                         variable);
-
-  // The default value may contain 'let' bindings for which the constant
-  // evaluator needs scope bindings.
-  Tag tag = builder_->ReadTag();
-  if (tag == kSomething) {
-    VisitExpression();  // read initializer.
-  }
-}
-
-LocalVariable* StreamingScopeBuilder::MakeVariable(
-    TokenPosition declaration_pos,
-    TokenPosition token_pos,
-    const String& name,
-    const AbstractType& type,
-    const InferredTypeMetadata* param_type_md /* = NULL */) {
-  CompileType* param_type = NULL;
-  if ((param_type_md != NULL) && !param_type_md->IsTrivial()) {
-    param_type = new (Z) CompileType(CompileType::CreateNullable(
-        param_type_md->nullable, param_type_md->cid));
-  }
-  return new (Z)
-      LocalVariable(declaration_pos, token_pos, name, type, param_type);
-}
-
-void StreamingScopeBuilder::AddExceptionVariable(
-    GrowableArray<LocalVariable*>* variables,
-    const char* prefix,
-    intptr_t nesting_depth) {
-  LocalVariable* v = NULL;
-
-  // If we are inside a function with yield points then Kernel transformer
-  // could have lifted some of the auxiliary exception variables into the
-  // context to preserve them across yield points because they might
-  // be needed for rethrow.
-  // Check if it did and capture such variables instead of introducing
-  // new local ones.
-  // Note: function that wrap kSyncYielding function does not contain
-  // its own try/catches.
-  if (current_function_async_marker_ == FunctionNodeHelper::kSyncYielding) {
-    ASSERT(current_function_scope_->parent() != NULL);
-    v = current_function_scope_->parent()->LocalLookupVariable(
-        GenerateName(prefix, nesting_depth - 1));
-    if (v != NULL) {
-      scope_->CaptureVariable(v);
-    }
-  }
-
-  // No need to create variables for try/catch-statements inside
-  // nested functions.
-  if (depth_.function_ > 0) return;
-  if (variables->length() >= nesting_depth) return;
-
-  // If variable was not lifted by the transformer introduce a new
-  // one into the current function scope.
-  if (v == NULL) {
-    v = MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                     GenerateName(prefix, nesting_depth - 1),
-                     AbstractType::dynamic_type());
-
-    // If transformer did not lift the variable then there is no need
-    // to lift it into the context when we encouter a YieldStatement.
-    v->set_is_forced_stack();
-    current_function_scope_->AddVariable(v);
-  }
-
-  variables->Add(v);
-}
-
-void StreamingScopeBuilder::FinalizeExceptionVariable(
-    GrowableArray<LocalVariable*>* variables,
-    GrowableArray<LocalVariable*>* raw_variables,
-    const String& symbol,
-    intptr_t nesting_depth) {
-  // No need to create variables for try/catch-statements inside
-  // nested functions.
-  if (depth_.function_ > 0) return;
-
-  LocalVariable* variable = (*variables)[nesting_depth - 1];
-  LocalVariable* raw_variable;
-  if (variable->is_captured()) {
-    raw_variable =
-        new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                          symbol, AbstractType::dynamic_type());
-    const bool ok = scope_->AddVariable(raw_variable);
-    ASSERT(ok);
-  } else {
-    raw_variable = variable;
-  }
-  raw_variables->EnsureLength(nesting_depth, nullptr);
-  (*raw_variables)[nesting_depth - 1] = raw_variable;
-}
-
-void StreamingScopeBuilder::AddTryVariables() {
-  AddExceptionVariable(&result_->catch_context_variables,
-                       ":saved_try_context_var", depth_.try_);
-}
-
-void StreamingScopeBuilder::AddCatchVariables() {
-  AddExceptionVariable(&result_->exception_variables, ":exception",
-                       depth_.catch_);
-  AddExceptionVariable(&result_->stack_trace_variables, ":stack_trace",
-                       depth_.catch_);
-}
-
-void StreamingScopeBuilder::FinalizeCatchVariables() {
-  const intptr_t unique_id = result_->raw_variable_counter_++;
-  FinalizeExceptionVariable(
-      &result_->exception_variables, &result_->raw_exception_variables,
-      GenerateName(":raw_exception", unique_id), depth_.catch_);
-  FinalizeExceptionVariable(
-      &result_->stack_trace_variables, &result_->raw_stack_trace_variables,
-      GenerateName(":raw_stacktrace", unique_id), depth_.catch_);
-}
-
-void StreamingScopeBuilder::AddIteratorVariable() {
-  if (depth_.function_ > 0) return;
-  if (result_->iterator_variables.length() >= depth_.for_in_) return;
-
-  ASSERT(result_->iterator_variables.length() == depth_.for_in_ - 1);
-  LocalVariable* iterator =
-      MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                   GenerateName(":iterator", depth_.for_in_ - 1),
-                   AbstractType::dynamic_type());
-  current_function_scope_->AddVariable(iterator);
-  result_->iterator_variables.Add(iterator);
-}
-
-void StreamingScopeBuilder::AddSwitchVariable() {
-  if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) {
-    LocalVariable* variable =
-        MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                     Symbols::SwitchExpr(), AbstractType::dynamic_type());
-    variable->set_is_forced_stack();
-    current_function_scope_->AddVariable(variable);
-    result_->switch_variable = variable;
-  }
-}
-
-void StreamingScopeBuilder::LookupVariable(intptr_t declaration_binary_offset) {
-  LocalVariable* variable = result_->locals.Lookup(declaration_binary_offset);
-  if (variable == NULL) {
-    // We have not seen a declaration of the variable, so it must be the
-    // case that we are compiling a nested function and the variable is
-    // declared in an outer scope.  In that case, look it up in the scope by
-    // name and add it to the variable map to simplify later lookup.
-    ASSERT(current_function_scope_->parent() != NULL);
-    StringIndex var_name = builder_->GetNameFromVariableDeclaration(
-        declaration_binary_offset - builder_->data_program_offset_,
-        parsed_function_->function());
-
-    const String& name = H.DartSymbolObfuscate(var_name);
-    variable = current_function_scope_->parent()->LookupVariable(name, true);
-    ASSERT(variable != NULL);
-    result_->locals.Insert(declaration_binary_offset, variable);
-  }
-
-  if (variable->owner()->function_level() < scope_->function_level()) {
-    // We call `LocalScope->CaptureVariable(variable)` in two scenarios for two
-    // different reasons:
-    //   Scenario 1:
-    //       We need to know which variables defined in this function
-    //       are closed over by nested closures in order to ensure we will
-    //       create a [Context] object of appropriate size and store captured
-    //       variables there instead of the stack.
-    //   Scenario 2:
-    //       We need to find out which variables defined in enclosing functions
-    //       are closed over by this function/closure or nested closures. This
-    //       is necessary in order to build a fat flattened [ContextScope]
-    //       object.
-    scope_->CaptureVariable(variable);
-  } else {
-    ASSERT(variable->owner()->function_level() == scope_->function_level());
-  }
-}
-
-const String& StreamingScopeBuilder::GenerateName(const char* prefix,
-                                                  intptr_t suffix) {
-  char name[64];
-  Utils::SNPrint(name, 64, "%s%" Pd "", prefix, suffix);
-  return H.DartSymbolObfuscate(name);
-}
-
-void StreamingScopeBuilder::HandleSpecialLoad(LocalVariable** variable,
-                                              const String& symbol) {
-  if (current_function_scope_->parent() != NULL) {
-    // We are building the scope tree of a closure function and saw [node]. We
-    // lazily populate the variable using the parent function scope.
-    if (*variable == NULL) {
-      *variable =
-          current_function_scope_->parent()->LookupVariable(symbol, true);
-      ASSERT(*variable != NULL);
-    }
-  }
-
-  if ((current_function_scope_->parent() != NULL) ||
-      (scope_->function_level() > 0)) {
-    // Every scope we use the [variable] from needs to be notified of the usage
-    // in order to ensure that preserving the context scope on that particular
-    // use-site also includes the [variable].
-    scope_->CaptureVariable(*variable);
-  }
-}
-
-void StreamingScopeBuilder::LookupCapturedVariableByName(
-    LocalVariable** variable,
-    const String& name) {
-  if (*variable == NULL) {
-    *variable = scope_->LookupVariable(name, true);
-    ASSERT(*variable != NULL);
-    scope_->CaptureVariable(*variable);
-  }
-}
-
-TypeTranslator::TypeTranslator(KernelReaderHelper* helper,
-                               ActiveClass* active_class,
-                               bool finalize)
-    : helper_(helper),
-      translation_helper_(helper->translation_helper_),
-      active_class_(active_class),
-      type_parameter_scope_(NULL),
-      zone_(translation_helper_.zone()),
-      result_(AbstractType::Handle(translation_helper_.zone())),
-      finalize_(finalize) {}
-
-AbstractType& TypeTranslator::BuildType() {
-  BuildTypeInternal();
-
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return AbstractType::ZoneHandle(Z, result_.raw());
-}
-
-AbstractType& TypeTranslator::BuildTypeWithoutFinalization() {
-  bool saved_finalize = finalize_;
-  finalize_ = false;
-  BuildTypeInternal();
-  finalize_ = saved_finalize;
-
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  return AbstractType::ZoneHandle(Z, result_.raw());
-}
-
-AbstractType& TypeTranslator::BuildVariableType() {
-  AbstractType& abstract_type = BuildType();
-
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  AbstractType& type = Type::ZoneHandle(Z);
-
-  if (abstract_type.IsMalformed()) {
-    type = AbstractType::dynamic_type().raw();
-  } else {
-    type = result_.raw();
-  }
-
-  return type;
-}
-
-void TypeTranslator::BuildTypeInternal(bool invalid_as_dynamic) {
-  Tag tag = helper_->ReadTag();
-  switch (tag) {
-    case kInvalidType:
-      if (invalid_as_dynamic) {
-        result_ = Object::dynamic_type().raw();
-      } else {
-        result_ = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(Z),  // No previous error.
-            Script::Handle(Z, Script::null()), TokenPosition::kNoSource,
-            "[InvalidType] in Kernel IR.");
-      }
-      break;
-    case kDynamicType:
-      result_ = Object::dynamic_type().raw();
-      break;
-    case kVoidType:
-      result_ = Object::void_type().raw();
-      break;
-    case kBottomType:
-      result_ =
-          Class::Handle(Z, I->object_store()->null_class()).CanonicalType();
-      break;
-    case kInterfaceType:
-      BuildInterfaceType(false);
-      break;
-    case kSimpleInterfaceType:
-      BuildInterfaceType(true);
-      break;
-    case kFunctionType:
-      BuildFunctionType(false);
-      break;
-    case kSimpleFunctionType:
-      BuildFunctionType(true);
-      break;
-    case kTypeParameterType:
-      BuildTypeParameterType();
-      break;
-    default:
-      helper_->ReportUnexpectedTag("type", tag);
-      UNREACHABLE();
-  }
-}
-
-void TypeTranslator::BuildInterfaceType(bool simple) {
-  // NOTE: That an interface type like `T<A, B>` is considered to be
-  // malformed iff `T` is malformed.
-  //   => We therefore ignore errors in `A` or `B`.
-
-  NameIndex klass_name =
-      helper_->ReadCanonicalNameReference();  // read klass_name.
-
-  intptr_t length;
-  if (simple) {
-    length = 0;
-  } else {
-    length = helper_->ReadListLength();  // read type_arguments list length.
-  }
-  const TypeArguments& type_arguments =
-      BuildTypeArguments(length);  // read type arguments.
-
-  Object& klass = Object::Handle(Z, H.LookupClassByKernelClass(klass_name));
-  result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
-  if (finalize_) {
-    ASSERT(active_class_->klass != NULL);
-    result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
-  }
-}
-
-void TypeTranslator::BuildFunctionType(bool simple) {
-  Function& signature_function = Function::ZoneHandle(
-      Z, Function::NewSignatureFunction(*active_class_->klass,
-                                        active_class_->enclosing != NULL
-                                            ? *active_class_->enclosing
-                                            : Function::Handle(Z),
-                                        TokenPosition::kNoSource));
-
-  // Suspend finalization of types inside this one. They will be finalized after
-  // the whole function type is constructed.
-  //
-  // TODO(31213): Test further when nested generic function types
-  // are supported by fasta.
-  bool finalize = finalize_;
-  finalize_ = false;
-
-  if (!simple) {
-    LoadAndSetupTypeParameters(active_class_, signature_function,
-                               helper_->ReadListLength(), signature_function);
-  }
-
-  ActiveTypeParametersScope scope(
-      active_class_, &signature_function,
-      TypeArguments::Handle(Z, signature_function.type_parameters()), Z);
-
-  intptr_t required_count;
-  intptr_t all_count;
-  intptr_t positional_count;
-  if (!simple) {
-    required_count = helper_->ReadUInt();  // read required parameter count.
-    all_count = helper_->ReadUInt();       // read total parameter count.
-    positional_count =
-        helper_->ReadListLength();  // read positional_parameters list length.
-  } else {
-    positional_count =
-        helper_->ReadListLength();  // read positional_parameters list length.
-    required_count = positional_count;
-    all_count = positional_count;
-  }
-
-  const Array& parameter_types =
-      Array::Handle(Z, Array::New(1 + all_count, Heap::kOld));
-  signature_function.set_parameter_types(parameter_types);
-  const Array& parameter_names =
-      Array::Handle(Z, Array::New(1 + all_count, Heap::kOld));
-  signature_function.set_parameter_names(parameter_names);
-
-  intptr_t pos = 0;
-  parameter_types.SetAt(pos, AbstractType::dynamic_type());
-  parameter_names.SetAt(pos, H.DartSymbolPlain("_receiver_"));
-  ++pos;
-  for (intptr_t i = 0; i < positional_count; ++i, ++pos) {
-    BuildTypeInternal();  // read ith positional parameter.
-    if (result_.IsMalformed()) {
-      result_ = AbstractType::dynamic_type().raw();
-    }
-    parameter_types.SetAt(pos, result_);
-    parameter_names.SetAt(pos, H.DartSymbolPlain("noname"));
-  }
-
-  // The additional first parameter is the receiver type (set to dynamic).
-  signature_function.set_num_fixed_parameters(1 + required_count);
-  signature_function.SetNumOptionalParameters(
-      all_count - required_count, positional_count > required_count);
-
-  if (!simple) {
-    const intptr_t named_count =
-        helper_->ReadListLength();  // read named_parameters list length.
-    for (intptr_t i = 0; i < named_count; ++i, ++pos) {
-      // read string reference (i.e. named_parameters[i].name).
-      String& name = H.DartSymbolObfuscate(helper_->ReadStringReference());
-      BuildTypeInternal();  // read named_parameters[i].type.
-      if (result_.IsMalformed()) {
-        result_ = AbstractType::dynamic_type().raw();
-      }
-      parameter_types.SetAt(pos, result_);
-      parameter_names.SetAt(pos, name);
-    }
-  }
-
-  helper_->SkipListOfStrings();  // read positional parameter names.
-
-  if (!simple) {
-    helper_->SkipCanonicalNameReference();  // read typedef reference.
-  }
-
-  BuildTypeInternal();  // read return type.
-  if (result_.IsMalformed()) {
-    result_ = AbstractType::dynamic_type().raw();
-  }
-  signature_function.set_result_type(result_);
-
-  finalize_ = finalize;
-
-  Type& signature_type =
-      Type::ZoneHandle(Z, signature_function.SignatureType());
-
-  if (finalize_) {
-    signature_type ^=
-        ClassFinalizer::FinalizeType(*active_class_->klass, signature_type);
-    // Do not refer to signature_function anymore, since it may have been
-    // replaced during canonicalization.
-    signature_function = Function::null();
-  }
-
-  result_ = signature_type.raw();
-}
-
-void TypeTranslator::BuildTypeParameterType() {
-  intptr_t parameter_index = helper_->ReadUInt();  // read parameter index.
-  helper_->SkipOptionalDartType();                 // read bound.
-
-  const TypeArguments& class_types =
-      TypeArguments::Handle(Z, active_class_->klass->type_parameters());
-  if (parameter_index < class_types.Length()) {
-    // The index of the type parameter in [parameters] is
-    // the same index into the `klass->type_parameters()` array.
-    result_ ^= class_types.TypeAt(parameter_index);
-    return;
-  }
-  parameter_index -= class_types.Length();
-
-  if (active_class_->HasMember()) {
-    if (active_class_->MemberIsFactoryProcedure()) {
-      //
-      // WARNING: This is a little hackish:
-      //
-      // We have a static factory constructor. The kernel IR gives the factory
-      // constructor function its own type parameters (which are equal in name
-      // and number to the ones of the enclosing class). I.e.,
-      //
-      //   class A<T> {
-      //     factory A.x() { return new B<T>(); }
-      //   }
-      //
-      //  is basically translated to this:
-      //
-      //   class A<T> {
-      //     static A.x<T'>() { return new B<T'>(); }
-      //   }
-      //
-      if (class_types.Length() > parameter_index) {
-        result_ ^= class_types.TypeAt(parameter_index);
-        return;
-      }
-      parameter_index -= class_types.Length();
-    }
-
-    intptr_t procedure_type_parameter_count =
-        active_class_->MemberIsProcedure()
-            ? active_class_->MemberTypeParameterCount(Z)
-            : 0;
-    if (procedure_type_parameter_count > 0) {
-      if (procedure_type_parameter_count > parameter_index) {
-        if (I->reify_generic_functions()) {
-          result_ ^=
-              TypeArguments::Handle(Z, active_class_->member->type_parameters())
-                  .TypeAt(parameter_index);
-        } else {
-          result_ ^= Type::DynamicType();
-        }
-        return;
-      }
-      parameter_index -= procedure_type_parameter_count;
-    }
-  }
-
-  if (active_class_->local_type_parameters != NULL) {
-    if (parameter_index < active_class_->local_type_parameters->Length()) {
-      if (I->reify_generic_functions()) {
-        result_ ^=
-            active_class_->local_type_parameters->TypeAt(parameter_index);
-      } else {
-        result_ ^= Type::DynamicType();
-      }
-      return;
-    }
-    parameter_index -= active_class_->local_type_parameters->Length();
-  }
-
-  if (type_parameter_scope_ != NULL &&
-      parameter_index < type_parameter_scope_->outer_parameter_count() +
-                            type_parameter_scope_->parameter_count()) {
-    result_ ^= Type::DynamicType();
-    return;
-  }
-
-  H.ReportError(
-      helper_->script(), TokenPosition::kNoSource,
-      "Unbound type parameter found in %s.  Please report this at dartbug.com.",
-      active_class_->ToCString());
-}
-
-const TypeArguments& TypeTranslator::BuildTypeArguments(intptr_t length) {
-  bool only_dynamic = true;
-  intptr_t offset = helper_->ReaderOffset();
-  for (intptr_t i = 0; i < length; ++i) {
-    if (helper_->ReadTag() != kDynamicType) {  // Read the ith types tag.
-      only_dynamic = false;
-      helper_->SetOffset(offset);
-      break;
-    }
-  }
-  TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z);
-  if (!only_dynamic) {
-    type_arguments = TypeArguments::New(length);
-    for (intptr_t i = 0; i < length; ++i) {
-      BuildTypeInternal(true);  // read ith type.
-      type_arguments.SetTypeAt(i, result_);
-    }
-
-    if (finalize_) {
-      type_arguments = type_arguments.Canonicalize();
-    }
-  }
-  return type_arguments;
-}
-
-const TypeArguments& TypeTranslator::BuildInstantiatedTypeArguments(
-    const Class& receiver_class,
-    intptr_t length) {
-  const TypeArguments& type_arguments = BuildTypeArguments(length);
-
-  // If type_arguments is null all arguments are dynamic.
-  // If, however, this class doesn't specify all the type arguments directly we
-  // still need to finalize the type below in order to get any non-dynamic types
-  // from any super. See http://www.dartbug.com/29537.
-  if (type_arguments.IsNull() && receiver_class.NumTypeArguments() == length) {
-    return type_arguments;
-  }
-
-  // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
-  // finalize the argument types.
-  // (This can for example make the [type_arguments] vector larger)
-  Type& type = Type::Handle(
-      Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
-  if (finalize_) {
-    type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
-  }
-
-  const TypeArguments& instantiated_type_arguments =
-      TypeArguments::ZoneHandle(Z, type.arguments());
-  return instantiated_type_arguments;
-}
-
-void TypeTranslator::LoadAndSetupTypeParameters(
-    ActiveClass* active_class,
-    const Object& set_on,
-    intptr_t type_parameter_count,
-    const Function& parameterized_function) {
-  ASSERT(type_parameter_count >= 0);
-  if (type_parameter_count == 0) {
-    return;
-  }
-  ASSERT(set_on.IsClass() || set_on.IsFunction());
-  bool set_on_class = set_on.IsClass();
-  ASSERT(set_on_class == parameterized_function.IsNull());
-
-  // First setup the type parameters, so if any of the following code uses it
-  // (in a recursive way) we're fine.
-  TypeArguments& type_parameters = TypeArguments::Handle(Z);
-  TypeParameter& parameter = TypeParameter::Handle(Z);
-  const Type& null_bound = Type::Handle(Z);
-
-  // Step a) Create array of [TypeParameter] objects (without bound).
-  type_parameters = TypeArguments::New(type_parameter_count);
-  const Library& lib = Library::Handle(Z, active_class->klass->library());
-  {
-    AlternativeReadingScope alt(&helper_->reader_);
-    for (intptr_t i = 0; i < type_parameter_count; i++) {
-      TypeParameterHelper helper(helper_);
-      helper.Finish();
-      parameter = TypeParameter::New(
-          set_on_class ? *active_class->klass : Class::Handle(Z),
-          parameterized_function, i,
-          H.DartIdentifier(lib, helper.name_index_),  // read ith name index.
-          null_bound, TokenPosition::kNoSource);
-      type_parameters.SetTypeAt(i, parameter);
-    }
-  }
-
-  if (set_on.IsClass()) {
-    Class::Cast(set_on).set_type_parameters(type_parameters);
-  } else {
-    Function::Cast(set_on).set_type_parameters(type_parameters);
-  }
-
-  const Function* enclosing = NULL;
-  if (!parameterized_function.IsNull()) {
-    enclosing = &parameterized_function;
-  }
-  ActiveTypeParametersScope scope(active_class, enclosing, type_parameters, Z);
-
-  // Step b) Fill in the bounds of all [TypeParameter]s.
-  for (intptr_t i = 0; i < type_parameter_count; i++) {
-    TypeParameterHelper helper(helper_);
-    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
-
-    // TODO(github.com/dart-lang/kernel/issues/42): This should be handled
-    // by the frontend.
-    parameter ^= type_parameters.TypeAt(i);
-    const Tag tag = helper_->PeekTag();  // peek ith bound type.
-    if (tag == kDynamicType) {
-      helper_->SkipDartType();  // read ith bound.
-      parameter.set_bound(Type::Handle(Z, I->object_store()->object_type()));
-    } else {
-      AbstractType& bound = BuildTypeWithoutFinalization();  // read ith bound.
-      if (bound.IsMalformedOrMalbounded()) {
-        bound = I->object_store()->object_type();
-      }
-      parameter.set_bound(bound);
-    }
-
-    helper.Finish();
-  }
-}
-
-const Type& TypeTranslator::ReceiverType(const Class& klass) {
-  ASSERT(!klass.IsNull());
-  ASSERT(!klass.IsTypedefClass());
-  // Note that if klass is _Closure, the returned type will be _Closure,
-  // and not the signature type.
-  Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
-  if (!type.IsNull()) {
-    return type;
-  }
-  type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
-                   klass.token_pos());
-  if (klass.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(klass, type);
-    klass.SetCanonicalType(type);
-  }
-  return type;
-}
-
 StreamingConstantEvaluator::StreamingConstantEvaluator(
     StreamingFlowGraphBuilder* builder)
     : builder_(builder),
@@ -3214,7 +361,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateMethodInvocation() {
-  builder_->ReadPosition();  // read position.
+  TokenPosition position = builder_->ReadPosition();  // read position.
   // This method call wasn't cached, so receiver et al. isn't cached either.
   const Instance& receiver = Instance::Handle(
       Z,
@@ -3233,7 +380,7 @@
   ASSERT(!function.IsNull());
 
   // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(function, &receiver);
+  const Object& result = RunMethodCall(position, function, &receiver);
   result_ ^= result.raw();
   result_ = H.Canonicalize(result_);
 
@@ -3241,7 +388,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateDirectMethodInvocation() {
-  builder_->ReadPosition();  // read position.
+  TokenPosition position = builder_->ReadPosition();  // read position.
 
   const Instance& receiver = Instance::Handle(
       Z,
@@ -3254,7 +401,7 @@
       Z, H.LookupMethodByMember(kernel_name, H.DartProcedureName(kernel_name)));
 
   // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(function, &receiver);
+  const Object& result = RunMethodCall(position, function, &receiver);
   result_ ^= result.raw();
   result_ = H.Canonicalize(result_);
 }
@@ -3268,7 +415,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateSuperMethodInvocation() {
-  builder_->ReadPosition();  // read position.
+  TokenPosition position = builder_->ReadPosition();  // read position.
 
   const LocalVariable* this_variable = builder_->scopes()->this_variable;
   ASSERT(this_variable->IsConst());
@@ -3287,7 +434,7 @@
   ASSERT(!function.IsNull());
 
   // Read arguments, run the method and canonicalize the result.
-  const Object& result = RunMethodCall(function, &receiver);
+  const Object& result = RunMethodCall(position, function, &receiver);
   result_ ^= result.raw();
   result_ = H.Canonicalize(result_);
 
@@ -3295,7 +442,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateStaticInvocation() {
-  builder_->ReadPosition();  // read position.
+  TokenPosition position = builder_->ReadPosition();  // read position.
   NameIndex procedure_reference =
       builder_->ReadCanonicalNameReference();  // read procedure reference.
 
@@ -3312,13 +459,13 @@
 
   // read positional and named parameters.
   const Object& result =
-      RunFunction(function, argument_count, NULL, type_arguments);
+      RunFunction(position, function, argument_count, NULL, type_arguments);
   result_ ^= result.raw();
   result_ = H.Canonicalize(result_);
 }
 
 void StreamingConstantEvaluator::EvaluateConstructorInvocationInternal() {
-  builder_->ReadPosition();  // read position.
+  TokenPosition position = builder_->ReadPosition();  // read position.
 
   NameIndex target = builder_->ReadCanonicalNameReference();  // read target.
   const Function& constructor =
@@ -3359,8 +506,8 @@
   }
 
   // read positional and named parameters.
-  const Object& result = RunFunction(constructor, argument_count, receiver,
-                                     type_arguments_argument);
+  const Object& result = RunFunction(position, constructor, argument_count,
+                                     receiver, type_arguments_argument);
 
   if (constructor.IsFactory()) {
     // Factories return the new object.
@@ -3400,14 +547,14 @@
 }
 
 void StreamingConstantEvaluator::EvaluateAsExpression() {
-  builder_->ReadPosition();
+  TokenPosition position = builder_->ReadPosition();
   const uint8_t flags = builder_->ReadFlags();
   const bool is_type_error = (flags & (1 << 0)) != 0;
 
   // Check that this AsExpression was inserted by the front-end.
   if (!is_type_error) {
     H.ReportError(
-        script_, TokenPosition::kNoSource,
+        script_, position,
         "explicit as operator is not permitted in constant expression");
   }
 
@@ -3417,7 +564,7 @@
   if (!type.IsInstantiated() || type.IsMalformed()) {
     const String& type_str = String::Handle(type.UserVisibleName());
     H.ReportError(
-        script_, TokenPosition::kNoSource,
+        script_, position,
         "Not a constant expression: right hand side of an implicit "
         "as-expression is expected to be an instantiated type, got %s",
         type_str.ToCString());
@@ -3432,9 +579,10 @@
         AbstractType::Handle(result_.GetType(Heap::kNew));
     const String& result_str = String::Handle(rtype.UserVisibleName());
     const String& type_str = String::Handle(type.UserVisibleName());
-    H.ReportError(script_, TokenPosition::kNoSource,
-                  "Not a constant expression: %s is not an instance of %s",
-                  result_str.ToCString(), type_str.ToCString());
+    H.ReportError(
+        script_, position,
+        "Not a constant expression: Type '%s' is not a subtype of type '%s'",
+        result_str.ToCString(), type_str.ToCString());
   }
 }
 
@@ -3451,7 +599,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateStringConcatenation() {
-  builder_->ReadPosition();                      // read position.
+  TokenPosition position = builder_->ReadPosition();  // read position.
   intptr_t length = builder_->ReadListLength();  // read list length.
 
   bool all_string = true;
@@ -3482,7 +630,7 @@
 
     // Run and canonicalize.
     const Object& result =
-        RunFunction(func, interpolate_arg, Array::null_array());
+        RunFunction(position, func, interpolate_arg, Array::null_array());
     result_ = H.Canonicalize(String::Cast(result));
   }
 }
@@ -3661,6 +809,7 @@
 
 // This depends on being about to read the list of positionals on arguments.
 const Object& StreamingConstantEvaluator::RunFunction(
+    TokenPosition position,
     const Function& function,
     intptr_t argument_count,
     const Instance* receiver,
@@ -3709,12 +858,14 @@
     arguments.SetAt(pos++, result_);
   }
 
-  return RunFunction(function, arguments, names);
+  return RunFunction(position, function, arguments, names);
 }
 
-const Object& StreamingConstantEvaluator::RunFunction(const Function& function,
-                                                      const Array& arguments,
-                                                      const Array& names) {
+const Object& StreamingConstantEvaluator::RunFunction(
+    const TokenPosition position,
+    const Function& function,
+    const Array& arguments,
+    const Array& names) {
   // We do not support generic methods yet.
   const int kTypeArgsLen = 0;
   const Array& args_descriptor = Array::Handle(
@@ -3722,12 +873,14 @@
   const Object& result = Object::Handle(
       Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
   if (result.IsError()) {
-    H.ReportError(Error::Cast(result), "error evaluating constant constructor");
+    H.ReportError(Error::Cast(result), script_, position,
+                  "error evaluating constant constructor");
   }
   return result;
 }
 
 const Object& StreamingConstantEvaluator::RunMethodCall(
+    const TokenPosition position,
     const Function& function,
     const Instance* receiver) {
   intptr_t argument_count = builder_->ReadUInt();  // read arguments count.
@@ -3737,7 +890,7 @@
   builder_->SkipListOfDartTypes();  // read list of types.
 
   // Run the method.
-  return RunFunction(function, argument_count, receiver, NULL);
+  return RunFunction(position, function, argument_count, receiver, NULL);
 }
 
 RawObject* StreamingConstantEvaluator::EvaluateConstConstructorCall(
@@ -3874,18 +1027,6 @@
   script_.set_compile_time_constants(constants.Release());
 }
 
-void StreamingFlowGraphBuilder::DiscoverEnclosingElements(
-    Zone* zone,
-    const Function& function,
-    Function* outermost_function) {
-  // Find out if there is an enclosing kernel class (which will be used to
-  // resolve type parameters).
-  *outermost_function = function.raw();
-  while (outermost_function->parent_function() != Object::null()) {
-    *outermost_function = outermost_function->parent_function();
-  }
-}
-
 void KernelFingerprintHelper::BuildHash(uint32_t val) {
   hash_ = CalculateHash(hash_, val);
 }
@@ -4016,10 +1157,12 @@
       CalculateExpressionFingerprint();  // read value.
       return;
     case kSuperInitializer:
+      ReadPosition();                       // read position.
       CalculateCanonicalNameFingerprint();  // read target_reference
       CalculateArgumentsFingerprint();      // read arguments.
       return;
     case kRedirectingInitializer:
+      ReadPosition();                       // read position.
       CalculateCanonicalNameFingerprint();  // read target_reference
       CalculateArgumentsFingerprint();      // read arguments.
       return;
@@ -4566,50 +1709,6 @@
   return hash_;
 }
 
-void StreamingFlowGraphBuilder::ReadUntilFunctionNode(
-    ParsedFunction* parsed_function) {
-  const Tag tag = PeekTag();
-  if (tag == kProcedure) {
-    ProcedureHelper procedure_helper(this);
-    procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
-    if (ReadTag() == kNothing) {  // read function node tag.
-      // Running a procedure without a function node doesn't make sense.
-      UNREACHABLE();
-    }
-    if (parsed_function != NULL && flow_graph_builder_ != nullptr &&
-        procedure_helper.IsForwardingStub() && !procedure_helper.IsAbstract()) {
-      ASSERT(procedure_helper.forwarding_stub_super_target_ != -1);
-      parsed_function->MarkForwardingStub(
-          procedure_helper.forwarding_stub_super_target_);
-    }
-    // Now at start of FunctionNode.
-  } else if (tag == kConstructor) {
-    ConstructorHelper constructor_helper(this);
-    constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
-    // Now at start of FunctionNode.
-    // Notice that we also have a list of initializers after that!
-  } else if (tag == kFunctionNode) {
-    // Already at start of FunctionNode.
-  } else {
-    ReportUnexpectedTag("a procedure, a constructor or a function node", tag);
-    UNREACHABLE();
-  }
-}
-
-StringIndex StreamingFlowGraphBuilder::GetNameFromVariableDeclaration(
-    intptr_t kernel_offset,
-    const Function& function) {
-  ExternalTypedData& kernel_data =
-      ExternalTypedData::Handle(Z, function.KernelData());
-  ASSERT(!kernel_data.IsNull());
-
-  // Temporarily go to the variable declaration, read the name.
-  AlternativeReadingScope alt(&reader_, &kernel_data, kernel_offset);
-  VariableDeclarationHelper helper(this);
-  helper.ReadUntilIncluding(VariableDeclarationHelper::kNameIndex);
-  return helper.name_index_;
-}
-
 bool StreamingFlowGraphBuilder::optimizing() {
   return flow_graph_builder_->optimizing_;
 }
@@ -4885,7 +1984,7 @@
     intptr_t list_length = ReadListLength();  // read initializers list length.
     for (intptr_t i = 0; i < list_length; ++i) {
       Tag tag = ReadTag();
-      ReadByte();  // read isSynthetic flag.
+      bool isSynthetic = ReadBool();  // read isSynthetic flag.
       switch (tag) {
         case kInvalidInitializer:
           UNIMPLEMENTED();
@@ -4901,6 +2000,7 @@
           break;
         }
         case kSuperInitializer: {
+          TokenPosition position = ReadPosition();  // read position.
           NameIndex canonical_target =
               ReadCanonicalNameReference();  // read target_reference.
 
@@ -4920,13 +2020,14 @@
           const Function& target = Function::ZoneHandle(
               Z, H.LookupConstructorByKernelConstructor(
                      parent_klass, H.CanonicalNameString(canonical_target)));
-          instructions +=
-              StaticCall(TokenPosition::kNoSource, target, argument_count,
-                         argument_names, ICData::kStatic);
+          instructions += StaticCall(
+              isSynthetic ? TokenPosition::kNoSource : position, target,
+              argument_count, argument_names, ICData::kStatic);
           instructions += Drop();
           break;
         }
         case kRedirectingInitializer: {
+          TokenPosition position = ReadPosition();  // read position.
           NameIndex canonical_target =
               ReadCanonicalNameReference();  // read target_reference.
 
@@ -4943,9 +2044,9 @@
 
           const Function& target = Function::ZoneHandle(
               Z, H.LookupConstructorByKernelConstructor(canonical_target));
-          instructions +=
-              StaticCall(TokenPosition::kNoSource, target, argument_count,
-                         argument_names, ICData::kStatic);
+          instructions += StaticCall(
+              isSynthetic ? TokenPosition::kNoSource : position, target,
+              argument_count, argument_names, ICData::kStatic);
           instructions += Drop();
           break;
         }
@@ -5462,8 +2563,8 @@
   // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
   // e.g. for type translation.
   const Class& klass = Class::Handle(zone_, function.Owner());
-  Function& outermost_function = Function::Handle(Z);
-  DiscoverEnclosingElements(Z, function, &outermost_function);
+  Function& outermost_function =
+      Function::Handle(Z, function.GetOutermostFunction());
 
   ActiveClassScope active_class_scope(active_class(), &klass);
   ActiveMemberScope active_member(active_class(), &outermost_function);
@@ -6169,6 +3270,8 @@
 
 FlowGraph* StreamingFlowGraphBuilder::BuildGraph() {
   ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
+  ASSERT(flow_graph_builder_ != nullptr);
+
   const Function& function = parsed_function()->function();
   const intptr_t kernel_offset = function.kernel_offset();
 
@@ -6176,8 +3279,8 @@
   // e.g. for type translation.
   const Class& klass =
       Class::Handle(zone_, parsed_function()->function().Owner());
-  Function& outermost_function = Function::Handle(Z);
-  DiscoverEnclosingElements(Z, function, &outermost_function);
+  Function& outermost_function =
+      Function::Handle(Z, function.GetOutermostFunction());
 
   ActiveClassScope active_class_scope(active_class(), &klass);
   ActiveMemberScope active_member(active_class(), &outermost_function);
@@ -6211,14 +3314,29 @@
   }
 #endif
 
-  // We need to read out the NSM-forwarder bit before we can build scopes.
+  // Mark forwarding stubs.
   switch (function.kind()) {
+    case RawFunction::kRegularFunction:
     case RawFunction::kImplicitClosureFunction:
-    case RawFunction::kRegularFunction: {
-      AlternativeReadingScope alt(&reader_);
-      ReadUntilFunctionNode(parsed_function());  // read until function node.
-    }
-    default: {}
+    case RawFunction::kGetterFunction:
+    case RawFunction::kSetterFunction:
+    case RawFunction::kClosureFunction:
+    case RawFunction::kConstructor:
+    case RawFunction::kDynamicInvocationForwarder:
+      if (PeekTag() == kProcedure) {
+        AlternativeReadingScope alt(&reader_);
+        ProcedureHelper procedure_helper(this);
+        procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
+        if (procedure_helper.IsForwardingStub() &&
+            !procedure_helper.IsAbstract()) {
+          ASSERT(procedure_helper.forwarding_stub_super_target_ != -1);
+          parsed_function()->MarkForwardingStub(
+              procedure_helper.forwarding_stub_super_target_);
+        }
+      }
+      break;
+    default:
+      break;
   }
 
   // The IR builder will create its own local variables and scopes, and it
@@ -6233,7 +3351,7 @@
     case RawFunction::kImplicitClosureFunction:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction: {
-      ReadUntilFunctionNode(parsed_function());
+      ReadUntilFunctionNode();
       if (function.is_no_such_method_forwarder()) {
         return BuildGraphOfNoSuchMethodForwarder(
             function, function.IsImplicitClosureFunction());
@@ -6243,11 +3361,11 @@
     }
     /* Falls through */
     case RawFunction::kClosureFunction: {
-      ReadUntilFunctionNode(parsed_function());  // read until function node.
+      ReadUntilFunctionNode();
       return BuildGraphOfFunction(false);
     }
     case RawFunction::kConstructor: {
-      ReadUntilFunctionNode(parsed_function());  // read until function node.
+      ReadUntilFunctionNode();
       return BuildGraphOfFunction(!function.IsFactory());
     }
     case RawFunction::kImplicitGetter:
@@ -6261,7 +3379,7 @@
       if (PeekTag() == kField) {
         return BuildGraphOfFieldAccessor(scopes()->setter_value);
       } else {
-        ReadUntilFunctionNode(parsed_function());
+        ReadUntilFunctionNode();
         return BuildGraphOfDynamicInvocationForwarder();
       }
     case RawFunction::kMethodExtractor:
@@ -10095,7 +7213,7 @@
 RawObject* StreamingFlowGraphBuilder::BuildParameterDescriptor(
     intptr_t kernel_offset) {
   SetOffset(kernel_offset);
-  ReadUntilFunctionNode();  // read until function node.
+  ReadUntilFunctionNode();
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
@@ -10115,6 +7233,7 @@
     }
 
     // Read ith variable declaration.
+    intptr_t param_kernel_offset = reader_.offset();
     VariableDeclarationHelper helper(this);
     helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
     param_descriptor.SetAt(entry_start + Parser::kParameterIsFinalOffset,
@@ -10133,35 +7252,23 @@
                              Object::null_instance());
     }
 
-    param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset,
-                           /* Issue(28434): Missing parameter metadata. */
-                           Object::null_instance());
+    if (FLAG_enable_mirrors && (helper.annotation_count_ > 0)) {
+      AlternativeReadingScope alt(&reader_, param_kernel_offset);
+      VariableDeclarationHelper helper(this);
+      helper.ReadUntilExcluding(VariableDeclarationHelper::kAnnotations);
+      Object& metadata = Object::ZoneHandle(Z, BuildAnnotations());
+      param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset,
+                             metadata);
+    } else {
+      param_descriptor.SetAt(entry_start + Parser::kParameterMetadataOffset,
+                             Object::null_instance());
+    }
   }
   return param_descriptor.raw();
 }
 
-RawObject* StreamingFlowGraphBuilder::EvaluateMetadata(intptr_t kernel_offset) {
-  SetOffset(kernel_offset);
-  const Tag tag = PeekTag();
-
+RawObject* StreamingFlowGraphBuilder::BuildAnnotations() {
   ASSERT(active_class() != NULL);
-
-  if (tag == kClass) {
-    ClassHelper class_helper(this);
-    class_helper.ReadUntilExcluding(ClassHelper::kAnnotations);
-  } else if (tag == kProcedure) {
-    ProcedureHelper procedure_helper(this);
-    procedure_helper.ReadUntilExcluding(ProcedureHelper::kAnnotations);
-  } else if (tag == kField) {
-    FieldHelper field_helper(this);
-    field_helper.ReadUntilExcluding(FieldHelper::kAnnotations);
-  } else if (tag == kConstructor) {
-    ConstructorHelper constructor_helper(this);
-    constructor_helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
-  } else {
-    FATAL("No support for metadata on this type of kernel node\n");
-  }
-
   intptr_t list_length = ReadListLength();  // read list length.
   const Array& metadata_values =
       Array::Handle(Z, Array::New(list_length, H.allocation_space()));
@@ -10176,6 +7283,39 @@
   return metadata_values.raw();
 }
 
+RawObject* StreamingFlowGraphBuilder::EvaluateMetadata(
+    intptr_t kernel_offset,
+    bool is_annotations_offset) {
+  SetOffset(kernel_offset);
+
+  ASSERT(active_class() != NULL);
+
+  // Library and LibraryDependency objects do not have a tag in kernel binary.
+  // Synthetic metadata fields corresponding to these objects keep kernel
+  // offset of annotations list instead of annotated object.
+  if (!is_annotations_offset) {
+    const Tag tag = PeekTag();
+
+    if (tag == kClass) {
+      ClassHelper class_helper(this);
+      class_helper.ReadUntilExcluding(ClassHelper::kAnnotations);
+    } else if (tag == kProcedure) {
+      ProcedureHelper procedure_helper(this);
+      procedure_helper.ReadUntilExcluding(ProcedureHelper::kAnnotations);
+    } else if (tag == kField) {
+      FieldHelper field_helper(this);
+      field_helper.ReadUntilExcluding(FieldHelper::kAnnotations);
+    } else if (tag == kConstructor) {
+      ConstructorHelper constructor_helper(this);
+      constructor_helper.ReadUntilExcluding(ConstructorHelper::kAnnotations);
+    } else {
+      FATAL("No support for metadata on this type of kernel node\n");
+    }
+  }
+
+  return BuildAnnotations();
+}
+
 void StreamingFlowGraphBuilder::CollectTokenPositionsFor(
     intptr_t script_index,
     intptr_t initial_script_index,
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 35f905c..c9babb5 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -7,8 +7,10 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/compiler/frontend/scope_builder.h"
 #include "vm/kernel.h"
 #include "vm/kernel_binary.h"
 #include "vm/object.h"
@@ -16,323 +18,6 @@
 namespace dart {
 namespace kernel {
 
-class TypeTranslator;
-
-struct DirectCallMetadata {
-  DirectCallMetadata(const Function& target, bool check_receiver_for_null)
-      : target_(target), check_receiver_for_null_(check_receiver_for_null) {}
-
-  const Function& target_;
-  const bool check_receiver_for_null_;
-};
-
-// Helper class which provides access to direct call metadata.
-class DirectCallMetadataHelper : public MetadataHelper {
- public:
-  static const char* tag() { return "vm.direct-call.metadata"; }
-
-  explicit DirectCallMetadataHelper(KernelReaderHelper* helper);
-
-  DirectCallMetadata GetDirectTargetForPropertyGet(intptr_t node_offset);
-  DirectCallMetadata GetDirectTargetForPropertySet(intptr_t node_offset);
-  DirectCallMetadata GetDirectTargetForMethodInvocation(intptr_t node_offset);
-
- private:
-  bool ReadMetadata(intptr_t node_offset,
-                    NameIndex* target_name,
-                    bool* check_receiver_for_null);
-};
-
-struct InferredTypeMetadata {
-  InferredTypeMetadata(intptr_t cid_, bool nullable_)
-      : cid(cid_), nullable(nullable_) {}
-
-  const intptr_t cid;
-  const bool nullable;
-
-  bool IsTrivial() const { return (cid == kDynamicCid) && nullable; }
-};
-
-// Helper class which provides access to inferred type metadata.
-class InferredTypeMetadataHelper : public MetadataHelper {
- public:
-  static const char* tag() { return "vm.inferred-type.metadata"; }
-
-  explicit InferredTypeMetadataHelper(KernelReaderHelper* helper);
-
-  InferredTypeMetadata GetInferredType(intptr_t node_offset);
-};
-
-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;
-};
-
-// Helper class which provides access to direct call metadata.
-class ProcedureAttributesMetadataHelper : public MetadataHelper {
- public:
-  static const char* tag() { return "vm.procedure-attributes.metadata"; }
-
-  explicit ProcedureAttributesMetadataHelper(KernelReaderHelper* helper);
-
-  ProcedureAttributesMetadata GetProcedureAttributes(intptr_t node_offset);
-
- private:
-  bool ReadMetadata(intptr_t node_offset,
-                    ProcedureAttributesMetadata* metadata);
-};
-
-#if defined(DART_USE_INTERPRETER)
-
-// Helper class which provides access to bytecode metadata.
-class BytecodeMetadataHelper : public MetadataHelper {
- public:
-  static const char* tag() { return "vm.bytecode"; }
-
-  explicit BytecodeMetadataHelper(KernelReaderHelper* helper,
-                                  TypeTranslator* type_translator,
-                                  ActiveClass* active_class);
-
-  void ReadMetadata(const Function& function);
-
- private:
-  // Returns the index of the last read pool entry.
-  intptr_t ReadPoolEntries(const Function& function,
-                           const Function& inner_function,
-                           const ObjectPool& pool,
-                           intptr_t from_index);
-  RawCode* ReadBytecode(const ObjectPool& pool);
-  void ReadExceptionsTable(const Code& bytecode);
-  RawTypedData* NativeEntry(const Function& function,
-                            const String& external_name);
-
-  TypeTranslator& type_translator_;
-  ActiveClass* const active_class_;
-};
-
-#endif  // defined(DART_USE_INTERPRETER)
-
-class TypeTranslator {
- public:
-  TypeTranslator(KernelReaderHelper* helper,
-                 ActiveClass* active_class,
-                 bool finalize = false);
-
-  // Can return a malformed type.
-  AbstractType& BuildType();
-  // Can return a malformed type.
-  AbstractType& BuildTypeWithoutFinalization();
-  // Is guaranteed to be not malformed.
-  AbstractType& BuildVariableType();
-
-  // Will return `TypeArguments::null()` in case any of the arguments are
-  // malformed.
-  const TypeArguments& BuildTypeArguments(intptr_t length);
-
-  // Will return `TypeArguments::null()` in case any of the arguments are
-  // malformed.
-  const TypeArguments& BuildInstantiatedTypeArguments(
-      const Class& receiver_class,
-      intptr_t length);
-
-  void LoadAndSetupTypeParameters(ActiveClass* active_class,
-                                  const Object& set_on,
-                                  intptr_t type_parameter_count,
-                                  const Function& parameterized_function);
-
-  const Type& ReceiverType(const Class& klass);
-
- private:
-  // Can build a malformed type.
-  void BuildTypeInternal(bool invalid_as_dynamic = false);
-  void BuildInterfaceType(bool simple);
-  void BuildFunctionType(bool simple);
-  void BuildTypeParameterType();
-
-  class TypeParameterScope {
-   public:
-    TypeParameterScope(TypeTranslator* translator, intptr_t parameter_count)
-        : parameter_count_(parameter_count),
-          outer_(translator->type_parameter_scope_),
-          translator_(translator) {
-      outer_parameter_count_ = 0;
-      if (outer_ != NULL) {
-        outer_parameter_count_ =
-            outer_->outer_parameter_count_ + outer_->parameter_count_;
-      }
-      translator_->type_parameter_scope_ = this;
-    }
-    ~TypeParameterScope() { translator_->type_parameter_scope_ = outer_; }
-
-    TypeParameterScope* outer() const { return outer_; }
-    intptr_t parameter_count() const { return parameter_count_; }
-    intptr_t outer_parameter_count() const { return outer_parameter_count_; }
-
-   private:
-    intptr_t parameter_count_;
-    intptr_t outer_parameter_count_;
-    TypeParameterScope* outer_;
-    TypeTranslator* translator_;
-  };
-
-  KernelReaderHelper* helper_;
-  TranslationHelper& translation_helper_;
-  ActiveClass* const active_class_;
-  TypeParameterScope* type_parameter_scope_;
-  Zone* zone_;
-  AbstractType& result_;
-  bool finalize_;
-
-  friend class StreamingScopeBuilder;
-  friend class KernelLoader;
-};
-
-class StreamingScopeBuilder {
- public:
-  explicit StreamingScopeBuilder(ParsedFunction* parsed_function);
-
-  virtual ~StreamingScopeBuilder();
-
-  ScopeBuildingResult* BuildScopes();
-
- private:
-  void VisitField();
-
-  void VisitProcedure();
-
-  void VisitConstructor();
-
-  void VisitFunctionNode();
-  void VisitNode();
-  void VisitInitializer();
-  void VisitExpression();
-  void VisitStatement();
-  void VisitArguments();
-  void VisitVariableDeclaration();
-  void VisitDartType();
-  void VisitInterfaceType(bool simple);
-  void VisitFunctionType(bool simple);
-  void VisitTypeParameterType();
-  void HandleLocalFunction(intptr_t parent_kernel_offset);
-
-  AbstractType& BuildAndVisitVariableType();
-
-  void EnterScope(intptr_t kernel_offset);
-  void ExitScope(TokenPosition start_position, TokenPosition end_position);
-
-  virtual void ReportUnexpectedTag(const char* variant, Tag tag);
-
-  // This enum controls which parameters would be marked as requring type
-  // check on the callee side.
-  enum ParameterTypeCheckMode {
-    // All parameters will be checked.
-    kTypeCheckAllParameters,
-
-    // Only parameters marked as covariant or generic-covariant-impl will be
-    // checked.
-    kTypeCheckForNonDynamicallyInvokedMethod,
-
-    // Only parameters *not* marked as covariant or generic-covariant-impl will
-    // be checked. The rest would be checked in the method itself.
-    // Inverse of kTypeCheckForNonDynamicallyInvokedMethod.
-    kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
-
-    // No parameters will be checked.
-    kTypeCheckForStaticFunction,
-  };
-
-  // This assumes that the reader is at a FunctionNode,
-  // about to read the positional parameters.
-  void AddPositionalAndNamedParameters(
-      intptr_t pos,
-      ParameterTypeCheckMode type_check_mode,
-      const ProcedureAttributesMetadata& attrs);
-
-  // This assumes that the reader is at a FunctionNode,
-  // about to read a parameter (i.e. VariableDeclaration).
-  void AddVariableDeclarationParameter(
-      intptr_t pos,
-      ParameterTypeCheckMode type_check_mode,
-      const ProcedureAttributesMetadata& attrs);
-
-  LocalVariable* MakeVariable(TokenPosition declaration_pos,
-                              TokenPosition token_pos,
-                              const String& name,
-                              const AbstractType& type,
-                              const InferredTypeMetadata* param_type_md = NULL);
-
-  void AddExceptionVariable(GrowableArray<LocalVariable*>* variables,
-                            const char* prefix,
-                            intptr_t nesting_depth);
-
-  void FinalizeExceptionVariable(GrowableArray<LocalVariable*>* variables,
-                                 GrowableArray<LocalVariable*>* raw_variables,
-                                 const String& symbol,
-                                 intptr_t nesting_depth);
-
-  void AddTryVariables();
-  void AddCatchVariables();
-  void FinalizeCatchVariables();
-  void AddIteratorVariable();
-  void AddSwitchVariable();
-
-  // Record an assignment or reference to a variable.  If the occurrence is
-  // in a nested function, ensure that the variable is handled properly as a
-  // captured variable.
-  void LookupVariable(intptr_t declaration_binary_offset);
-
-  const String& GenerateName(const char* prefix, intptr_t suffix);
-
-  void HandleSpecialLoad(LocalVariable** variable, const String& symbol);
-  void LookupCapturedVariableByName(LocalVariable** variable,
-                                    const String& name);
-
-  struct DepthState {
-    explicit DepthState(intptr_t function)
-        : loop_(0),
-          function_(function),
-          try_(0),
-          catch_(0),
-          finally_(0),
-          for_in_(0) {}
-
-    intptr_t loop_;
-    intptr_t function_;
-    intptr_t try_;
-    intptr_t catch_;
-    intptr_t finally_;
-    intptr_t for_in_;
-  };
-
-  ScopeBuildingResult* result_;
-  ParsedFunction* parsed_function_;
-
-  ActiveClass active_class_;
-
-  TranslationHelper translation_helper_;
-  Zone* zone_;
-
-  FunctionNodeHelper::AsyncMarker current_function_async_marker_;
-  LocalScope* current_function_scope_;
-  LocalScope* scope_;
-  DepthState depth_;
-
-  intptr_t name_index_;
-
-  bool needs_expr_temp_;
-  TokenPosition first_body_token_position_;
-
-  StreamingFlowGraphBuilder* builder_;
-  TypeTranslator type_translator_;
-};
-
 // There are several cases when we are compiling constant expressions:
 //
 //   * constant field initializers:
@@ -401,16 +86,19 @@
   void EvaluateGetStringLength(intptr_t expression_offset,
                                TokenPosition position);
 
-  const Object& RunFunction(const Function& function,
+  const Object& RunFunction(const TokenPosition position,
+                            const Function& function,
                             intptr_t argument_count,
                             const Instance* receiver,
                             const TypeArguments* type_args);
 
-  const Object& RunFunction(const Function& function,
+  const Object& RunFunction(const TokenPosition position,
+                            const Function& function,
                             const Array& arguments,
                             const Array& names);
 
-  const Object& RunMethodCall(const Function& function,
+  const Object& RunMethodCall(const TokenPosition position,
+                              const Function& function,
                               const Instance* receiver);
 
   RawObject* EvaluateConstConstructorCall(const Class& type_class,
@@ -586,7 +274,9 @@
 
   Fragment BuildStatementAt(intptr_t kernel_offset);
   RawObject* BuildParameterDescriptor(intptr_t kernel_offset);
-  RawObject* EvaluateMetadata(intptr_t kernel_offset);
+  RawObject* BuildAnnotations();
+  RawObject* EvaluateMetadata(intptr_t kernel_offset,
+                              bool is_annotations_offset);
   void CollectTokenPositionsFor(
       intptr_t script_index,
       intptr_t initial_script_index,
@@ -598,19 +288,7 @@
   String& GetSourceFor(intptr_t index);
   RawTypedData* GetLineStartsFor(intptr_t index);
 
-  // If a 'ParsedFunction' is provided for 'set_forwarding_stub', this method
-  // will attach the forwarding stub target reference to the parsed function if
-  // it crosses a procedure node for a concrete forwarding stub.
-  void ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub = NULL);
-
  private:
-  void DiscoverEnclosingElements(Zone* zone,
-                                 const Function& function,
-                                 Function* outermost_function);
-
-  StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset,
-                                             const Function& function);
-
   bool optimizing();
 
   FlowGraph* BuildGraphOfFieldInitializer();
@@ -911,30 +589,10 @@
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
 
-  friend class ClassHelper;
   friend class ConstantHelper;
   friend class KernelLoader;
   friend class SimpleExpressionConverter;
   friend class StreamingConstantEvaluator;
-  friend class StreamingScopeBuilder;
-};
-
-class AlternativeScriptScope {
- public:
-  AlternativeScriptScope(TranslationHelper* helper,
-                         const Script& new_script,
-                         const Script& old_script)
-      : helper_(helper), old_script_(old_script) {
-    helper_->Reset();
-    helper_->InitFromScript(new_script);
-  }
-  ~AlternativeScriptScope() {
-    helper_->Reset();
-    helper_->InitFromScript(old_script_);
-  }
-
-  TranslationHelper* helper_;
-  const Script& old_script_;
 };
 
 // Helper class that reads a kernel Constant from binary.
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 38bfda8..d22bad5 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -28,67 +28,6 @@
 #define T (type_translator_)
 #define I Isolate::Current()
 
-ActiveTypeParametersScope::ActiveTypeParametersScope(ActiveClass* active_class,
-                                                     const Function& innermost,
-                                                     Zone* Z)
-    : active_class_(active_class), saved_(*active_class) {
-  active_class_->enclosing = &innermost;
-
-  intptr_t num_params = 0;
-
-  Function& f = Function::Handle(Z);
-  TypeArguments& f_params = TypeArguments::Handle(Z);
-  for (f = innermost.raw(); f.parent_function() != Object::null();
-       f = f.parent_function()) {
-    f_params = f.type_parameters();
-    num_params += f_params.Length();
-  }
-  if (num_params == 0) return;
-
-  TypeArguments& params =
-      TypeArguments::Handle(Z, TypeArguments::New(num_params));
-
-  intptr_t index = num_params;
-  for (f = innermost.raw(); f.parent_function() != Object::null();
-       f = f.parent_function()) {
-    f_params = f.type_parameters();
-    for (intptr_t j = f_params.Length() - 1; j >= 0; --j) {
-      params.SetTypeAt(--index, AbstractType::Handle(Z, f_params.TypeAt(j)));
-    }
-  }
-
-  active_class_->local_type_parameters = &params;
-}
-
-ActiveTypeParametersScope::ActiveTypeParametersScope(
-    ActiveClass* active_class,
-    const Function* function,
-    const TypeArguments& new_params,
-    Zone* Z)
-    : active_class_(active_class), saved_(*active_class) {
-  active_class_->enclosing = function;
-
-  if (new_params.IsNull()) return;
-
-  const TypeArguments* old_params = active_class->local_type_parameters;
-  const intptr_t old_param_count =
-      old_params == NULL ? 0 : old_params->Length();
-  const TypeArguments& extended_params = TypeArguments::Handle(
-      Z, TypeArguments::New(old_param_count + new_params.Length()));
-
-  intptr_t index = 0;
-  for (intptr_t i = 0; i < old_param_count; ++i) {
-    extended_params.SetTypeAt(
-        index++, AbstractType::ZoneHandle(Z, old_params->TypeAt(i)));
-  }
-  for (intptr_t i = 0; i < new_params.Length(); ++i) {
-    extended_params.SetTypeAt(
-        index++, AbstractType::ZoneHandle(Z, new_params.TypeAt(i)));
-  }
-
-  active_class_->local_type_parameters = &extended_params;
-}
-
 Fragment& Fragment::operator+=(const Fragment& other) {
   if (entry == NULL) {
     entry = other.entry;
@@ -136,27 +75,7 @@
   return result;
 }
 
-intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) {
-  ASSERT(member != NULL);
-  if (member->IsFactory()) {
-    TypeArguments& class_types =
-        TypeArguments::Handle(zone, klass->type_parameters());
-    return class_types.Length();
-  } else if (member->IsMethodExtractor()) {
-    Function& extracted =
-        Function::Handle(zone, member->extracted_method_closure());
-    TypeArguments& function_types =
-        TypeArguments::Handle(zone, extracted.type_parameters());
-    return function_types.Length();
-  } else {
-    TypeArguments& function_types =
-        TypeArguments::Handle(zone, member->type_parameters());
-    return function_types.Length();
-  }
-}
-
 FlowGraphBuilder::FlowGraphBuilder(
-    intptr_t kernel_offset,
     ParsedFunction* parsed_function,
     const ZoneGrowableArray<const ICData*>& ic_data_array,
     ZoneGrowableArray<intptr_t>* context_level_array,
@@ -170,7 +89,6 @@
       translation_helper_(Thread::Current()),
       thread_(translation_helper_.thread()),
       zone_(translation_helper_.zone()),
-      kernel_offset_(kernel_offset),
       parsed_function_(parsed_function),
       optimizing_(optimizing),
       osr_id_(osr_id),
@@ -713,7 +631,6 @@
 }
 
 Fragment BaseFlowGraphBuilder::TailCall(const Code& code) {
-  Fragment instructions;
   Value* arg_desc = Pop();
   return Fragment(new (Z) TailCallInstr(code, arg_desc));
 }
@@ -2141,7 +2058,8 @@
   return nsm;
 }
 
-RawObject* EvaluateMetadata(const Field& metadata_field) {
+RawObject* EvaluateMetadata(const Field& metadata_field,
+                            bool is_annotations_offset) {
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     Thread* thread = Thread::Current();
@@ -2159,7 +2077,7 @@
         ExternalTypedData::Handle(Z, metadata_field.KernelData()),
         metadata_field.KernelDataProgramOffset(), &active_class);
     return streaming_flow_graph_builder.EvaluateMetadata(
-        metadata_field.kernel_offset());
+        metadata_field.kernel_offset(), is_annotations_offset);
   } else {
     Thread* thread = Thread::Current();
     Error& error = Error::Handle();
@@ -2178,10 +2096,14 @@
     Script& script = Script::Handle(Z, function.script());
     helper.InitFromScript(script);
 
+    const Class& owner_class = Class::Handle(Z, function.Owner());
+    ActiveClass active_class;
+    ActiveClassScope active_class_scope(&active_class, &owner_class);
+
     StreamingFlowGraphBuilder streaming_flow_graph_builder(
         &helper, Script::Handle(Z, function.script()), Z,
         ExternalTypedData::Handle(Z, function.KernelData()),
-        function.KernelDataProgramOffset(), /* active_class = */ NULL);
+        function.KernelDataProgramOffset(), &active_class);
     return streaming_flow_graph_builder.BuildParameterDescriptor(
         function.kernel_offset());
   } else {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index a305b30..53d60ec 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -17,6 +17,7 @@
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/compiler/frontend/scope_builder.h"
 
 namespace dart {
 namespace kernel {
@@ -56,109 +57,6 @@
 };
 typedef UnorderedHashMap<KernelConstMapKeyEqualsTraits> KernelConstantsMap;
 
-template <typename K, typename V>
-class Map : public DirectChainedHashMap<RawPointerKeyValueTrait<K, V> > {
- public:
-  typedef typename RawPointerKeyValueTrait<K, V>::Key Key;
-  typedef typename RawPointerKeyValueTrait<K, V>::Value Value;
-  typedef typename RawPointerKeyValueTrait<K, V>::Pair Pair;
-
-  inline void Insert(const Key& key, const Value& value) {
-    Pair pair(key, value);
-    DirectChainedHashMap<RawPointerKeyValueTrait<K, V> >::Insert(pair);
-  }
-
-  inline V Lookup(const Key& key) {
-    Pair* pair =
-        DirectChainedHashMap<RawPointerKeyValueTrait<K, V> >::Lookup(key);
-    if (pair == NULL) {
-      return V();
-    } else {
-      return pair->value;
-    }
-  }
-
-  inline Pair* LookupPair(const Key& key) {
-    return DirectChainedHashMap<RawPointerKeyValueTrait<K, V> >::Lookup(key);
-  }
-};
-
-template <typename V>
-class IntKeyRawPointerValueTrait {
- public:
-  typedef intptr_t Key;
-  typedef V Value;
-
-  struct Pair {
-    Key key;
-    Value value;
-    Pair() : key(NULL), value() {}
-    Pair(const Key key, const Value& value) : key(key), value(value) {}
-    Pair(const Pair& other) : key(other.key), value(other.value) {}
-  };
-
-  static Key KeyOf(Pair kv) { return kv.key; }
-  static Value ValueOf(Pair kv) { return kv.value; }
-  static intptr_t Hashcode(Key key) { return key; }
-  static bool IsKeyEqual(Pair kv, Key key) { return kv.key == key; }
-};
-
-template <typename V>
-class IntMap : public DirectChainedHashMap<IntKeyRawPointerValueTrait<V> > {
- public:
-  typedef typename IntKeyRawPointerValueTrait<V>::Key Key;
-  typedef typename IntKeyRawPointerValueTrait<V>::Value Value;
-  typedef typename IntKeyRawPointerValueTrait<V>::Pair Pair;
-
-  inline void Insert(const Key& key, const Value& value) {
-    Pair pair(key, value);
-    DirectChainedHashMap<IntKeyRawPointerValueTrait<V> >::Insert(pair);
-  }
-
-  inline V Lookup(const Key& key) {
-    Pair* pair =
-        DirectChainedHashMap<IntKeyRawPointerValueTrait<V> >::Lookup(key);
-    if (pair == NULL) {
-      return V();
-    } else {
-      return pair->value;
-    }
-  }
-
-  inline Pair* LookupPair(const Key& key) {
-    return DirectChainedHashMap<IntKeyRawPointerValueTrait<V> >::Lookup(key);
-  }
-};
-
-template <typename K, typename V>
-class MallocMap
-    : public MallocDirectChainedHashMap<RawPointerKeyValueTrait<K, V> > {
- public:
-  typedef typename RawPointerKeyValueTrait<K, V>::Key Key;
-  typedef typename RawPointerKeyValueTrait<K, V>::Value Value;
-  typedef typename RawPointerKeyValueTrait<K, V>::Pair Pair;
-
-  inline void Insert(const Key& key, const Value& value) {
-    Pair pair(key, value);
-    MallocDirectChainedHashMap<RawPointerKeyValueTrait<K, V> >::Insert(pair);
-  }
-
-  inline V Lookup(const Key& key) {
-    Pair* pair =
-        MallocDirectChainedHashMap<RawPointerKeyValueTrait<K, V> >::Lookup(key);
-    if (pair == NULL) {
-      return V();
-    } else {
-      return pair->value;
-    }
-  }
-
-  inline Pair* LookupPair(const Key& key) {
-    return MallocDirectChainedHashMap<RawPointerKeyValueTrait<K, V> >::Lookup(
-        key);
-  }
-};
-
 class BreakableBlock;
 class CatchBlock;
 class FlowGraphBuilder;
@@ -201,172 +99,6 @@
 
 typedef ZoneGrowableArray<PushArgumentInstr*>* ArgumentArray;
 
-class ActiveClass {
- public:
-  ActiveClass()
-      : klass(NULL),
-        member(NULL),
-        enclosing(NULL),
-        local_type_parameters(NULL) {}
-
-  bool HasMember() { return member != NULL; }
-
-  bool MemberIsProcedure() {
-    ASSERT(member != NULL);
-    RawFunction::Kind function_kind = member->kind();
-    return function_kind == RawFunction::kRegularFunction ||
-           function_kind == RawFunction::kGetterFunction ||
-           function_kind == RawFunction::kSetterFunction ||
-           function_kind == RawFunction::kMethodExtractor ||
-           function_kind == RawFunction::kDynamicInvocationForwarder ||
-           member->IsFactory();
-  }
-
-  bool MemberIsFactoryProcedure() {
-    ASSERT(member != NULL);
-    return member->IsFactory();
-  }
-
-  intptr_t MemberTypeParameterCount(Zone* zone);
-
-  intptr_t ClassNumTypeArguments() {
-    ASSERT(klass != NULL);
-    return klass->NumTypeArguments();
-  }
-
-  const char* ToCString() {
-    return member != NULL ? member->ToCString() : klass->ToCString();
-  }
-
-  // The current enclosing class (or the library top-level class).
-  const Class* klass;
-
-  const Function* member;
-
-  // The innermost enclosing function. This is used for building types, as a
-  // parent for function types.
-  const Function* enclosing;
-
-  const TypeArguments* local_type_parameters;
-};
-
-class ActiveClassScope {
- public:
-  ActiveClassScope(ActiveClass* active_class, const Class* klass)
-      : active_class_(active_class), saved_(*active_class) {
-    active_class_->klass = klass;
-  }
-
-  ~ActiveClassScope() { *active_class_ = saved_; }
-
- private:
-  ActiveClass* active_class_;
-  ActiveClass saved_;
-};
-
-class ActiveMemberScope {
- public:
-  ActiveMemberScope(ActiveClass* active_class, const Function* member)
-      : active_class_(active_class), saved_(*active_class) {
-    // The class is inherited.
-    active_class_->member = member;
-  }
-
-  ~ActiveMemberScope() { *active_class_ = saved_; }
-
- private:
-  ActiveClass* active_class_;
-  ActiveClass saved_;
-};
-
-class ActiveTypeParametersScope {
- public:
-  // Set the local type parameters of the ActiveClass to be exactly all type
-  // parameters defined by 'innermost' and any enclosing *closures* (but not
-  // enclosing methods/top-level functions/classes).
-  //
-  // Also, the enclosing function is set to 'innermost'.
-  ActiveTypeParametersScope(ActiveClass* active_class,
-                            const Function& innermost,
-                            Zone* Z);
-
-  // Append the list of the local type parameters to the list in ActiveClass.
-  //
-  // Also, the enclosing function is set to 'function'.
-  ActiveTypeParametersScope(ActiveClass* active_class,
-                            const Function* function,
-                            const TypeArguments& new_params,
-                            Zone* Z);
-
-  ~ActiveTypeParametersScope() { *active_class_ = saved_; }
-
- private:
-  ActiveClass* active_class_;
-  ActiveClass saved_;
-};
-
-struct FunctionScope {
-  intptr_t kernel_offset;
-  LocalScope* scope;
-};
-
-class ScopeBuildingResult : public ZoneAllocated {
- public:
-  ScopeBuildingResult()
-      : this_variable(NULL),
-        type_arguments_variable(NULL),
-        switch_variable(NULL),
-        finally_return_variable(NULL),
-        setter_value(NULL),
-        yield_jump_variable(NULL),
-        yield_context_variable(NULL),
-        raw_variable_counter_(0) {}
-
-  IntMap<LocalVariable*> locals;
-  IntMap<LocalScope*> scopes;
-  GrowableArray<FunctionScope> function_scopes;
-
-  // Only non-NULL for instance functions.
-  LocalVariable* this_variable;
-
-  // Only non-NULL for factory constructor functions.
-  LocalVariable* type_arguments_variable;
-
-  // Non-NULL when the function contains a switch statement.
-  LocalVariable* switch_variable;
-
-  // Non-NULL when the function contains a return inside a finally block.
-  LocalVariable* finally_return_variable;
-
-  // Non-NULL when the function is a setter.
-  LocalVariable* setter_value;
-
-  // Non-NULL if the function contains yield statement.
-  // TODO(27590) actual variable is called :await_jump_var, we should rename
-  // it to reflect the fact that it is used for both await and yield.
-  LocalVariable* yield_jump_variable;
-
-  // Non-NULL if the function contains yield statement.
-  // TODO(27590) actual variable is called :await_ctx_var, we should rename
-  // it to reflect the fact that it is used for both await and yield.
-  LocalVariable* yield_context_variable;
-
-  // Variables used in exception handlers, one per exception handler nesting
-  // level.
-  GrowableArray<LocalVariable*> exception_variables;
-  GrowableArray<LocalVariable*> stack_trace_variables;
-  GrowableArray<LocalVariable*> catch_context_variables;
-
-  // These are used to access the raw exception/stacktrace variables (and are
-  // used to put them into the captured variables in the context).
-  GrowableArray<LocalVariable*> raw_exception_variables;
-  GrowableArray<LocalVariable*> raw_stack_trace_variables;
-  intptr_t raw_variable_counter_;
-
-  // For-in iterators, one per for-in nesting level.
-  GrowableArray<LocalVariable*> iterator_variables;
-};
-
 struct YieldContinuation {
   Instruction* entry;
   intptr_t try_index;
@@ -518,7 +250,6 @@
   intptr_t pending_argument_count_;
 
   friend class TryCatchBlock;
-  friend class KernelReaderHelper;
   friend class StreamingFlowGraphBuilder;
   friend class FlowGraphBuilder;
   friend class PrologueBuilder;
@@ -526,8 +257,7 @@
 
 class FlowGraphBuilder : public BaseFlowGraphBuilder {
  public:
-  FlowGraphBuilder(intptr_t kernel_offset,
-                   ParsedFunction* parsed_function,
+  FlowGraphBuilder(ParsedFunction* parsed_function,
                    const ZoneGrowableArray<const ICData*>& ic_data_array,
                    ZoneGrowableArray<intptr_t>* context_level_array,
                    InlineExitCollector* exit_collector,
@@ -684,8 +414,6 @@
   Thread* thread_;
   Zone* zone_;
 
-  intptr_t kernel_offset_;
-
   ParsedFunction* parsed_function_;
   const bool optimizing_;
   intptr_t osr_id_;
@@ -744,9 +472,7 @@
 
   friend class BreakableBlock;
   friend class CatchBlock;
-  friend class KernelReaderHelper;
   friend class StreamingFlowGraphBuilder;
-  friend class ScopeBuilder;
   friend class SwitchBlock;
   friend class TryCatchBlock;
   friend class TryFinallyBlock;
@@ -964,7 +690,8 @@
   intptr_t catch_try_index_;
 };
 
-RawObject* EvaluateMetadata(const Field& metadata_field);
+RawObject* EvaluateMetadata(const Field& metadata_field,
+                            bool is_annotations_offset);
 RawObject* BuildParameterDescriptor(const Function& function);
 void CollectTokenPositionsFor(const Script& script);
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 2c963ac..8e6e3b39 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -7,6 +7,8 @@
 #include "vm/class_finalizer.h"
 #include "vm/compiler/aot/precompiler.h"
 #include "vm/log.h"
+#include "vm/object_store.h"
+#include "vm/parser.h"  // for ParsedFunction
 #include "vm/symbols.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -799,7 +801,10 @@
       if (++next_read_ == field) return;
       /* Falls through */
     case kAnnotations:
-      helper_->SkipListOfExpressions();  // read annotations.
+      annotation_count_ = helper_->ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < annotation_count_; ++i) {
+        helper_->SkipExpression();  // read ith expression.
+      }
       if (++next_read_ == field) return;
       /* Falls through */
     case kFlags:
@@ -1299,7 +1304,10 @@
     }
       /* Falls through */
     case kAnnotations: {
-      helper_->SkipListOfExpressions();
+      annotation_count_ = helper_->ReadListLength();
+      for (intptr_t i = 0; i < annotation_count_; ++i) {
+        helper_->SkipExpression();  // read ith expression.
+      }
       if (++next_read_ == field) return;
     }
       /* Falls through */
@@ -1499,6 +1507,153 @@
   }
 }
 
+DirectCallMetadataHelper::DirectCallMetadataHelper(KernelReaderHelper* helper)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
+
+bool DirectCallMetadataHelper::ReadMetadata(intptr_t node_offset,
+                                            NameIndex* target_name,
+                                            bool* check_receiver_for_null) {
+  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    return false;
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+
+  *target_name = helper_->ReadCanonicalNameReference();
+  *check_receiver_for_null = helper_->ReadBool();
+  return true;
+}
+
+DirectCallMetadata DirectCallMetadataHelper::GetDirectTargetForPropertyGet(
+    intptr_t node_offset) {
+  NameIndex kernel_name;
+  bool check_receiver_for_null = false;
+  if (!ReadMetadata(node_offset, &kernel_name, &check_receiver_for_null)) {
+    return DirectCallMetadata(Function::null_function(), false);
+  }
+
+  if (H.IsProcedure(kernel_name) && !H.IsGetter(kernel_name)) {
+    // Tear-off. Use method extractor as direct call target.
+    const String& method_name = H.DartMethodName(kernel_name);
+    const Function& target_method = Function::ZoneHandle(
+        helper_->zone_, H.LookupMethodByMember(kernel_name, method_name));
+    const String& getter_name = H.DartGetterName(kernel_name);
+    return DirectCallMetadata(
+        Function::ZoneHandle(helper_->zone_,
+                             target_method.GetMethodExtractor(getter_name)),
+        check_receiver_for_null);
+  } else {
+    const String& getter_name = H.DartGetterName(kernel_name);
+    const Function& target = Function::ZoneHandle(
+        helper_->zone_, H.LookupMethodByMember(kernel_name, getter_name));
+    ASSERT(target.IsGetterFunction() || target.IsImplicitGetterFunction());
+    return DirectCallMetadata(target, check_receiver_for_null);
+  }
+}
+
+DirectCallMetadata DirectCallMetadataHelper::GetDirectTargetForPropertySet(
+    intptr_t node_offset) {
+  NameIndex kernel_name;
+  bool check_receiver_for_null = false;
+  if (!ReadMetadata(node_offset, &kernel_name, &check_receiver_for_null)) {
+    return DirectCallMetadata(Function::null_function(), false);
+  }
+
+  const String& method_name = H.DartSetterName(kernel_name);
+  const Function& target = Function::ZoneHandle(
+      helper_->zone_, H.LookupMethodByMember(kernel_name, method_name));
+  ASSERT(target.IsSetterFunction() || target.IsImplicitSetterFunction());
+
+  return DirectCallMetadata(target, check_receiver_for_null);
+}
+
+DirectCallMetadata DirectCallMetadataHelper::GetDirectTargetForMethodInvocation(
+    intptr_t node_offset) {
+  NameIndex kernel_name;
+  bool check_receiver_for_null = false;
+  if (!ReadMetadata(node_offset, &kernel_name, &check_receiver_for_null)) {
+    return DirectCallMetadata(Function::null_function(), false);
+  }
+
+  const String& method_name = H.DartProcedureName(kernel_name);
+  const Function& target = Function::ZoneHandle(
+      helper_->zone_, H.LookupMethodByMember(kernel_name, method_name));
+
+  return DirectCallMetadata(target, check_receiver_for_null);
+}
+
+InferredTypeMetadataHelper::InferredTypeMetadataHelper(
+    KernelReaderHelper* helper)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
+
+InferredTypeMetadata InferredTypeMetadataHelper::GetInferredType(
+    intptr_t node_offset) {
+  const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    return InferredTypeMetadata(kDynamicCid, true);
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+
+  const NameIndex kernel_name = helper_->ReadCanonicalNameReference();
+  const bool nullable = helper_->ReadBool();
+
+  if (H.IsRoot(kernel_name)) {
+    return InferredTypeMetadata(kDynamicCid, nullable);
+  }
+
+  const Class& klass =
+      Class::Handle(helper_->zone_, H.LookupClassByKernelClass(kernel_name));
+  ASSERT(!klass.IsNull());
+
+  intptr_t cid = klass.id();
+  if (cid == kClosureCid) {
+    // VM uses more specific function types and doesn't expect instances of
+    // _Closure class, so inferred _Closure class doesn't make sense for the VM.
+    cid = kDynamicCid;
+  }
+
+  return InferredTypeMetadata(cid, nullable);
+}
+
+ProcedureAttributesMetadataHelper::ProcedureAttributesMetadataHelper(
+    KernelReaderHelper* helper)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
+
+bool ProcedureAttributesMetadataHelper::ReadMetadata(
+    intptr_t node_offset,
+    ProcedureAttributesMetadata* metadata) {
+  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    return false;
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+
+  const int kDynamicUsesBit = 1 << 0;
+  const int kNonThisUsesBit = 1 << 1;
+  const int kTearOffUsesBit = 1 << 2;
+
+  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;
+  return true;
+}
+
+ProcedureAttributesMetadata
+ProcedureAttributesMetadataHelper::GetProcedureAttributes(
+    intptr_t node_offset) {
+  ProcedureAttributesMetadata metadata;
+  ReadMetadata(node_offset, &metadata);
+  return metadata;
+}
+
 intptr_t KernelReaderHelper::ReaderOffset() const {
   return reader_.offset();
 }
@@ -1627,6 +1782,29 @@
                 Reader::TagName(tag), variant);
 }
 
+void KernelReaderHelper::ReadUntilFunctionNode() {
+  const Tag tag = PeekTag();
+  if (tag == kProcedure) {
+    ProcedureHelper procedure_helper(this);
+    procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
+    if (ReadTag() == kNothing) {  // read function node tag.
+      // Running a procedure without a function node doesn't make sense.
+      UNREACHABLE();
+    }
+    // Now at start of FunctionNode.
+  } else if (tag == kConstructor) {
+    ConstructorHelper constructor_helper(this);
+    constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
+    // Now at start of FunctionNode.
+    // Notice that we also have a list of initializers after that!
+  } else if (tag == kFunctionNode) {
+    // Already at start of FunctionNode.
+  } else {
+    ReportUnexpectedTag("a procedure, a constructor or a function node", tag);
+    UNREACHABLE();
+  }
+}
+
 void KernelReaderHelper::SkipDartType() {
   Tag tag = ReadTag();
   switch (tag) {
@@ -1757,10 +1935,12 @@
       SkipExpression();              // read value.
       return;
     case kSuperInitializer:
+      ReadPosition();                // read position.
       SkipCanonicalNameReference();  // read target_reference.
       SkipArguments();               // read arguments.
       return;
     case kRedirectingInitializer:
+      ReadPosition();                // read position.
       SkipCanonicalNameReference();  // read target_reference.
       SkipArguments();               // read arguments.
       return;
@@ -2199,6 +2379,536 @@
   return position;
 }
 
+intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) {
+  ASSERT(member != NULL);
+  if (member->IsFactory()) {
+    TypeArguments& class_types =
+        TypeArguments::Handle(zone, klass->type_parameters());
+    return class_types.Length();
+  } else if (member->IsMethodExtractor()) {
+    Function& extracted =
+        Function::Handle(zone, member->extracted_method_closure());
+    TypeArguments& function_types =
+        TypeArguments::Handle(zone, extracted.type_parameters());
+    return function_types.Length();
+  } else {
+    TypeArguments& function_types =
+        TypeArguments::Handle(zone, member->type_parameters());
+    return function_types.Length();
+  }
+}
+
+ActiveTypeParametersScope::ActiveTypeParametersScope(ActiveClass* active_class,
+                                                     const Function& innermost,
+                                                     Zone* Z)
+    : active_class_(active_class), saved_(*active_class) {
+  active_class_->enclosing = &innermost;
+
+  intptr_t num_params = 0;
+
+  Function& f = Function::Handle(Z);
+  TypeArguments& f_params = TypeArguments::Handle(Z);
+  for (f = innermost.raw(); f.parent_function() != Object::null();
+       f = f.parent_function()) {
+    f_params = f.type_parameters();
+    num_params += f_params.Length();
+  }
+  if (num_params == 0) return;
+
+  TypeArguments& params =
+      TypeArguments::Handle(Z, TypeArguments::New(num_params));
+
+  intptr_t index = num_params;
+  for (f = innermost.raw(); f.parent_function() != Object::null();
+       f = f.parent_function()) {
+    f_params = f.type_parameters();
+    for (intptr_t j = f_params.Length() - 1; j >= 0; --j) {
+      params.SetTypeAt(--index, AbstractType::Handle(Z, f_params.TypeAt(j)));
+    }
+  }
+
+  active_class_->local_type_parameters = &params;
+}
+
+ActiveTypeParametersScope::ActiveTypeParametersScope(
+    ActiveClass* active_class,
+    const Function* function,
+    const TypeArguments& new_params,
+    Zone* Z)
+    : active_class_(active_class), saved_(*active_class) {
+  active_class_->enclosing = function;
+
+  if (new_params.IsNull()) return;
+
+  const TypeArguments* old_params = active_class->local_type_parameters;
+  const intptr_t old_param_count =
+      old_params == NULL ? 0 : old_params->Length();
+  const TypeArguments& extended_params = TypeArguments::Handle(
+      Z, TypeArguments::New(old_param_count + new_params.Length()));
+
+  intptr_t index = 0;
+  for (intptr_t i = 0; i < old_param_count; ++i) {
+    extended_params.SetTypeAt(
+        index++, AbstractType::ZoneHandle(Z, old_params->TypeAt(i)));
+  }
+  for (intptr_t i = 0; i < new_params.Length(); ++i) {
+    extended_params.SetTypeAt(
+        index++, AbstractType::ZoneHandle(Z, new_params.TypeAt(i)));
+  }
+
+  active_class_->local_type_parameters = &extended_params;
+}
+
+TypeTranslator::TypeTranslator(KernelReaderHelper* helper,
+                               ActiveClass* active_class,
+                               bool finalize)
+    : helper_(helper),
+      translation_helper_(helper->translation_helper_),
+      active_class_(active_class),
+      type_parameter_scope_(NULL),
+      zone_(translation_helper_.zone()),
+      result_(AbstractType::Handle(translation_helper_.zone())),
+      finalize_(finalize) {}
+
+AbstractType& TypeTranslator::BuildType() {
+  BuildTypeInternal();
+
+  // We return a new `ZoneHandle` here on purpose: The intermediate language
+  // instructions do not make a copy of the handle, so we do it.
+  return AbstractType::ZoneHandle(Z, result_.raw());
+}
+
+AbstractType& TypeTranslator::BuildTypeWithoutFinalization() {
+  bool saved_finalize = finalize_;
+  finalize_ = false;
+  BuildTypeInternal();
+  finalize_ = saved_finalize;
+
+  // We return a new `ZoneHandle` here on purpose: The intermediate language
+  // instructions do not make a copy of the handle, so we do it.
+  return AbstractType::ZoneHandle(Z, result_.raw());
+}
+
+AbstractType& TypeTranslator::BuildVariableType() {
+  AbstractType& abstract_type = BuildType();
+
+  // We return a new `ZoneHandle` here on purpose: The intermediate language
+  // instructions do not make a copy of the handle, so we do it.
+  AbstractType& type = Type::ZoneHandle(Z);
+
+  if (abstract_type.IsMalformed()) {
+    type = AbstractType::dynamic_type().raw();
+  } else {
+    type = result_.raw();
+  }
+
+  return type;
+}
+
+void TypeTranslator::BuildTypeInternal(bool invalid_as_dynamic) {
+  Tag tag = helper_->ReadTag();
+  switch (tag) {
+    case kInvalidType:
+      if (invalid_as_dynamic) {
+        result_ = Object::dynamic_type().raw();
+      } else {
+        result_ = ClassFinalizer::NewFinalizedMalformedType(
+            Error::Handle(Z),  // No previous error.
+            Script::Handle(Z, Script::null()), TokenPosition::kNoSource,
+            "[InvalidType] in Kernel IR.");
+      }
+      break;
+    case kDynamicType:
+      result_ = Object::dynamic_type().raw();
+      break;
+    case kVoidType:
+      result_ = Object::void_type().raw();
+      break;
+    case kBottomType:
+      result_ =
+          Class::Handle(Z, I->object_store()->null_class()).CanonicalType();
+      break;
+    case kInterfaceType:
+      BuildInterfaceType(false);
+      break;
+    case kSimpleInterfaceType:
+      BuildInterfaceType(true);
+      break;
+    case kFunctionType:
+      BuildFunctionType(false);
+      break;
+    case kSimpleFunctionType:
+      BuildFunctionType(true);
+      break;
+    case kTypeParameterType:
+      BuildTypeParameterType();
+      break;
+    default:
+      helper_->ReportUnexpectedTag("type", tag);
+      UNREACHABLE();
+  }
+}
+
+void TypeTranslator::BuildInterfaceType(bool simple) {
+  // NOTE: That an interface type like `T<A, B>` is considered to be
+  // malformed iff `T` is malformed.
+  //   => We therefore ignore errors in `A` or `B`.
+
+  NameIndex klass_name =
+      helper_->ReadCanonicalNameReference();  // read klass_name.
+
+  intptr_t length;
+  if (simple) {
+    length = 0;
+  } else {
+    length = helper_->ReadListLength();  // read type_arguments list length.
+  }
+  const TypeArguments& type_arguments =
+      BuildTypeArguments(length);  // read type arguments.
+
+  Object& klass = Object::Handle(Z, H.LookupClassByKernelClass(klass_name));
+  result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
+  if (finalize_) {
+    ASSERT(active_class_->klass != NULL);
+    result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
+  }
+}
+
+void TypeTranslator::BuildFunctionType(bool simple) {
+  Function& signature_function = Function::ZoneHandle(
+      Z, Function::NewSignatureFunction(*active_class_->klass,
+                                        active_class_->enclosing != NULL
+                                            ? *active_class_->enclosing
+                                            : Function::Handle(Z),
+                                        TokenPosition::kNoSource));
+
+  // Suspend finalization of types inside this one. They will be finalized after
+  // the whole function type is constructed.
+  //
+  // TODO(31213): Test further when nested generic function types
+  // are supported by fasta.
+  bool finalize = finalize_;
+  finalize_ = false;
+
+  if (!simple) {
+    LoadAndSetupTypeParameters(active_class_, signature_function,
+                               helper_->ReadListLength(), signature_function);
+  }
+
+  ActiveTypeParametersScope scope(
+      active_class_, &signature_function,
+      TypeArguments::Handle(Z, signature_function.type_parameters()), Z);
+
+  intptr_t required_count;
+  intptr_t all_count;
+  intptr_t positional_count;
+  if (!simple) {
+    required_count = helper_->ReadUInt();  // read required parameter count.
+    all_count = helper_->ReadUInt();       // read total parameter count.
+    positional_count =
+        helper_->ReadListLength();  // read positional_parameters list length.
+  } else {
+    positional_count =
+        helper_->ReadListLength();  // read positional_parameters list length.
+    required_count = positional_count;
+    all_count = positional_count;
+  }
+
+  const Array& parameter_types =
+      Array::Handle(Z, Array::New(1 + all_count, Heap::kOld));
+  signature_function.set_parameter_types(parameter_types);
+  const Array& parameter_names =
+      Array::Handle(Z, Array::New(1 + all_count, Heap::kOld));
+  signature_function.set_parameter_names(parameter_names);
+
+  intptr_t pos = 0;
+  parameter_types.SetAt(pos, AbstractType::dynamic_type());
+  parameter_names.SetAt(pos, H.DartSymbolPlain("_receiver_"));
+  ++pos;
+  for (intptr_t i = 0; i < positional_count; ++i, ++pos) {
+    BuildTypeInternal();  // read ith positional parameter.
+    if (result_.IsMalformed()) {
+      result_ = AbstractType::dynamic_type().raw();
+    }
+    parameter_types.SetAt(pos, result_);
+    parameter_names.SetAt(pos, H.DartSymbolPlain("noname"));
+  }
+
+  // The additional first parameter is the receiver type (set to dynamic).
+  signature_function.set_num_fixed_parameters(1 + required_count);
+  signature_function.SetNumOptionalParameters(
+      all_count - required_count, positional_count > required_count);
+
+  if (!simple) {
+    const intptr_t named_count =
+        helper_->ReadListLength();  // read named_parameters list length.
+    for (intptr_t i = 0; i < named_count; ++i, ++pos) {
+      // read string reference (i.e. named_parameters[i].name).
+      String& name = H.DartSymbolObfuscate(helper_->ReadStringReference());
+      BuildTypeInternal();  // read named_parameters[i].type.
+      if (result_.IsMalformed()) {
+        result_ = AbstractType::dynamic_type().raw();
+      }
+      parameter_types.SetAt(pos, result_);
+      parameter_names.SetAt(pos, name);
+    }
+  }
+
+  helper_->SkipListOfStrings();  // read positional parameter names.
+
+  if (!simple) {
+    helper_->SkipCanonicalNameReference();  // read typedef reference.
+  }
+
+  BuildTypeInternal();  // read return type.
+  if (result_.IsMalformed()) {
+    result_ = AbstractType::dynamic_type().raw();
+  }
+  signature_function.set_result_type(result_);
+
+  finalize_ = finalize;
+
+  Type& signature_type =
+      Type::ZoneHandle(Z, signature_function.SignatureType());
+
+  if (finalize_) {
+    signature_type ^=
+        ClassFinalizer::FinalizeType(*active_class_->klass, signature_type);
+    // Do not refer to signature_function anymore, since it may have been
+    // replaced during canonicalization.
+    signature_function = Function::null();
+  }
+
+  result_ = signature_type.raw();
+}
+
+void TypeTranslator::BuildTypeParameterType() {
+  intptr_t parameter_index = helper_->ReadUInt();  // read parameter index.
+  helper_->SkipOptionalDartType();                 // read bound.
+
+  const TypeArguments& class_types =
+      TypeArguments::Handle(Z, active_class_->klass->type_parameters());
+  if (parameter_index < class_types.Length()) {
+    // The index of the type parameter in [parameters] is
+    // the same index into the `klass->type_parameters()` array.
+    result_ ^= class_types.TypeAt(parameter_index);
+    return;
+  }
+  parameter_index -= class_types.Length();
+
+  if (active_class_->HasMember()) {
+    if (active_class_->MemberIsFactoryProcedure()) {
+      //
+      // WARNING: This is a little hackish:
+      //
+      // We have a static factory constructor. The kernel IR gives the factory
+      // constructor function its own type parameters (which are equal in name
+      // and number to the ones of the enclosing class). I.e.,
+      //
+      //   class A<T> {
+      //     factory A.x() { return new B<T>(); }
+      //   }
+      //
+      //  is basically translated to this:
+      //
+      //   class A<T> {
+      //     static A.x<T'>() { return new B<T'>(); }
+      //   }
+      //
+      if (class_types.Length() > parameter_index) {
+        result_ ^= class_types.TypeAt(parameter_index);
+        return;
+      }
+      parameter_index -= class_types.Length();
+    }
+
+    intptr_t procedure_type_parameter_count =
+        active_class_->MemberIsProcedure()
+            ? active_class_->MemberTypeParameterCount(Z)
+            : 0;
+    if (procedure_type_parameter_count > 0) {
+      if (procedure_type_parameter_count > parameter_index) {
+        if (I->reify_generic_functions()) {
+          result_ ^=
+              TypeArguments::Handle(Z, active_class_->member->type_parameters())
+                  .TypeAt(parameter_index);
+        } else {
+          result_ ^= Type::DynamicType();
+        }
+        return;
+      }
+      parameter_index -= procedure_type_parameter_count;
+    }
+  }
+
+  if (active_class_->local_type_parameters != NULL) {
+    if (parameter_index < active_class_->local_type_parameters->Length()) {
+      if (I->reify_generic_functions()) {
+        result_ ^=
+            active_class_->local_type_parameters->TypeAt(parameter_index);
+      } else {
+        result_ ^= Type::DynamicType();
+      }
+      return;
+    }
+    parameter_index -= active_class_->local_type_parameters->Length();
+  }
+
+  if (type_parameter_scope_ != NULL &&
+      parameter_index < type_parameter_scope_->outer_parameter_count() +
+                            type_parameter_scope_->parameter_count()) {
+    result_ ^= Type::DynamicType();
+    return;
+  }
+
+  H.ReportError(
+      helper_->script(), TokenPosition::kNoSource,
+      "Unbound type parameter found in %s.  Please report this at dartbug.com.",
+      active_class_->ToCString());
+}
+
+const TypeArguments& TypeTranslator::BuildTypeArguments(intptr_t length) {
+  bool only_dynamic = true;
+  intptr_t offset = helper_->ReaderOffset();
+  for (intptr_t i = 0; i < length; ++i) {
+    if (helper_->ReadTag() != kDynamicType) {  // Read the ith types tag.
+      only_dynamic = false;
+      helper_->SetOffset(offset);
+      break;
+    }
+  }
+  TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z);
+  if (!only_dynamic) {
+    type_arguments = TypeArguments::New(length);
+    for (intptr_t i = 0; i < length; ++i) {
+      BuildTypeInternal(true);  // read ith type.
+      type_arguments.SetTypeAt(i, result_);
+    }
+
+    if (finalize_) {
+      type_arguments = type_arguments.Canonicalize();
+    }
+  }
+  return type_arguments;
+}
+
+const TypeArguments& TypeTranslator::BuildInstantiatedTypeArguments(
+    const Class& receiver_class,
+    intptr_t length) {
+  const TypeArguments& type_arguments = BuildTypeArguments(length);
+
+  // If type_arguments is null all arguments are dynamic.
+  // If, however, this class doesn't specify all the type arguments directly we
+  // still need to finalize the type below in order to get any non-dynamic types
+  // from any super. See http://www.dartbug.com/29537.
+  if (type_arguments.IsNull() && receiver_class.NumTypeArguments() == length) {
+    return type_arguments;
+  }
+
+  // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
+  // finalize the argument types.
+  // (This can for example make the [type_arguments] vector larger)
+  Type& type = Type::Handle(
+      Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
+  if (finalize_) {
+    type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
+  }
+
+  const TypeArguments& instantiated_type_arguments =
+      TypeArguments::ZoneHandle(Z, type.arguments());
+  return instantiated_type_arguments;
+}
+
+void TypeTranslator::LoadAndSetupTypeParameters(
+    ActiveClass* active_class,
+    const Object& set_on,
+    intptr_t type_parameter_count,
+    const Function& parameterized_function) {
+  ASSERT(type_parameter_count >= 0);
+  if (type_parameter_count == 0) {
+    return;
+  }
+  ASSERT(set_on.IsClass() || set_on.IsFunction());
+  bool set_on_class = set_on.IsClass();
+  ASSERT(set_on_class == parameterized_function.IsNull());
+
+  // First setup the type parameters, so if any of the following code uses it
+  // (in a recursive way) we're fine.
+  TypeArguments& type_parameters = TypeArguments::Handle(Z);
+  TypeParameter& parameter = TypeParameter::Handle(Z);
+  const Type& null_bound = Type::Handle(Z);
+
+  // Step a) Create array of [TypeParameter] objects (without bound).
+  type_parameters = TypeArguments::New(type_parameter_count);
+  const Library& lib = Library::Handle(Z, active_class->klass->library());
+  {
+    AlternativeReadingScope alt(&helper_->reader_);
+    for (intptr_t i = 0; i < type_parameter_count; i++) {
+      TypeParameterHelper helper(helper_);
+      helper.Finish();
+      parameter = TypeParameter::New(
+          set_on_class ? *active_class->klass : Class::Handle(Z),
+          parameterized_function, i,
+          H.DartIdentifier(lib, helper.name_index_),  // read ith name index.
+          null_bound, TokenPosition::kNoSource);
+      type_parameters.SetTypeAt(i, parameter);
+    }
+  }
+
+  if (set_on.IsClass()) {
+    Class::Cast(set_on).set_type_parameters(type_parameters);
+  } else {
+    Function::Cast(set_on).set_type_parameters(type_parameters);
+  }
+
+  const Function* enclosing = NULL;
+  if (!parameterized_function.IsNull()) {
+    enclosing = &parameterized_function;
+  }
+  ActiveTypeParametersScope scope(active_class, enclosing, type_parameters, Z);
+
+  // Step b) Fill in the bounds of all [TypeParameter]s.
+  for (intptr_t i = 0; i < type_parameter_count; i++) {
+    TypeParameterHelper helper(helper_);
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+
+    // TODO(github.com/dart-lang/kernel/issues/42): This should be handled
+    // by the frontend.
+    parameter ^= type_parameters.TypeAt(i);
+    const Tag tag = helper_->PeekTag();  // peek ith bound type.
+    if (tag == kDynamicType) {
+      helper_->SkipDartType();  // read ith bound.
+      parameter.set_bound(Type::Handle(Z, I->object_store()->object_type()));
+    } else {
+      AbstractType& bound = BuildTypeWithoutFinalization();  // read ith bound.
+      if (bound.IsMalformedOrMalbounded()) {
+        bound = I->object_store()->object_type();
+      }
+      parameter.set_bound(bound);
+    }
+
+    helper.Finish();
+  }
+}
+
+const Type& TypeTranslator::ReceiverType(const Class& klass) {
+  ASSERT(!klass.IsNull());
+  ASSERT(!klass.IsTypedefClass());
+  // Note that if klass is _Closure, the returned type will be _Closure,
+  // and not the signature type.
+  Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
+  if (!type.IsNull()) {
+    return type;
+  }
+  type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
+                   klass.token_pos());
+  if (klass.is_type_finalized()) {
+    type ^= ClassFinalizer::FinalizeType(klass, type);
+    klass.SetCanonicalType(type);
+  }
+  return type;
+}
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 75d4566..f18a9bb 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -325,7 +325,7 @@
   };
 
   explicit VariableDeclarationHelper(KernelReaderHelper* helper)
-      : helper_(helper), next_read_(kPosition) {}
+      : annotation_count_(0), helper_(helper), next_read_(kPosition) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -348,6 +348,7 @@
   TokenPosition equals_position_;
   uint8_t flags_;
   StringIndex name_index_;
+  intptr_t annotation_count_;
 
  private:
   KernelReaderHelper* helper_;
@@ -728,7 +729,7 @@
   };
 
   explicit LibraryDependencyHelper(KernelReaderHelper* helper)
-      : helper_(helper), next_read_(kFileOffset) {}
+      : annotation_count_(0), helper_(helper), next_read_(kFileOffset) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -739,6 +740,7 @@
   uint8_t flags_;
   StringIndex name_index_;
   NameIndex target_library_canonical_name_;
+  intptr_t annotation_count_;
 
  private:
   KernelReaderHelper* helper_;
@@ -778,6 +780,77 @@
   intptr_t last_mapping_index_;
 };
 
+struct DirectCallMetadata {
+  DirectCallMetadata(const Function& target, bool check_receiver_for_null)
+      : target_(target), check_receiver_for_null_(check_receiver_for_null) {}
+
+  const Function& target_;
+  const bool check_receiver_for_null_;
+};
+
+// Helper class which provides access to direct call metadata.
+class DirectCallMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.direct-call.metadata"; }
+
+  explicit DirectCallMetadataHelper(KernelReaderHelper* helper);
+
+  DirectCallMetadata GetDirectTargetForPropertyGet(intptr_t node_offset);
+  DirectCallMetadata GetDirectTargetForPropertySet(intptr_t node_offset);
+  DirectCallMetadata GetDirectTargetForMethodInvocation(intptr_t node_offset);
+
+ private:
+  bool ReadMetadata(intptr_t node_offset,
+                    NameIndex* target_name,
+                    bool* check_receiver_for_null);
+};
+
+struct InferredTypeMetadata {
+  InferredTypeMetadata(intptr_t cid_, bool nullable_)
+      : cid(cid_), nullable(nullable_) {}
+
+  const intptr_t cid;
+  const bool nullable;
+
+  bool IsTrivial() const { return (cid == kDynamicCid) && nullable; }
+};
+
+// Helper class which provides access to inferred type metadata.
+class InferredTypeMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.inferred-type.metadata"; }
+
+  explicit InferredTypeMetadataHelper(KernelReaderHelper* helper);
+
+  InferredTypeMetadata GetInferredType(intptr_t node_offset);
+};
+
+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;
+};
+
+// Helper class which provides access to direct call metadata.
+class ProcedureAttributesMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.procedure-attributes.metadata"; }
+
+  explicit ProcedureAttributesMetadataHelper(KernelReaderHelper* helper);
+
+  ProcedureAttributesMetadata GetProcedureAttributes(intptr_t node_offset);
+
+ private:
+  bool ReadMetadata(intptr_t node_offset,
+                    ProcedureAttributesMetadata* metadata);
+};
+
 class KernelReaderHelper {
  public:
   KernelReaderHelper(Zone* zone,
@@ -809,6 +882,8 @@
   intptr_t ReadListLength();
   virtual void ReportUnexpectedTag(const char* variant, Tag tag);
 
+  void ReadUntilFunctionNode();
+
  protected:
   const Script& script() const { return script_; }
 
@@ -900,7 +975,7 @@
   friend class ProcedureHelper;
   friend class SimpleExpressionConverter;
   friend class StreamingConstantEvaluator;
-  friend class StreamingScopeBuilder;
+  friend class ScopeBuilder;
   friend class TypeParameterHelper;
   friend class TypeTranslator;
   friend class VariableDeclarationHelper;
@@ -910,6 +985,185 @@
 #endif  // defined(DART_USE_INTERPRETER)
 };
 
+class ActiveClass {
+ public:
+  ActiveClass()
+      : klass(NULL),
+        member(NULL),
+        enclosing(NULL),
+        local_type_parameters(NULL) {}
+
+  bool HasMember() { return member != NULL; }
+
+  bool MemberIsProcedure() {
+    ASSERT(member != NULL);
+    RawFunction::Kind function_kind = member->kind();
+    return function_kind == RawFunction::kRegularFunction ||
+           function_kind == RawFunction::kGetterFunction ||
+           function_kind == RawFunction::kSetterFunction ||
+           function_kind == RawFunction::kMethodExtractor ||
+           function_kind == RawFunction::kDynamicInvocationForwarder ||
+           member->IsFactory();
+  }
+
+  bool MemberIsFactoryProcedure() {
+    ASSERT(member != NULL);
+    return member->IsFactory();
+  }
+
+  intptr_t MemberTypeParameterCount(Zone* zone);
+
+  intptr_t ClassNumTypeArguments() {
+    ASSERT(klass != NULL);
+    return klass->NumTypeArguments();
+  }
+
+  const char* ToCString() {
+    return member != NULL ? member->ToCString() : klass->ToCString();
+  }
+
+  // The current enclosing class (or the library top-level class).
+  const Class* klass;
+
+  const Function* member;
+
+  // The innermost enclosing function. This is used for building types, as a
+  // parent for function types.
+  const Function* enclosing;
+
+  const TypeArguments* local_type_parameters;
+};
+
+class ActiveClassScope {
+ public:
+  ActiveClassScope(ActiveClass* active_class, const Class* klass)
+      : active_class_(active_class), saved_(*active_class) {
+    active_class_->klass = klass;
+  }
+
+  ~ActiveClassScope() { *active_class_ = saved_; }
+
+ private:
+  ActiveClass* active_class_;
+  ActiveClass saved_;
+};
+
+class ActiveMemberScope {
+ public:
+  ActiveMemberScope(ActiveClass* active_class, const Function* member)
+      : active_class_(active_class), saved_(*active_class) {
+    // The class is inherited.
+    active_class_->member = member;
+  }
+
+  ~ActiveMemberScope() { *active_class_ = saved_; }
+
+ private:
+  ActiveClass* active_class_;
+  ActiveClass saved_;
+};
+
+class ActiveTypeParametersScope {
+ public:
+  // Set the local type parameters of the ActiveClass to be exactly all type
+  // parameters defined by 'innermost' and any enclosing *closures* (but not
+  // enclosing methods/top-level functions/classes).
+  //
+  // Also, the enclosing function is set to 'innermost'.
+  ActiveTypeParametersScope(ActiveClass* active_class,
+                            const Function& innermost,
+                            Zone* Z);
+
+  // Append the list of the local type parameters to the list in ActiveClass.
+  //
+  // Also, the enclosing function is set to 'function'.
+  ActiveTypeParametersScope(ActiveClass* active_class,
+                            const Function* function,
+                            const TypeArguments& new_params,
+                            Zone* Z);
+
+  ~ActiveTypeParametersScope() { *active_class_ = saved_; }
+
+ private:
+  ActiveClass* active_class_;
+  ActiveClass saved_;
+};
+
+class TypeTranslator {
+ public:
+  TypeTranslator(KernelReaderHelper* helper,
+                 ActiveClass* active_class,
+                 bool finalize = false);
+
+  // Can return a malformed type.
+  AbstractType& BuildType();
+  // Can return a malformed type.
+  AbstractType& BuildTypeWithoutFinalization();
+  // Is guaranteed to be not malformed.
+  AbstractType& BuildVariableType();
+
+  // Will return `TypeArguments::null()` in case any of the arguments are
+  // malformed.
+  const TypeArguments& BuildTypeArguments(intptr_t length);
+
+  // Will return `TypeArguments::null()` in case any of the arguments are
+  // malformed.
+  const TypeArguments& BuildInstantiatedTypeArguments(
+      const Class& receiver_class,
+      intptr_t length);
+
+  void LoadAndSetupTypeParameters(ActiveClass* active_class,
+                                  const Object& set_on,
+                                  intptr_t type_parameter_count,
+                                  const Function& parameterized_function);
+
+  const Type& ReceiverType(const Class& klass);
+
+ private:
+  // Can build a malformed type.
+  void BuildTypeInternal(bool invalid_as_dynamic = false);
+  void BuildInterfaceType(bool simple);
+  void BuildFunctionType(bool simple);
+  void BuildTypeParameterType();
+
+  class TypeParameterScope {
+   public:
+    TypeParameterScope(TypeTranslator* translator, intptr_t parameter_count)
+        : parameter_count_(parameter_count),
+          outer_(translator->type_parameter_scope_),
+          translator_(translator) {
+      outer_parameter_count_ = 0;
+      if (outer_ != NULL) {
+        outer_parameter_count_ =
+            outer_->outer_parameter_count_ + outer_->parameter_count_;
+      }
+      translator_->type_parameter_scope_ = this;
+    }
+    ~TypeParameterScope() { translator_->type_parameter_scope_ = outer_; }
+
+    TypeParameterScope* outer() const { return outer_; }
+    intptr_t parameter_count() const { return parameter_count_; }
+    intptr_t outer_parameter_count() const { return outer_parameter_count_; }
+
+   private:
+    intptr_t parameter_count_;
+    intptr_t outer_parameter_count_;
+    TypeParameterScope* outer_;
+    TypeTranslator* translator_;
+  };
+
+  KernelReaderHelper* helper_;
+  TranslationHelper& translation_helper_;
+  ActiveClass* const active_class_;
+  TypeParameterScope* type_parameter_scope_;
+  Zone* zone_;
+  AbstractType& result_;
+  bool finalize_;
+
+  friend class ScopeBuilder;
+  friend class KernelLoader;
+};
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
new file mode 100644
index 0000000..21f2c04
--- /dev/null
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -0,0 +1,1691 @@
+// 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.
+
+#include "vm/compiler/frontend/scope_builder.h"
+
+#include "vm/compiler/backend/il.h"  // For CompileType.
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+namespace dart {
+namespace kernel {
+
+#define Z (zone_)
+#define H (translation_helper_)
+#define T (type_translator_)
+#define I Isolate::Current()
+
+bool IsFieldInitializer(const Function& function, Zone* zone) {
+  return (function.kind() == RawFunction::kImplicitStaticFinalGetter) &&
+         String::Handle(zone, function.name())
+             .StartsWith(Symbols::InitPrefix());
+}
+
+// Returns true if the given method can skip type checks for all arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantArguments(
+    const Function& method,
+    const ProcedureAttributesMetadata& attrs) {
+  // Dart 2 type system at non-dynamic call sites statically guarantees that
+  // argument values match declarated parameter types for all non-covariant
+  // and non-generic-covariant parameters. The same applies to type parameters
+  // bounds for type parameters of generic functions.
+  // In JIT mode we dynamically generate trampolines (dynamic invocation
+  // forwarders) that perform type checks when arriving to a method from a
+  // dynamic call-site.
+  // In AOT mode we don't dynamically generate such trampolines but
+  // instead rely on a static analysis to discover which methods can
+  // be invoked dynamically.
+  if (method.name() == Symbols::Call().raw()) {
+    // Currently we consider all call methods to be invoked dynamically and
+    // don't mangle their names.
+    // TODO(vegorov) remove this once we also introduce special type checking
+    // entry point for closures.
+    return false;
+  }
+  return !FLAG_precompiled_mode || !attrs.has_dynamic_invocations;
+}
+
+ScopeBuilder::ScopeBuilder(ParsedFunction* parsed_function)
+    : result_(NULL),
+      parsed_function_(parsed_function),
+      translation_helper_(Thread::Current()),
+      zone_(translation_helper_.zone()),
+      current_function_scope_(NULL),
+      scope_(NULL),
+      depth_(0),
+      name_index_(0),
+      needs_expr_temp_(false),
+      helper_(
+          zone_,
+          &translation_helper_,
+          Script::Handle(Z, parsed_function->function().script()),
+          ExternalTypedData::Handle(Z,
+                                    parsed_function->function().KernelData()),
+          parsed_function->function().KernelDataProgramOffset()),
+      inferred_type_metadata_helper_(&helper_),
+      procedure_attributes_metadata_helper_(&helper_),
+      type_translator_(&helper_,
+                       &active_class_,
+                       /*finalize=*/true) {
+  H.InitFromScript(helper_.script());
+  ASSERT(type_translator_.active_class_ == &active_class_);
+}
+
+ScopeBuildingResult* ScopeBuilder::BuildScopes() {
+  if (result_ != NULL) return result_;
+
+  ASSERT(scope_ == NULL && depth_.loop_ == 0 && depth_.function_ == 0);
+  result_ = new (Z) ScopeBuildingResult();
+
+  const Function& function = parsed_function_->function();
+
+  // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
+  // e.g. for type translation.
+  const Class& klass = Class::Handle(zone_, function.Owner());
+
+  Function& outermost_function =
+      Function::Handle(Z, function.GetOutermostFunction());
+
+  ActiveClassScope active_class_scope(&active_class_, &klass);
+  ActiveMemberScope active_member(&active_class_, &outermost_function);
+  ActiveTypeParametersScope active_type_params(&active_class_, function, Z);
+
+  LocalScope* enclosing_scope = NULL;
+  if (function.IsImplicitClosureFunction() && !function.is_static()) {
+    // Create artificial enclosing scope for the tear-off that contains
+    // captured receiver value. This ensure that AssertAssignable will correctly
+    // load instantiator type arguments if they are needed.
+    Class& klass = Class::Handle(Z, function.Owner());
+    Type& klass_type = H.GetCanonicalType(klass);
+    result_->this_variable =
+        MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                     Symbols::This(), klass_type);
+    result_->this_variable->set_index(VariableIndex(0));
+    result_->this_variable->set_is_captured();
+    enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
+    enclosing_scope->set_context_level(0);
+    enclosing_scope->AddVariable(result_->this_variable);
+  } else if (function.IsLocalFunction()) {
+    enclosing_scope = LocalScope::RestoreOuterScope(
+        ContextScope::Handle(Z, function.context_scope()));
+  }
+  current_function_scope_ = scope_ = new (Z) LocalScope(enclosing_scope, 0, 0);
+  scope_->set_begin_token_pos(function.token_pos());
+  scope_->set_end_token_pos(function.end_token_pos());
+
+  // Add function type arguments variable before current context variable.
+  if (I->reify_generic_functions() &&
+      (function.IsGeneric() || function.HasGenericParent())) {
+    LocalVariable* type_args_var = MakeVariable(
+        TokenPosition::kNoSource, TokenPosition::kNoSource,
+        Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
+    scope_->AddVariable(type_args_var);
+    parsed_function_->set_function_type_arguments(type_args_var);
+  }
+
+  if (parsed_function_->has_arg_desc_var()) {
+    needs_expr_temp_ = true;
+    scope_->AddVariable(parsed_function_->arg_desc_var());
+  }
+
+  LocalVariable* context_var = parsed_function_->current_context_var();
+  context_var->set_is_forced_stack();
+  scope_->AddVariable(context_var);
+
+  parsed_function_->SetNodeSequence(
+      new SequenceNode(TokenPosition::kNoSource, scope_));
+
+  helper_.SetOffset(function.kernel_offset());
+
+  FunctionNodeHelper function_node_helper(&helper_);
+  const ProcedureAttributesMetadata attrs =
+      procedure_attributes_metadata_helper_.GetProcedureAttributes(
+          function.kernel_offset());
+
+  switch (function.kind()) {
+    case RawFunction::kClosureFunction:
+    case RawFunction::kImplicitClosureFunction:
+    case RawFunction::kRegularFunction:
+    case RawFunction::kGetterFunction:
+    case RawFunction::kSetterFunction:
+    case RawFunction::kConstructor: {
+      const Tag tag = helper_.PeekTag();
+      helper_.ReadUntilFunctionNode();
+      function_node_helper.ReadUntilExcluding(
+          FunctionNodeHelper::kPositionalParameters);
+      current_function_async_marker_ = function_node_helper.async_marker_;
+      // NOTE: FunctionNode is read further below the if.
+
+      intptr_t pos = 0;
+      if (function.IsClosureFunction()) {
+        LocalVariable* closure_parameter = MakeVariable(
+            TokenPosition::kNoSource, TokenPosition::kNoSource,
+            Symbols::ClosureParameter(), AbstractType::dynamic_type());
+        closure_parameter->set_is_forced_stack();
+        scope_->InsertParameterAt(pos++, closure_parameter);
+      } else if (!function.is_static()) {
+        // We use [is_static] instead of [IsStaticFunction] because the latter
+        // returns `false` for constructors.
+        Class& klass = Class::Handle(Z, function.Owner());
+        Type& klass_type = H.GetCanonicalType(klass);
+        LocalVariable* variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         Symbols::This(), klass_type);
+        scope_->InsertParameterAt(pos++, variable);
+        result_->this_variable = variable;
+
+        // We visit instance field initializers because they might contain
+        // [Let] expressions and we need to have a mapping.
+        if (tag == kConstructor) {
+          Class& parent_class = Class::Handle(Z, function.Owner());
+          Array& class_fields = Array::Handle(Z, parent_class.fields());
+          Field& class_field = Field::Handle(Z);
+          for (intptr_t i = 0; i < class_fields.Length(); ++i) {
+            class_field ^= class_fields.At(i);
+            if (!class_field.is_static()) {
+              ExternalTypedData& kernel_data =
+                  ExternalTypedData::Handle(Z, class_field.KernelData());
+              ASSERT(!kernel_data.IsNull());
+              intptr_t field_offset = class_field.kernel_offset();
+              AlternativeReadingScope alt(&helper_.reader_, &kernel_data,
+                                          field_offset);
+              FieldHelper field_helper(&helper_);
+              field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
+              Tag initializer_tag =
+                  helper_.ReadTag();  // read first part of initializer.
+              if (initializer_tag == kSomething) {
+                EnterScope(field_offset);
+                VisitExpression();  // read initializer.
+                ExitScope(field_helper.position_, field_helper.end_position_);
+              }
+            }
+          }
+        }
+      } else if (function.IsFactory()) {
+        LocalVariable* variable = MakeVariable(
+            TokenPosition::kNoSource, TokenPosition::kNoSource,
+            Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type());
+        scope_->InsertParameterAt(pos++, variable);
+        result_->type_arguments_variable = variable;
+      }
+
+      ParameterTypeCheckMode type_check_mode = kTypeCheckAllParameters;
+      if (function.IsNonImplicitClosureFunction()) {
+        type_check_mode = kTypeCheckAllParameters;
+      } else if (function.IsImplicitClosureFunction()) {
+        if (MethodCanSkipTypeChecksForNonCovariantArguments(
+                Function::Handle(Z, function.parent_function()), attrs)) {
+          // This is a tear-off of an instance method that can not be reached
+          // from any dynamic invocation. The method would not check any
+          // parameters except covariant ones and those annotated with
+          // generic-covariant-impl. Which means that we have to check
+          // the rest in the tear-off itself.
+          type_check_mode =
+              kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod;
+        }
+      } else {
+        if (function.is_static()) {
+          // In static functions we don't check anything.
+          type_check_mode = kTypeCheckForStaticFunction;
+        } else if (MethodCanSkipTypeChecksForNonCovariantArguments(function,
+                                                                   attrs)) {
+          // If the current function is never a target of a dynamic invocation
+          // and this parameter is not marked with generic-covariant-impl
+          // (which means that among all super-interfaces no type parameters
+          // ever occur at the position of this parameter) then we don't need
+          // to check this parameter on the callee side, because strong mode
+          // guarantees that it was checked at the caller side.
+          type_check_mode = kTypeCheckForNonDynamicallyInvokedMethod;
+        }
+      }
+
+      // Continue reading FunctionNode:
+      // read positional_parameters and named_parameters.
+      AddPositionalAndNamedParameters(pos, type_check_mode, attrs);
+
+      // We generate a synthetic body for implicit closure functions - which
+      // will forward the call to the real function.
+      //     -> see BuildGraphOfImplicitClosureFunction
+      if (!function.IsImplicitClosureFunction()) {
+        helper_.SetOffset(function.kernel_offset());
+        first_body_token_position_ = TokenPosition::kNoSource;
+        VisitNode();
+
+        // TODO(jensj): HACK: Push the begin token to after any parameters to
+        // avoid crash when breaking on definition line of async method in
+        // debugger. It seems that another scope needs to be added
+        // in which captures are made, but I can't make that work.
+        // This 'solution' doesn't crash, but I cannot see the parameters at
+        // that particular breakpoint either.
+        // Also push the end token to after the "}" to avoid crashing on
+        // stepping past the last line (to the "}" character).
+        if (first_body_token_position_.IsReal()) {
+          scope_->set_begin_token_pos(first_body_token_position_);
+        }
+        if (scope_->end_token_pos().IsReal()) {
+          scope_->set_end_token_pos(scope_->end_token_pos().Next());
+        }
+      }
+      break;
+    }
+    case RawFunction::kImplicitGetter:
+    case RawFunction::kImplicitStaticFinalGetter:
+    case RawFunction::kImplicitSetter: {
+      ASSERT(helper_.PeekTag() == kField);
+      if (IsFieldInitializer(function, Z)) {
+        VisitNode();
+        break;
+      }
+      const bool is_setter = function.IsImplicitSetterFunction();
+      const bool is_method = !function.IsStaticFunction();
+      intptr_t pos = 0;
+      if (is_method) {
+        Class& klass = Class::Handle(Z, function.Owner());
+        Type& klass_type = H.GetCanonicalType(klass);
+        LocalVariable* variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         Symbols::This(), klass_type);
+        scope_->InsertParameterAt(pos++, variable);
+        result_->this_variable = variable;
+      }
+      if (is_setter) {
+        result_->setter_value = MakeVariable(
+            TokenPosition::kNoSource, TokenPosition::kNoSource,
+            Symbols::Value(),
+            AbstractType::ZoneHandle(Z, function.ParameterTypeAt(pos)));
+        scope_->InsertParameterAt(pos++, result_->setter_value);
+
+        if (is_method &&
+            MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
+          FieldHelper field_helper(&helper_);
+          field_helper.ReadUntilIncluding(FieldHelper::kFlags);
+
+          if (!field_helper.IsCovariant() &&
+              (!field_helper.IsGenericCovariantImpl() ||
+               (!attrs.has_non_this_uses && !attrs.has_tearoff_uses))) {
+            result_->setter_value->set_type_check_mode(
+                LocalVariable::kTypeCheckedByCaller);
+          }
+        }
+      }
+      break;
+    }
+    case RawFunction::kDynamicInvocationForwarder: {
+      if (helper_.PeekTag() == kField) {
+#ifdef DEBUG
+        String& name = String::Handle(Z, function.name());
+        ASSERT(Function::IsDynamicInvocationForwaderName(name));
+        name = Function::DemangleDynamicInvocationForwarderName(name);
+        ASSERT(Field::IsSetterName(name));
+#endif
+        // Create [this] variable.
+        const Class& klass = Class::Handle(Z, function.Owner());
+        result_->this_variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         Symbols::This(), H.GetCanonicalType(klass));
+        scope_->InsertParameterAt(0, result_->this_variable);
+
+        // Create setter value variable.
+        result_->setter_value = MakeVariable(
+            TokenPosition::kNoSource, TokenPosition::kNoSource,
+            Symbols::Value(),
+            AbstractType::ZoneHandle(Z, function.ParameterTypeAt(1)));
+        scope_->InsertParameterAt(1, result_->setter_value);
+      } else {
+        helper_.ReadUntilFunctionNode();
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kPositionalParameters);
+
+        // Create [this] variable.
+        intptr_t pos = 0;
+        Class& klass = Class::Handle(Z, function.Owner());
+        result_->this_variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         Symbols::This(), H.GetCanonicalType(klass));
+        scope_->InsertParameterAt(pos++, result_->this_variable);
+
+        // Create all positional and named parameters.
+        AddPositionalAndNamedParameters(
+            pos, kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
+            attrs);
+      }
+      break;
+    }
+    case RawFunction::kMethodExtractor: {
+      // Add a receiver parameter.  Though it is captured, we emit code to
+      // explicitly copy it to a fixed offset in a freshly-allocated context
+      // instead of using the generic code for regular functions.
+      // Therefore, it isn't necessary to mark it as captured here.
+      Class& klass = Class::Handle(Z, function.Owner());
+      Type& klass_type = H.GetCanonicalType(klass);
+      LocalVariable* variable =
+          MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                       Symbols::This(), klass_type);
+      scope_->InsertParameterAt(0, variable);
+      result_->this_variable = variable;
+      break;
+    }
+    case RawFunction::kNoSuchMethodDispatcher:
+    case RawFunction::kInvokeFieldDispatcher:
+      for (intptr_t i = 0; i < function.NumParameters(); ++i) {
+        LocalVariable* variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         String::ZoneHandle(Z, function.ParameterNameAt(i)),
+                         AbstractType::dynamic_type());
+        scope_->InsertParameterAt(i, variable);
+      }
+      break;
+    case RawFunction::kSignatureFunction:
+    case RawFunction::kIrregexpFunction:
+      UNREACHABLE();
+  }
+  if (needs_expr_temp_ || function.is_no_such_method_forwarder()) {
+    scope_->AddVariable(parsed_function_->EnsureExpressionTemp());
+  }
+  parsed_function_->AllocateVariables();
+
+  return result_;
+}
+
+void ScopeBuilder::ReportUnexpectedTag(const char* variant, Tag tag) {
+  H.ReportError(helper_.script(), TokenPosition::kNoSource,
+                "Unexpected tag %d (%s) in %s, expected %s", tag,
+                Reader::TagName(tag),
+                parsed_function_->function().ToQualifiedCString(), variant);
+}
+
+void ScopeBuilder::VisitNode() {
+  Tag tag = helper_.PeekTag();
+  switch (tag) {
+    case kConstructor:
+      VisitConstructor();
+      return;
+    case kProcedure:
+      VisitProcedure();
+      return;
+    case kField:
+      VisitField();
+      return;
+    case kFunctionNode:
+      VisitFunctionNode();
+      return;
+    default:
+      UNIMPLEMENTED();
+      return;
+  }
+}
+
+void ScopeBuilder::VisitConstructor() {
+  // Field initializers that come from non-static field declarations are
+  // compiled as if they appear in the constructor initializer list.  This is
+  // important for closure-valued field initializers because the VM expects the
+  // corresponding closure functions to appear as if they were nested inside the
+  // constructor.
+  ConstructorHelper constructor_helper(&helper_);
+  constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
+  {
+    const Function& function = parsed_function_->function();
+    Class& parent_class = Class::Handle(Z, function.Owner());
+    Array& class_fields = Array::Handle(Z, parent_class.fields());
+    Field& class_field = Field::Handle(Z);
+    for (intptr_t i = 0; i < class_fields.Length(); ++i) {
+      class_field ^= class_fields.At(i);
+      if (!class_field.is_static()) {
+        ExternalTypedData& kernel_data =
+            ExternalTypedData::Handle(Z, class_field.KernelData());
+        ASSERT(!kernel_data.IsNull());
+        intptr_t field_offset = class_field.kernel_offset();
+        AlternativeReadingScope alt(&helper_.reader_, &kernel_data,
+                                    field_offset);
+        FieldHelper field_helper(&helper_);
+        field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
+        Tag initializer_tag = helper_.ReadTag();
+        if (initializer_tag == kSomething) {
+          VisitExpression();  // read initializer.
+        }
+      }
+    }
+  }
+
+  // Visit children (note that there's no reason to visit the name).
+  VisitFunctionNode();
+  intptr_t list_length =
+      helper_.ReadListLength();  // read initializers list length.
+  for (intptr_t i = 0; i < list_length; i++) {
+    VisitInitializer();
+  }
+}
+
+void ScopeBuilder::VisitProcedure() {
+  ProcedureHelper procedure_helper(&helper_);
+  procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
+  if (helper_.ReadTag() == kSomething) {
+    VisitFunctionNode();
+  }
+}
+
+void ScopeBuilder::VisitField() {
+  FieldHelper field_helper(&helper_);
+  field_helper.ReadUntilExcluding(FieldHelper::kType);
+  VisitDartType();              // read type.
+  Tag tag = helper_.ReadTag();  // read initializer (part 1).
+  if (tag == kSomething) {
+    VisitExpression();  // read initializer (part 2).
+  }
+}
+
+void ScopeBuilder::VisitFunctionNode() {
+  FunctionNodeHelper function_node_helper(&helper_);
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+
+  intptr_t list_length =
+      helper_.ReadListLength();  // read type_parameters list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    TypeParameterHelper helper(&helper_);
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+    VisitDartType();  // read ith bound.
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
+    if (helper_.ReadTag() == kSomething) {
+      VisitDartType();  // read ith default type.
+    }
+    helper.Finish();
+  }
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+  if (FLAG_causal_async_stacks &&
+      (function_node_helper.dart_async_marker_ == FunctionNodeHelper::kAsync ||
+       function_node_helper.dart_async_marker_ ==
+           FunctionNodeHelper::kAsyncStar)) {
+    LocalVariable* asyncStackTraceVar = MakeVariable(
+        TokenPosition::kNoSource, TokenPosition::kNoSource,
+        Symbols::AsyncStackTraceVar(), AbstractType::dynamic_type());
+    scope_->AddVariable(asyncStackTraceVar);
+  }
+
+  if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
+    LocalScope* scope = parsed_function_->node_sequence()->scope();
+    intptr_t offset = parsed_function_->function().num_fixed_parameters();
+    for (intptr_t i = 0;
+         i < parsed_function_->function().NumOptionalPositionalParameters();
+         i++) {
+      scope->VariableAt(offset + i)->set_is_forced_stack();
+    }
+  }
+
+  // Read (but don't visit) the positional and named parameters, because they've
+  // already been added to the scope.
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody);
+
+  if (helper_.ReadTag() == kSomething) {
+    PositionScope scope(&helper_.reader_);
+    VisitStatement();  // Read body
+    first_body_token_position_ = helper_.reader_.min_position();
+  }
+
+  // Ensure that :await_jump_var, :await_ctx_var, :async_op,
+  // :async_completer and :async_stack_trace are captured.
+  if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
+    {
+      LocalVariable* temp = NULL;
+      LookupCapturedVariableByName(
+          (depth_.function_ == 0) ? &result_->yield_jump_variable : &temp,
+          Symbols::AwaitJumpVar());
+    }
+    {
+      LocalVariable* temp = NULL;
+      LookupCapturedVariableByName(
+          (depth_.function_ == 0) ? &result_->yield_context_variable : &temp,
+          Symbols::AwaitContextVar());
+    }
+    {
+      LocalVariable* temp =
+          scope_->LookupVariable(Symbols::AsyncOperation(), true);
+      if (temp != NULL) {
+        scope_->CaptureVariable(temp);
+      }
+    }
+    {
+      LocalVariable* temp =
+          scope_->LookupVariable(Symbols::AsyncCompleter(), true);
+      if (temp != NULL) {
+        scope_->CaptureVariable(temp);
+      }
+    }
+    if (FLAG_causal_async_stacks) {
+      LocalVariable* temp =
+          scope_->LookupVariable(Symbols::AsyncStackTraceVar(), true);
+      if (temp != NULL) {
+        scope_->CaptureVariable(temp);
+      }
+    }
+  }
+}
+
+void ScopeBuilder::VisitInitializer() {
+  Tag tag = helper_.ReadTag();
+  helper_.ReadByte();  // read isSynthetic flag.
+  switch (tag) {
+    case kInvalidInitializer:
+      return;
+    case kFieldInitializer:
+      helper_.SkipCanonicalNameReference();  // read field_reference.
+      VisitExpression();                     // read value.
+      return;
+    case kSuperInitializer:
+      helper_.ReadPosition();                // read position.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      VisitArguments();                      // read arguments.
+      return;
+    case kRedirectingInitializer:
+      helper_.ReadPosition();                // read position.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      VisitArguments();                      // read arguments.
+      return;
+    case kLocalInitializer:
+      VisitVariableDeclaration();  // read variable.
+      return;
+    case kAssertInitializer:
+      VisitStatement();
+      return;
+    default:
+      ReportUnexpectedTag("initializer", tag);
+      UNREACHABLE();
+  }
+}
+
+void ScopeBuilder::VisitExpression() {
+  uint8_t payload = 0;
+  Tag tag = helper_.ReadTag(&payload);
+  switch (tag) {
+    case kInvalidExpression:
+      helper_.ReadPosition();
+      helper_.SkipStringReference();
+      return;
+    case kVariableGet: {
+      helper_.ReadPosition();  // read position.
+      intptr_t variable_kernel_offset =
+          helper_.ReadUInt();          // read kernel position.
+      helper_.ReadUInt();              // read relative variable index.
+      helper_.SkipOptionalDartType();  // read promoted type.
+      LookupVariable(variable_kernel_offset);
+      return;
+    }
+    case kSpecializedVariableGet: {
+      helper_.ReadPosition();  // read position.
+      intptr_t variable_kernel_offset =
+          helper_.ReadUInt();  // read kernel position.
+      LookupVariable(variable_kernel_offset);
+      return;
+    }
+    case kVariableSet: {
+      helper_.ReadPosition();  // read position.
+      intptr_t variable_kernel_offset =
+          helper_.ReadUInt();  // read kernel position.
+      helper_.ReadUInt();      // read relative variable index.
+      LookupVariable(variable_kernel_offset);
+      VisitExpression();  // read expression.
+      return;
+    }
+    case kSpecializedVariableSet: {
+      helper_.ReadPosition();  // read position.
+      intptr_t variable_kernel_offset =
+          helper_.ReadUInt();  // read kernel position.
+      LookupVariable(variable_kernel_offset);
+      VisitExpression();  // read expression.
+      return;
+    }
+    case kPropertyGet:
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read receiver.
+      helper_.SkipName();      // read name.
+      // read interface_target_reference.
+      helper_.SkipCanonicalNameReference();
+      return;
+    case kPropertySet:
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read receiver.
+      helper_.SkipName();      // read name.
+      VisitExpression();       // read value.
+      // read interface_target_reference.
+      helper_.SkipCanonicalNameReference();
+      return;
+    case kDirectPropertyGet:
+      helper_.ReadPosition();                // read position.
+      VisitExpression();                     // read receiver.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      return;
+    case kDirectPropertySet:
+      helper_.ReadPosition();                // read position.
+      VisitExpression();                     // read receiver.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      VisitExpression();                     // read value·
+      return;
+    case kSuperPropertyGet:
+      HandleSpecialLoad(&result_->this_variable, Symbols::This());
+      helper_.ReadPosition();                // read position.
+      helper_.SkipName();                    // read name.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      return;
+    case kSuperPropertySet:
+      HandleSpecialLoad(&result_->this_variable, Symbols::This());
+      helper_.ReadPosition();                // read position.
+      helper_.SkipName();                    // read name.
+      VisitExpression();                     // read value.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      return;
+    case kStaticGet:
+      helper_.ReadPosition();                // read position.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      return;
+    case kStaticSet:
+      helper_.ReadPosition();                // read position.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      VisitExpression();                     // read expression.
+      return;
+    case kMethodInvocation:
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read receiver.
+      helper_.SkipName();      // read name.
+      VisitArguments();        // read arguments.
+      // read interface_target_reference.
+      helper_.SkipCanonicalNameReference();
+      return;
+    case kDirectMethodInvocation:
+      helper_.ReadPosition();                // read position.
+      VisitExpression();                     // read receiver.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      VisitArguments();                      // read arguments.
+      return;
+    case kSuperMethodInvocation:
+      HandleSpecialLoad(&result_->this_variable, Symbols::This());
+      helper_.ReadPosition();  // read position.
+      helper_.SkipName();      // read name.
+      VisitArguments();        // read arguments.
+      // read interface_target_reference.
+      helper_.SkipCanonicalNameReference();
+      return;
+    case kStaticInvocation:
+    case kConstStaticInvocation:
+      helper_.ReadPosition();                // read position.
+      helper_.SkipCanonicalNameReference();  // read procedure_reference.
+      VisitArguments();                      // read arguments.
+      return;
+    case kConstructorInvocation:
+    case kConstConstructorInvocation:
+      helper_.ReadPosition();                // read position.
+      helper_.SkipCanonicalNameReference();  // read target_reference.
+      VisitArguments();                      // read arguments.
+      return;
+    case kNot:
+      VisitExpression();  // read expression.
+      return;
+    case kLogicalExpression:
+      needs_expr_temp_ = true;
+      VisitExpression();     // read left.
+      helper_.SkipBytes(1);  // read operator.
+      VisitExpression();     // read right.
+      return;
+    case kConditionalExpression: {
+      needs_expr_temp_ = true;
+      VisitExpression();               // read condition.
+      VisitExpression();               // read then.
+      VisitExpression();               // read otherwise.
+      helper_.SkipOptionalDartType();  // read unused static type.
+      return;
+    }
+    case kStringConcatenation: {
+      helper_.ReadPosition();                           // read position.
+      intptr_t list_length = helper_.ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitExpression();  // read ith expression.
+      }
+      return;
+    }
+    case kIsExpression:
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read operand.
+      VisitDartType();         // read type.
+      return;
+    case kAsExpression:
+      helper_.ReadPosition();  // read position.
+      helper_.ReadFlags();     // read flags.
+      VisitExpression();       // read operand.
+      VisitDartType();         // read type.
+      return;
+    case kSymbolLiteral:
+      helper_.SkipStringReference();  // read index into string table.
+      return;
+    case kTypeLiteral:
+      VisitDartType();  // read type.
+      return;
+    case kThisExpression:
+      HandleSpecialLoad(&result_->this_variable, Symbols::This());
+      return;
+    case kRethrow:
+      helper_.ReadPosition();  // read position.
+      return;
+    case kThrow:
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read expression.
+      return;
+    case kListLiteral:
+    case kConstListLiteral: {
+      helper_.ReadPosition();                           // read position.
+      VisitDartType();                                  // read type.
+      intptr_t list_length = helper_.ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitExpression();  // read ith expression.
+      }
+      return;
+    }
+    case kMapLiteral:
+    case kConstMapLiteral: {
+      helper_.ReadPosition();                           // read position.
+      VisitDartType();                                  // read key type.
+      VisitDartType();                                  // read value type.
+      intptr_t list_length = helper_.ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitExpression();  // read ith key.
+        VisitExpression();  // read ith value.
+      }
+      return;
+    }
+    case kFunctionExpression: {
+      intptr_t offset = helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+      helper_.ReadPosition();                        // read position.
+      HandleLocalFunction(offset);                   // read function node.
+      return;
+    }
+    case kLet: {
+      PositionScope scope(&helper_.reader_);
+      intptr_t offset = helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+
+      EnterScope(offset);
+
+      VisitVariableDeclaration();  // read variable declaration.
+      VisitExpression();           // read expression.
+
+      ExitScope(helper_.reader_.min_position(), helper_.reader_.max_position());
+      return;
+    }
+    case kBigIntLiteral:
+      helper_.SkipStringReference();  // read string reference.
+      return;
+    case kStringLiteral:
+      helper_.SkipStringReference();  // read string reference.
+      return;
+    case kSpecializedIntLiteral:
+      return;
+    case kNegativeIntLiteral:
+      helper_.ReadUInt();  // read value.
+      return;
+    case kPositiveIntLiteral:
+      helper_.ReadUInt();  // read value.
+      return;
+    case kDoubleLiteral:
+      helper_.ReadDouble();  // read value.
+      return;
+    case kTrueLiteral:
+      return;
+    case kFalseLiteral:
+      return;
+    case kNullLiteral:
+      return;
+    case kConstantExpression: {
+      helper_.SkipConstantReference();
+      return;
+    }
+    case kInstantiation: {
+      VisitExpression();
+      const intptr_t list_length =
+          helper_.ReadListLength();  // read list length.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitDartType();  // read ith type.
+      }
+      return;
+    }
+    case kLoadLibrary:
+    case kCheckLibraryIsLoaded:
+      helper_.ReadUInt();  // library index
+      break;
+    default:
+      ReportUnexpectedTag("expression", tag);
+      UNREACHABLE();
+  }
+}
+
+void ScopeBuilder::VisitStatement() {
+  Tag tag = helper_.ReadTag();  // read tag.
+  switch (tag) {
+    case kExpressionStatement:
+      VisitExpression();  // read expression.
+      return;
+    case kBlock: {
+      PositionScope scope(&helper_.reader_);
+      intptr_t offset = helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+
+      EnterScope(offset);
+
+      intptr_t list_length =
+          helper_.ReadListLength();  // read number of statements.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitStatement();  // read ith statement.
+      }
+
+      ExitScope(helper_.reader_.min_position(), helper_.reader_.max_position());
+      return;
+    }
+    case kEmptyStatement:
+      return;
+    case kAssertBlock:
+      if (I->asserts()) {
+        PositionScope scope(&helper_.reader_);
+        intptr_t offset =
+            helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+
+        EnterScope(offset);
+
+        intptr_t list_length =
+            helper_.ReadListLength();  // read number of statements.
+        for (intptr_t i = 0; i < list_length; ++i) {
+          VisitStatement();  // read ith statement.
+        }
+
+        ExitScope(helper_.reader_.min_position(),
+                  helper_.reader_.max_position());
+      } else {
+        helper_.SkipStatementList();
+      }
+      return;
+    case kAssertStatement:
+      if (I->asserts()) {
+        VisitExpression();            // Read condition.
+        helper_.ReadPosition();       // read condition start offset.
+        helper_.ReadPosition();       // read condition end offset.
+        Tag tag = helper_.ReadTag();  // read (first part of) message.
+        if (tag == kSomething) {
+          VisitExpression();  // read (rest of) message.
+        }
+      } else {
+        helper_.SkipExpression();     // Read condition.
+        helper_.ReadPosition();       // read condition start offset.
+        helper_.ReadPosition();       // read condition end offset.
+        Tag tag = helper_.ReadTag();  // read (first part of) message.
+        if (tag == kSomething) {
+          helper_.SkipExpression();  // read (rest of) message.
+        }
+      }
+      return;
+    case kLabeledStatement:
+      VisitStatement();  // read body.
+      return;
+    case kBreakStatement:
+      helper_.ReadPosition();  // read position.
+      helper_.ReadUInt();      // read target_index.
+      return;
+    case kWhileStatement:
+      ++depth_.loop_;
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read condition.
+      VisitStatement();        // read body.
+      --depth_.loop_;
+      return;
+    case kDoStatement:
+      ++depth_.loop_;
+      helper_.ReadPosition();  // read position.
+      VisitStatement();        // read body.
+      VisitExpression();       // read condition.
+      --depth_.loop_;
+      return;
+    case kForStatement: {
+      PositionScope scope(&helper_.reader_);
+
+      intptr_t offset = helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+
+      ++depth_.loop_;
+      EnterScope(offset);
+
+      TokenPosition position = helper_.ReadPosition();  // read position.
+      intptr_t list_length =
+          helper_.ReadListLength();  // read number of variables.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitVariableDeclaration();  // read ith variable.
+      }
+
+      Tag tag = helper_.ReadTag();  // Read first part of condition.
+      if (tag == kSomething) {
+        VisitExpression();  // read rest of condition.
+      }
+      list_length = helper_.ReadListLength();  // read number of updates.
+      for (intptr_t i = 0; i < list_length; ++i) {
+        VisitExpression();  // read ith update.
+      }
+      VisitStatement();  // read body.
+
+      ExitScope(position, helper_.reader_.max_position());
+      --depth_.loop_;
+      return;
+    }
+    case kForInStatement:
+    case kAsyncForInStatement: {
+      PositionScope scope(&helper_.reader_);
+
+      intptr_t start_offset =
+          helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+
+      helper_.ReadPosition();  // read position.
+      TokenPosition body_position =
+          helper_.ReadPosition();  // read body position.
+
+      // Notice the ordering: We skip the variable, read the iterable, go back,
+      // re-read the variable, go forward to after having read the iterable.
+      intptr_t offset = helper_.ReaderOffset();
+      helper_.SkipVariableDeclaration();  // read variable.
+      VisitExpression();                  // read iterable.
+
+      ++depth_.for_in_;
+      AddIteratorVariable();
+      ++depth_.loop_;
+      EnterScope(start_offset);
+
+      {
+        AlternativeReadingScope alt(&helper_.reader_, offset);
+        VisitVariableDeclaration();  // read variable.
+      }
+      VisitStatement();  // read body.
+
+      if (!body_position.IsReal()) {
+        body_position = helper_.reader_.min_position();
+      }
+      // TODO(jensj): From kernel_binary.cc
+      // forinstmt->variable_->set_end_position(forinstmt->position_);
+      ExitScope(body_position, helper_.reader_.max_position());
+      --depth_.loop_;
+      --depth_.for_in_;
+      return;
+    }
+    case kSwitchStatement: {
+      AddSwitchVariable();
+      helper_.ReadPosition();                     // read position.
+      VisitExpression();                          // read condition.
+      int case_count = helper_.ReadListLength();  // read number of cases.
+      for (intptr_t i = 0; i < case_count; ++i) {
+        int expression_count =
+            helper_.ReadListLength();  // read number of expressions.
+        for (intptr_t j = 0; j < expression_count; ++j) {
+          helper_.ReadPosition();  // read jth position.
+          VisitExpression();       // read jth expression.
+        }
+        helper_.ReadBool();  // read is_default.
+        VisitStatement();    // read body.
+      }
+      return;
+    }
+    case kContinueSwitchStatement:
+      helper_.ReadPosition();  // read position.
+      helper_.ReadUInt();      // read target_index.
+      return;
+    case kIfStatement:
+      helper_.ReadPosition();  // read position.
+      VisitExpression();       // read condition.
+      VisitStatement();        // read then.
+      VisitStatement();        // read otherwise.
+      return;
+    case kReturnStatement: {
+      if ((depth_.function_ == 0) && (depth_.finally_ > 0) &&
+          (result_->finally_return_variable == NULL)) {
+        const String& name = Symbols::TryFinallyReturnValue();
+        LocalVariable* variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         name, AbstractType::dynamic_type());
+        current_function_scope_->AddVariable(variable);
+        result_->finally_return_variable = variable;
+      }
+
+      helper_.ReadPosition();       // read position
+      Tag tag = helper_.ReadTag();  // read (first part of) expression.
+      if (tag == kSomething) {
+        VisitExpression();  // read (rest of) expression.
+      }
+      return;
+    }
+    case kTryCatch: {
+      ++depth_.try_;
+      AddTryVariables();
+      VisitStatement();  // read body.
+      --depth_.try_;
+
+      ++depth_.catch_;
+      AddCatchVariables();
+
+      helper_.ReadByte();  // read flags
+      intptr_t catch_count =
+          helper_.ReadListLength();  // read number of catches.
+      for (intptr_t i = 0; i < catch_count; ++i) {
+        PositionScope scope(&helper_.reader_);
+        intptr_t offset = helper_.ReaderOffset();  // Catch has no tag.
+
+        EnterScope(offset);
+
+        helper_.ReadPosition();   // read position.
+        VisitDartType();          // Read the guard.
+        tag = helper_.ReadTag();  // read first part of exception.
+        if (tag == kSomething) {
+          VisitVariableDeclaration();  // read exception.
+        }
+        tag = helper_.ReadTag();  // read first part of stack trace.
+        if (tag == kSomething) {
+          VisitVariableDeclaration();  // read stack trace.
+        }
+        VisitStatement();  // read body.
+
+        ExitScope(helper_.reader_.min_position(),
+                  helper_.reader_.max_position());
+      }
+
+      FinalizeCatchVariables();
+
+      --depth_.catch_;
+      return;
+    }
+    case kTryFinally: {
+      ++depth_.try_;
+      ++depth_.finally_;
+      AddTryVariables();
+
+      VisitStatement();  // read body.
+
+      --depth_.finally_;
+      --depth_.try_;
+      ++depth_.catch_;
+      AddCatchVariables();
+
+      VisitStatement();  // read finalizer.
+
+      FinalizeCatchVariables();
+
+      --depth_.catch_;
+      return;
+    }
+    case kYieldStatement: {
+      helper_.ReadPosition();           // read position.
+      word flags = helper_.ReadByte();  // read flags.
+      VisitExpression();                // read expression.
+
+      ASSERT(flags == kNativeYieldFlags);
+      if (depth_.function_ == 0) {
+        AddSwitchVariable();
+        // Promote all currently visible local variables into the context.
+        // TODO(27590) CaptureLocalVariables promotes to many variables into
+        // the scope. Mark those variables as stack_local.
+        // TODO(27590) we don't need to promote those variables that are
+        // not used across yields.
+        scope_->CaptureLocalVariables(current_function_scope_);
+      }
+      return;
+    }
+    case kVariableDeclaration:
+      VisitVariableDeclaration();  // read variable declaration.
+      return;
+    case kFunctionDeclaration: {
+      intptr_t offset = helper_.ReaderOffset() - 1;  // -1 to include tag byte.
+      helper_.ReadPosition();                        // read position.
+      VisitVariableDeclaration();   // read variable declaration.
+      HandleLocalFunction(offset);  // read function node.
+      return;
+    }
+    default:
+      ReportUnexpectedTag("declaration", tag);
+      UNREACHABLE();
+  }
+}
+
+void ScopeBuilder::VisitArguments() {
+  helper_.ReadUInt();  // read argument_count.
+
+  // Types
+  intptr_t list_length = helper_.ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    VisitDartType();  // read ith type.
+  }
+
+  // Positional.
+  list_length = helper_.ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    VisitExpression();  // read ith positional.
+  }
+
+  // Named.
+  list_length = helper_.ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    helper_.SkipStringReference();  // read ith name index.
+    VisitExpression();              // read ith expression.
+  }
+}
+
+void ScopeBuilder::VisitVariableDeclaration() {
+  PositionScope scope(&helper_.reader_);
+
+  intptr_t kernel_offset_no_tag = helper_.ReaderOffset();
+  VariableDeclarationHelper helper(&helper_);
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+  AbstractType& type = BuildAndVisitVariableType();
+
+  // In case `declaration->IsConst()` the flow graph building will take care of
+  // evaluating the constant and setting it via
+  // `declaration->SetConstantValue()`.
+  const String& name = (H.StringSize(helper.name_index_) == 0)
+                           ? GenerateName(":var", name_index_++)
+                           : H.DartSymbolObfuscate(helper.name_index_);
+
+  Tag tag = helper_.ReadTag();  // read (first part of) initializer.
+  if (tag == kSomething) {
+    VisitExpression();  // read (actual) initializer.
+  }
+
+  // Go to next token position so it ends *after* the last potentially
+  // debuggable position in the initializer.
+  TokenPosition end_position = helper_.reader_.max_position();
+  if (end_position.IsReal()) {
+    end_position.Next();
+  }
+  LocalVariable* variable =
+      MakeVariable(helper.position_, end_position, name, type);
+  if (helper.IsFinal()) {
+    variable->set_is_final();
+  }
+  scope_->AddVariable(variable);
+  result_->locals.Insert(helper_.data_program_offset_ + kernel_offset_no_tag,
+                         variable);
+}
+
+AbstractType& ScopeBuilder::BuildAndVisitVariableType() {
+  const intptr_t offset = helper_.ReaderOffset();
+  AbstractType& type = T.BuildVariableType();
+  helper_.SetOffset(offset);  // rewind
+  VisitDartType();
+  return type;
+}
+
+void ScopeBuilder::VisitDartType() {
+  Tag tag = helper_.ReadTag();
+  switch (tag) {
+    case kInvalidType:
+    case kDynamicType:
+    case kVoidType:
+    case kBottomType:
+      // those contain nothing.
+      return;
+    case kInterfaceType:
+      VisitInterfaceType(false);
+      return;
+    case kSimpleInterfaceType:
+      VisitInterfaceType(true);
+      return;
+    case kFunctionType:
+      VisitFunctionType(false);
+      return;
+    case kSimpleFunctionType:
+      VisitFunctionType(true);
+      return;
+    case kTypeParameterType:
+      VisitTypeParameterType();
+      return;
+    default:
+      ReportUnexpectedTag("type", tag);
+      UNREACHABLE();
+  }
+}
+
+void ScopeBuilder::VisitInterfaceType(bool simple) {
+  helper_.ReadUInt();  // read klass_name.
+  if (!simple) {
+    intptr_t length = helper_.ReadListLength();  // read number of types.
+    for (intptr_t i = 0; i < length; ++i) {
+      VisitDartType();  // read the ith type.
+    }
+  }
+}
+
+void ScopeBuilder::VisitFunctionType(bool simple) {
+  if (!simple) {
+    intptr_t list_length =
+        helper_.ReadListLength();  // read type_parameters list length.
+    for (int i = 0; i < list_length; ++i) {
+      TypeParameterHelper helper(&helper_);
+      helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+      VisitDartType();  // read bound.
+      helper.ReadUntilExcludingAndSetJustRead(
+          TypeParameterHelper::kDefaultType);
+      if (helper_.ReadTag() == kSomething) {
+        VisitDartType();  // read default type.
+      }
+      helper.Finish();
+    }
+    helper_.ReadUInt();  // read required parameter count.
+    helper_.ReadUInt();  // read total parameter count.
+  }
+
+  const intptr_t positional_count =
+      helper_.ReadListLength();  // read positional_parameters list length.
+  for (intptr_t i = 0; i < positional_count; ++i) {
+    VisitDartType();  // read ith positional parameter.
+  }
+
+  if (!simple) {
+    const intptr_t named_count =
+        helper_.ReadListLength();  // read named_parameters list length.
+    for (intptr_t i = 0; i < named_count; ++i) {
+      // read string reference (i.e. named_parameters[i].name).
+      helper_.SkipStringReference();
+      VisitDartType();  // read named_parameters[i].type.
+    }
+  }
+
+  helper_.SkipListOfStrings();  // read positional parameter names.
+
+  if (!simple) {
+    helper_.SkipCanonicalNameReference();  // read typedef reference.
+  }
+
+  VisitDartType();  // read return type.
+}
+
+void ScopeBuilder::VisitTypeParameterType() {
+  Function& function = Function::Handle(Z, parsed_function_->function().raw());
+  while (function.IsClosureFunction()) {
+    function = function.parent_function();
+  }
+
+  // The index here is the index identifying the type parameter binding site
+  // inside the DILL file, which uses a different indexing system than the VM
+  // uses for its 'TypeParameter's internally. This index includes both class
+  // and function type parameters.
+
+  intptr_t index = helper_.ReadUInt();  // read index for parameter.
+
+  if (function.IsFactory()) {
+    // The type argument vector is passed as the very first argument to the
+    // factory constructor function.
+    HandleSpecialLoad(&result_->type_arguments_variable,
+                      Symbols::TypeArgumentsParameter());
+  } else {
+    // If the type parameter is a parameter to this or an enclosing function, we
+    // can read it directly from the function type arguments vector later.
+    // Otherwise, the type arguments vector we need is stored on the instance
+    // object, so we need to capture 'this'.
+    Class& parent_class = Class::Handle(Z, function.Owner());
+    if (index < parent_class.NumTypeParameters()) {
+      HandleSpecialLoad(&result_->this_variable, Symbols::This());
+    }
+  }
+
+  helper_.SkipOptionalDartType();  // read bound bound.
+}
+
+void ScopeBuilder::HandleLocalFunction(intptr_t parent_kernel_offset) {
+  // "Peek" ahead into the function node
+  intptr_t offset = helper_.ReaderOffset();
+
+  FunctionNodeHelper function_node_helper(&helper_);
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+
+  LocalScope* saved_function_scope = current_function_scope_;
+  FunctionNodeHelper::AsyncMarker saved_function_async_marker =
+      current_function_async_marker_;
+  DepthState saved_depth_state = depth_;
+  depth_ = DepthState(depth_.function_ + 1);
+  EnterScope(parent_kernel_offset);
+  current_function_scope_ = scope_;
+  current_function_async_marker_ = function_node_helper.async_marker_;
+  if (depth_.function_ == 1) {
+    FunctionScope function_scope = {offset, scope_};
+    result_->function_scopes.Add(function_scope);
+  }
+
+  int num_type_params = 0;
+  {
+    AlternativeReadingScope _(&helper_.reader_);
+    num_type_params = helper_.ReadListLength();
+  }
+  // Adding this scope here informs the type translator the type parameters of
+  // this function are now in scope, although they are not defined and will be
+  // filled in with dynamic. This is OK, since their definitions are not needed
+  // for scope building of the enclosing function.
+  TypeTranslator::TypeParameterScope scope(&type_translator_, num_type_params);
+
+  // read positional_parameters and named_parameters.
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+
+  ProcedureAttributesMetadata default_attrs;
+  AddPositionalAndNamedParameters(0, kTypeCheckAllParameters, default_attrs);
+
+  // "Peek" is now done.
+  helper_.SetOffset(offset);
+
+  VisitFunctionNode();  // read function node.
+
+  ExitScope(function_node_helper.position_, function_node_helper.end_position_);
+  depth_ = saved_depth_state;
+  current_function_scope_ = saved_function_scope;
+  current_function_async_marker_ = saved_function_async_marker;
+}
+
+void ScopeBuilder::EnterScope(intptr_t kernel_offset) {
+  scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_);
+  ASSERT(kernel_offset >= 0);
+  result_->scopes.Insert(kernel_offset, scope_);
+}
+
+void ScopeBuilder::ExitScope(TokenPosition start_position,
+                             TokenPosition end_position) {
+  scope_->set_begin_token_pos(start_position);
+  scope_->set_end_token_pos(end_position);
+  scope_ = scope_->parent();
+}
+
+void ScopeBuilder::AddPositionalAndNamedParameters(
+    intptr_t pos,
+    ParameterTypeCheckMode type_check_mode /* = kTypeCheckAllParameters*/,
+    const ProcedureAttributesMetadata& attrs) {
+  // List of positional.
+  intptr_t list_length = helper_.ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    AddVariableDeclarationParameter(pos++, type_check_mode, attrs);
+  }
+
+  // List of named.
+  list_length = helper_.ReadListLength();  // read list length.
+  for (intptr_t i = 0; i < list_length; ++i) {
+    AddVariableDeclarationParameter(pos++, type_check_mode, attrs);
+  }
+}
+
+void ScopeBuilder::AddVariableDeclarationParameter(
+    intptr_t pos,
+    ParameterTypeCheckMode type_check_mode,
+    const ProcedureAttributesMetadata& attrs) {
+  intptr_t kernel_offset = helper_.ReaderOffset();  // no tag.
+  const InferredTypeMetadata parameter_type =
+      inferred_type_metadata_helper_.GetInferredType(kernel_offset);
+  VariableDeclarationHelper helper(&helper_);
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+  String& name = H.DartSymbolObfuscate(helper.name_index_);
+  AbstractType& type = BuildAndVisitVariableType();  // read type.
+  helper.SetJustRead(VariableDeclarationHelper::kType);
+  helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
+
+  LocalVariable* variable = MakeVariable(helper.position_, helper.position_,
+                                         name, type, &parameter_type);
+  if (helper.IsFinal()) {
+    variable->set_is_final();
+  }
+  if (variable->name().raw() == Symbols::IteratorParameter().raw()) {
+    variable->set_is_forced_stack();
+  }
+
+  const bool needs_covariant_check_in_method =
+      helper.IsCovariant() ||
+      (helper.IsGenericCovariantImpl() && attrs.has_non_this_uses);
+
+  switch (type_check_mode) {
+    case kTypeCheckAllParameters:
+      variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
+      break;
+    case kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod:
+      if (needs_covariant_check_in_method) {
+        // Don't type check covariant parameters - they will be checked by
+        // a function we forward to. Their types however are not known.
+        variable->set_type_check_mode(LocalVariable::kSkipTypeCheck);
+      } else {
+        variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
+      }
+      break;
+    case kTypeCheckForNonDynamicallyInvokedMethod:
+      if (needs_covariant_check_in_method) {
+        variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
+      } else {
+        // Types of non-covariant parameters are guaranteed to match by
+        // front-end enforcing strong mode types at call site.
+        variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
+      }
+      break;
+    case kTypeCheckForStaticFunction:
+      variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
+      break;
+  }
+  scope_->InsertParameterAt(pos, variable);
+  result_->locals.Insert(helper_.data_program_offset_ + kernel_offset,
+                         variable);
+
+  // The default value may contain 'let' bindings for which the constant
+  // evaluator needs scope bindings.
+  Tag tag = helper_.ReadTag();
+  if (tag == kSomething) {
+    VisitExpression();  // read initializer.
+  }
+}
+
+LocalVariable* ScopeBuilder::MakeVariable(
+    TokenPosition declaration_pos,
+    TokenPosition token_pos,
+    const String& name,
+    const AbstractType& type,
+    const InferredTypeMetadata* param_type_md /* = NULL */) {
+  CompileType* param_type = NULL;
+  if ((param_type_md != NULL) && !param_type_md->IsTrivial()) {
+    param_type = new (Z) CompileType(CompileType::CreateNullable(
+        param_type_md->nullable, param_type_md->cid));
+  }
+  return new (Z)
+      LocalVariable(declaration_pos, token_pos, name, type, param_type);
+}
+
+void ScopeBuilder::AddExceptionVariable(
+    GrowableArray<LocalVariable*>* variables,
+    const char* prefix,
+    intptr_t nesting_depth) {
+  LocalVariable* v = NULL;
+
+  // If we are inside a function with yield points then Kernel transformer
+  // could have lifted some of the auxiliary exception variables into the
+  // context to preserve them across yield points because they might
+  // be needed for rethrow.
+  // Check if it did and capture such variables instead of introducing
+  // new local ones.
+  // Note: function that wrap kSyncYielding function does not contain
+  // its own try/catches.
+  if (current_function_async_marker_ == FunctionNodeHelper::kSyncYielding) {
+    ASSERT(current_function_scope_->parent() != NULL);
+    v = current_function_scope_->parent()->LocalLookupVariable(
+        GenerateName(prefix, nesting_depth - 1));
+    if (v != NULL) {
+      scope_->CaptureVariable(v);
+    }
+  }
+
+  // No need to create variables for try/catch-statements inside
+  // nested functions.
+  if (depth_.function_ > 0) return;
+  if (variables->length() >= nesting_depth) return;
+
+  // If variable was not lifted by the transformer introduce a new
+  // one into the current function scope.
+  if (v == NULL) {
+    v = MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                     GenerateName(prefix, nesting_depth - 1),
+                     AbstractType::dynamic_type());
+
+    // If transformer did not lift the variable then there is no need
+    // to lift it into the context when we encouter a YieldStatement.
+    v->set_is_forced_stack();
+    current_function_scope_->AddVariable(v);
+  }
+
+  variables->Add(v);
+}
+
+void ScopeBuilder::FinalizeExceptionVariable(
+    GrowableArray<LocalVariable*>* variables,
+    GrowableArray<LocalVariable*>* raw_variables,
+    const String& symbol,
+    intptr_t nesting_depth) {
+  // No need to create variables for try/catch-statements inside
+  // nested functions.
+  if (depth_.function_ > 0) return;
+
+  LocalVariable* variable = (*variables)[nesting_depth - 1];
+  LocalVariable* raw_variable;
+  if (variable->is_captured()) {
+    raw_variable =
+        new LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                          symbol, AbstractType::dynamic_type());
+    const bool ok = scope_->AddVariable(raw_variable);
+    ASSERT(ok);
+  } else {
+    raw_variable = variable;
+  }
+  raw_variables->EnsureLength(nesting_depth, nullptr);
+  (*raw_variables)[nesting_depth - 1] = raw_variable;
+}
+
+void ScopeBuilder::AddTryVariables() {
+  AddExceptionVariable(&result_->catch_context_variables,
+                       ":saved_try_context_var", depth_.try_);
+}
+
+void ScopeBuilder::AddCatchVariables() {
+  AddExceptionVariable(&result_->exception_variables, ":exception",
+                       depth_.catch_);
+  AddExceptionVariable(&result_->stack_trace_variables, ":stack_trace",
+                       depth_.catch_);
+}
+
+void ScopeBuilder::FinalizeCatchVariables() {
+  const intptr_t unique_id = result_->raw_variable_counter_++;
+  FinalizeExceptionVariable(
+      &result_->exception_variables, &result_->raw_exception_variables,
+      GenerateName(":raw_exception", unique_id), depth_.catch_);
+  FinalizeExceptionVariable(
+      &result_->stack_trace_variables, &result_->raw_stack_trace_variables,
+      GenerateName(":raw_stacktrace", unique_id), depth_.catch_);
+}
+
+void ScopeBuilder::AddIteratorVariable() {
+  if (depth_.function_ > 0) return;
+  if (result_->iterator_variables.length() >= depth_.for_in_) return;
+
+  ASSERT(result_->iterator_variables.length() == depth_.for_in_ - 1);
+  LocalVariable* iterator =
+      MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                   GenerateName(":iterator", depth_.for_in_ - 1),
+                   AbstractType::dynamic_type());
+  current_function_scope_->AddVariable(iterator);
+  result_->iterator_variables.Add(iterator);
+}
+
+void ScopeBuilder::AddSwitchVariable() {
+  if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) {
+    LocalVariable* variable =
+        MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                     Symbols::SwitchExpr(), AbstractType::dynamic_type());
+    variable->set_is_forced_stack();
+    current_function_scope_->AddVariable(variable);
+    result_->switch_variable = variable;
+  }
+}
+
+void ScopeBuilder::LookupVariable(intptr_t declaration_binary_offset) {
+  LocalVariable* variable = result_->locals.Lookup(declaration_binary_offset);
+  if (variable == NULL) {
+    // We have not seen a declaration of the variable, so it must be the
+    // case that we are compiling a nested function and the variable is
+    // declared in an outer scope.  In that case, look it up in the scope by
+    // name and add it to the variable map to simplify later lookup.
+    ASSERT(current_function_scope_->parent() != NULL);
+    StringIndex var_name = GetNameFromVariableDeclaration(
+        declaration_binary_offset - helper_.data_program_offset_,
+        parsed_function_->function());
+
+    const String& name = H.DartSymbolObfuscate(var_name);
+    variable = current_function_scope_->parent()->LookupVariable(name, true);
+    ASSERT(variable != NULL);
+    result_->locals.Insert(declaration_binary_offset, variable);
+  }
+
+  if (variable->owner()->function_level() < scope_->function_level()) {
+    // We call `LocalScope->CaptureVariable(variable)` in two scenarios for two
+    // different reasons:
+    //   Scenario 1:
+    //       We need to know which variables defined in this function
+    //       are closed over by nested closures in order to ensure we will
+    //       create a [Context] object of appropriate size and store captured
+    //       variables there instead of the stack.
+    //   Scenario 2:
+    //       We need to find out which variables defined in enclosing functions
+    //       are closed over by this function/closure or nested closures. This
+    //       is necessary in order to build a fat flattened [ContextScope]
+    //       object.
+    scope_->CaptureVariable(variable);
+  } else {
+    ASSERT(variable->owner()->function_level() == scope_->function_level());
+  }
+}
+
+StringIndex ScopeBuilder::GetNameFromVariableDeclaration(
+    intptr_t kernel_offset,
+    const Function& function) {
+  ExternalTypedData& kernel_data =
+      ExternalTypedData::Handle(Z, function.KernelData());
+  ASSERT(!kernel_data.IsNull());
+
+  // Temporarily go to the variable declaration, read the name.
+  AlternativeReadingScope alt(&helper_.reader_, &kernel_data, kernel_offset);
+  VariableDeclarationHelper helper(&helper_);
+  helper.ReadUntilIncluding(VariableDeclarationHelper::kNameIndex);
+  return helper.name_index_;
+}
+
+const String& ScopeBuilder::GenerateName(const char* prefix, intptr_t suffix) {
+  char name[64];
+  Utils::SNPrint(name, 64, "%s%" Pd "", prefix, suffix);
+  return H.DartSymbolObfuscate(name);
+}
+
+void ScopeBuilder::HandleSpecialLoad(LocalVariable** variable,
+                                     const String& symbol) {
+  if (current_function_scope_->parent() != NULL) {
+    // We are building the scope tree of a closure function and saw [node]. We
+    // lazily populate the variable using the parent function scope.
+    if (*variable == NULL) {
+      *variable =
+          current_function_scope_->parent()->LookupVariable(symbol, true);
+      ASSERT(*variable != NULL);
+    }
+  }
+
+  if ((current_function_scope_->parent() != NULL) ||
+      (scope_->function_level() > 0)) {
+    // Every scope we use the [variable] from needs to be notified of the usage
+    // in order to ensure that preserving the context scope on that particular
+    // use-site also includes the [variable].
+    scope_->CaptureVariable(*variable);
+  }
+}
+
+void ScopeBuilder::LookupCapturedVariableByName(LocalVariable** variable,
+                                                const String& name) {
+  if (*variable == NULL) {
+    *variable = scope_->LookupVariable(name, true);
+    ASSERT(*variable != NULL);
+    scope_->CaptureVariable(*variable);
+  }
+}
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
new file mode 100644
index 0000000..4d63d92
--- /dev/null
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -0,0 +1,238 @@
+// 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.
+
+#ifndef RUNTIME_VM_COMPILER_FRONTEND_SCOPE_BUILDER_H_
+#define RUNTIME_VM_COMPILER_FRONTEND_SCOPE_BUILDER_H_
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/hash_map.h"
+#include "vm/object.h"
+#include "vm/parser.h"  // For ParsedFunction.
+
+namespace dart {
+namespace kernel {
+
+class ScopeBuildingResult;
+
+class ScopeBuilder {
+ public:
+  explicit ScopeBuilder(ParsedFunction* parsed_function);
+
+  virtual ~ScopeBuilder() = default;
+
+  ScopeBuildingResult* BuildScopes();
+
+ private:
+  void VisitField();
+
+  void VisitProcedure();
+
+  void VisitConstructor();
+
+  void VisitFunctionNode();
+  void VisitNode();
+  void VisitInitializer();
+  void VisitExpression();
+  void VisitStatement();
+  void VisitArguments();
+  void VisitVariableDeclaration();
+  void VisitDartType();
+  void VisitInterfaceType(bool simple);
+  void VisitFunctionType(bool simple);
+  void VisitTypeParameterType();
+  void HandleLocalFunction(intptr_t parent_kernel_offset);
+
+  AbstractType& BuildAndVisitVariableType();
+
+  void EnterScope(intptr_t kernel_offset);
+  void ExitScope(TokenPosition start_position, TokenPosition end_position);
+
+  virtual void ReportUnexpectedTag(const char* variant, Tag tag);
+
+  // This enum controls which parameters would be marked as requring type
+  // check on the callee side.
+  enum ParameterTypeCheckMode {
+    // All parameters will be checked.
+    kTypeCheckAllParameters,
+
+    // Only parameters marked as covariant or generic-covariant-impl will be
+    // checked.
+    kTypeCheckForNonDynamicallyInvokedMethod,
+
+    // Only parameters *not* marked as covariant or generic-covariant-impl will
+    // be checked. The rest would be checked in the method itself.
+    // Inverse of kTypeCheckForNonDynamicallyInvokedMethod.
+    kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
+
+    // No parameters will be checked.
+    kTypeCheckForStaticFunction,
+  };
+
+  // This assumes that the reader is at a FunctionNode,
+  // about to read the positional parameters.
+  void AddPositionalAndNamedParameters(
+      intptr_t pos,
+      ParameterTypeCheckMode type_check_mode,
+      const ProcedureAttributesMetadata& attrs);
+
+  // This assumes that the reader is at a FunctionNode,
+  // about to read a parameter (i.e. VariableDeclaration).
+  void AddVariableDeclarationParameter(
+      intptr_t pos,
+      ParameterTypeCheckMode type_check_mode,
+      const ProcedureAttributesMetadata& attrs);
+
+  LocalVariable* MakeVariable(TokenPosition declaration_pos,
+                              TokenPosition token_pos,
+                              const String& name,
+                              const AbstractType& type,
+                              const InferredTypeMetadata* param_type_md = NULL);
+
+  void AddExceptionVariable(GrowableArray<LocalVariable*>* variables,
+                            const char* prefix,
+                            intptr_t nesting_depth);
+
+  void FinalizeExceptionVariable(GrowableArray<LocalVariable*>* variables,
+                                 GrowableArray<LocalVariable*>* raw_variables,
+                                 const String& symbol,
+                                 intptr_t nesting_depth);
+
+  void AddTryVariables();
+  void AddCatchVariables();
+  void FinalizeCatchVariables();
+  void AddIteratorVariable();
+  void AddSwitchVariable();
+
+  // Record an assignment or reference to a variable.  If the occurrence is
+  // in a nested function, ensure that the variable is handled properly as a
+  // captured variable.
+  void LookupVariable(intptr_t declaration_binary_offset);
+
+  StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset,
+                                             const Function& function);
+
+  const String& GenerateName(const char* prefix, intptr_t suffix);
+
+  void HandleSpecialLoad(LocalVariable** variable, const String& symbol);
+  void LookupCapturedVariableByName(LocalVariable** variable,
+                                    const String& name);
+
+  struct DepthState {
+    explicit DepthState(intptr_t function)
+        : loop_(0),
+          function_(function),
+          try_(0),
+          catch_(0),
+          finally_(0),
+          for_in_(0) {}
+
+    intptr_t loop_;
+    intptr_t function_;
+    intptr_t try_;
+    intptr_t catch_;
+    intptr_t finally_;
+    intptr_t for_in_;
+  };
+
+  ScopeBuildingResult* result_;
+  ParsedFunction* parsed_function_;
+
+  ActiveClass active_class_;
+
+  TranslationHelper translation_helper_;
+  Zone* zone_;
+
+  FunctionNodeHelper::AsyncMarker current_function_async_marker_;
+  LocalScope* current_function_scope_;
+  LocalScope* scope_;
+  DepthState depth_;
+
+  intptr_t name_index_;
+
+  bool needs_expr_temp_;
+  TokenPosition first_body_token_position_;
+
+  KernelReaderHelper helper_;
+  InferredTypeMetadataHelper inferred_type_metadata_helper_;
+  ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
+  TypeTranslator type_translator_;
+};
+
+struct FunctionScope {
+  intptr_t kernel_offset;
+  LocalScope* scope;
+};
+
+class ScopeBuildingResult : public ZoneAllocated {
+ public:
+  ScopeBuildingResult()
+      : this_variable(NULL),
+        type_arguments_variable(NULL),
+        switch_variable(NULL),
+        finally_return_variable(NULL),
+        setter_value(NULL),
+        yield_jump_variable(NULL),
+        yield_context_variable(NULL),
+        raw_variable_counter_(0) {}
+
+  IntMap<LocalVariable*> locals;
+  IntMap<LocalScope*> scopes;
+  GrowableArray<FunctionScope> function_scopes;
+
+  // Only non-NULL for instance functions.
+  LocalVariable* this_variable;
+
+  // Only non-NULL for factory constructor functions.
+  LocalVariable* type_arguments_variable;
+
+  // Non-NULL when the function contains a switch statement.
+  LocalVariable* switch_variable;
+
+  // Non-NULL when the function contains a return inside a finally block.
+  LocalVariable* finally_return_variable;
+
+  // Non-NULL when the function is a setter.
+  LocalVariable* setter_value;
+
+  // Non-NULL if the function contains yield statement.
+  // TODO(27590) actual variable is called :await_jump_var, we should rename
+  // it to reflect the fact that it is used for both await and yield.
+  LocalVariable* yield_jump_variable;
+
+  // Non-NULL if the function contains yield statement.
+  // TODO(27590) actual variable is called :await_ctx_var, we should rename
+  // it to reflect the fact that it is used for both await and yield.
+  LocalVariable* yield_context_variable;
+
+  // Variables used in exception handlers, one per exception handler nesting
+  // level.
+  GrowableArray<LocalVariable*> exception_variables;
+  GrowableArray<LocalVariable*> stack_trace_variables;
+  GrowableArray<LocalVariable*> catch_context_variables;
+
+  // These are used to access the raw exception/stacktrace variables (and are
+  // used to put them into the captured variables in the context).
+  GrowableArray<LocalVariable*> raw_exception_variables;
+  GrowableArray<LocalVariable*> raw_stack_trace_variables;
+  intptr_t raw_variable_counter_;
+
+  // For-in iterators, one per for-in nesting level.
+  GrowableArray<LocalVariable*> iterator_variables;
+};
+
+bool IsFieldInitializer(const Function& function, Zone* zone);
+
+// Returns true if the given method can skip type checks for all arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantArguments(
+    const Function& method,
+    const ProcedureAttributesMetadata& attrs);
+
+}  // namespace kernel
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // RUNTIME_VM_COMPILER_FRONTEND_SCOPE_BUILDER_H_
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 875983c..9083339 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -155,11 +155,10 @@
     intptr_t osr_id,
     bool optimized) {
   if (UseKernelFrontEndFor(parsed_function)) {
-    kernel::FlowGraphBuilder builder(
-        parsed_function->function().kernel_offset(), parsed_function,
-        ic_data_array,
-        /* not building var desc */ NULL,
-        /* not inlining */ NULL, optimized, osr_id);
+    kernel::FlowGraphBuilder builder(parsed_function, ic_data_array,
+                                     /* not building var desc */ NULL,
+                                     /* not inlining */ NULL, optimized,
+                                     osr_id);
     FlowGraph* graph = builder.BuildGraph();
 #if defined(DART_USE_INTERPRETER)
     ASSERT((graph != NULL) || parsed_function->function().HasBytecode());
@@ -1365,8 +1364,7 @@
     } else {
       parsed_function->EnsureKernelScopes();
       kernel::FlowGraphBuilder builder(
-          parsed_function->function().kernel_offset(), parsed_function,
-          *ic_data_array, context_level_array,
+          parsed_function, *ic_data_array, context_level_array,
           /* not inlining */ NULL, false, Compiler::kNoOSRDeoptId);
       builder.BuildGraph();
     }
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 4e6b0bc..fb6ff15 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -435,6 +435,53 @@
   static bool IsKeyEqual(Pair kv, Key key) { return kv.key == key; }
 };
 
+template <typename V>
+class IntKeyRawPointerValueTrait {
+ public:
+  typedef intptr_t Key;
+  typedef V Value;
+
+  struct Pair {
+    Key key;
+    Value value;
+    Pair() : key(NULL), value() {}
+    Pair(const Key key, const Value& value) : key(key), value(value) {}
+    Pair(const Pair& other) : key(other.key), value(other.value) {}
+  };
+
+  static Key KeyOf(Pair kv) { return kv.key; }
+  static Value ValueOf(Pair kv) { return kv.value; }
+  static intptr_t Hashcode(Key key) { return key; }
+  static bool IsKeyEqual(Pair kv, Key key) { return kv.key == key; }
+};
+
+template <typename V>
+class IntMap : public DirectChainedHashMap<IntKeyRawPointerValueTrait<V> > {
+ public:
+  typedef typename IntKeyRawPointerValueTrait<V>::Key Key;
+  typedef typename IntKeyRawPointerValueTrait<V>::Value Value;
+  typedef typename IntKeyRawPointerValueTrait<V>::Pair Pair;
+
+  inline void Insert(const Key& key, const Value& value) {
+    Pair pair(key, value);
+    DirectChainedHashMap<IntKeyRawPointerValueTrait<V> >::Insert(pair);
+  }
+
+  inline V Lookup(const Key& key) {
+    Pair* pair =
+        DirectChainedHashMap<IntKeyRawPointerValueTrait<V> >::Lookup(key);
+    if (pair == NULL) {
+      return V();
+    } else {
+      return pair->value;
+    }
+  }
+
+  inline Pair* LookupPair(const Key& key) {
+    return DirectChainedHashMap<IntKeyRawPointerValueTrait<V> >::Lookup(key);
+  }
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_HASH_MAP_H_
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index fe335e4..4ef0975 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -1239,9 +1239,6 @@
   intptr_t grow_heap = heap_growth_max / 2;
   gc_threshold_in_words_ =
       last_usage_.capacity_in_words + (kPageSizeInWords * grow_heap);
-  intptr_t grow_external = heap_growth_max / 2;
-  gc_external_threshold_in_words_ =
-      last_usage_.external_in_words + (kPageSizeInWords * grow_external);
 }
 
 PageSpaceController::~PageSpaceController() {}
@@ -1253,12 +1250,7 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-  return (after.capacity_in_words > gc_threshold_in_words_) ||
-         NeedsExternalCollection(after);
-}
-
-bool PageSpaceController::NeedsExternalCollection(SpaceUsage after) const {
-  return after.external_in_words > gc_external_threshold_in_words_;
+  return after.CombinedCapacityInWords() > gc_threshold_in_words_;
 }
 
 bool PageSpaceController::NeedsIdleGarbageCollection(SpaceUsage current) const {
@@ -1268,8 +1260,7 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-  return (current.capacity_in_words > idle_gc_threshold_in_words_) ||
-         NeedsExternalCollection(current);
+  return current.CombinedCapacityInWords() > idle_gc_threshold_in_words_;
 }
 
 void PageSpaceController::EvaluateGarbageCollection(SpaceUsage before,
@@ -1281,34 +1272,14 @@
   const int gc_time_fraction = history_.GarbageCollectionTimeFraction();
   heap_->RecordData(PageSpace::kGCTimeFraction, gc_time_fraction);
 
-  // Decide how much external allocations can grow before triggering a GC.
-  {
-    const intptr_t external_after_in_pages =
-        Utils::RoundUp(after.external_in_words, kPageSizeInWords) /
-        kPageSizeInWords;
-    const intptr_t external_growth_in_pages =
-        Utils::RoundUp(before.external_in_words - last_usage_.external_in_words,
-                       kPageSizeInWords) /
-        kPageSizeInWords;
-    // Trigger GC when external allocations grow:
-    // - 25% of the external allocations after this GC, or
-    // - half of the growth since the last collection
-    // whichever is bigger. The second case prevents shrinking the limit too
-    // much. See similar handling of the Dart heap below.
-    intptr_t grow_external = Utils::Maximum<intptr_t>(
-        external_after_in_pages >> 2, external_growth_in_pages >> 1);
-
-    gc_external_threshold_in_words_ =
-        after.external_in_words + (kPageSizeInWords * grow_external);
-  }
-
   // Assume garbage increases linearly with allocation:
   // G = kA, and estimate k from the previous cycle.
   const intptr_t allocated_since_previous_gc =
-      before.used_in_words - last_usage_.used_in_words;
+      before.CombinedUsedInWords() - last_usage_.CombinedUsedInWords();
   intptr_t grow_heap;
   if (allocated_since_previous_gc > 0) {
-    const intptr_t garbage = before.used_in_words - after.used_in_words;
+    const intptr_t garbage =
+        before.CombinedUsedInWords() - after.CombinedUsedInWords();
     ASSERT(garbage >= 0);
     // It makes no sense to expect that each kb allocated will cause more than
     // one kb of garbage, so we clamp k at 1.0.
@@ -1328,8 +1299,9 @@
     // Number of pages we can allocate and still be within the desired growth
     // ratio.
     const intptr_t grow_pages =
-        (static_cast<intptr_t>(after.capacity_in_words / desired_utilization_) -
-         after.capacity_in_words) /
+        (static_cast<intptr_t>(after.CombinedCapacityInWords() /
+                               desired_utilization_) -
+         (after.CombinedCapacityInWords())) /
         kPageSizeInWords;
     if (garbage_ratio == 0) {
       // No garbage in the previous cycle so it would be hard to compute a
@@ -1345,9 +1317,10 @@
       intptr_t local_grow_heap = 0;
       while (min < max) {
         local_grow_heap = (max + min) / 2;
-        const intptr_t limit =
-            after.capacity_in_words + (local_grow_heap * kPageSizeInWords);
-        const intptr_t allocated_before_next_gc = limit - after.used_in_words;
+        const intptr_t limit = after.CombinedCapacityInWords() +
+                               (local_grow_heap * kPageSizeInWords);
+        const intptr_t allocated_before_next_gc =
+            limit - (after.CombinedUsedInWords());
         const double estimated_garbage = k * allocated_before_next_gc;
         if (t <= estimated_garbage / limit) {
           max = local_grow_heap - 1;
@@ -1372,26 +1345,25 @@
 
   // Limit shrinkage: allow growth by at least half the pages freed by GC.
   const intptr_t freed_pages =
-      (before.capacity_in_words - after.capacity_in_words) / kPageSizeInWords;
+      (before.CombinedCapacityInWords() - after.CombinedCapacityInWords()) /
+      kPageSizeInWords;
   grow_heap = Utils::Maximum(grow_heap, freed_pages / 2);
   heap_->RecordData(PageSpace::kAllowedGrowth, grow_heap);
   last_usage_ = after;
 
   // Save final threshold compared before growing.
   gc_threshold_in_words_ =
-      after.capacity_in_words + (kPageSizeInWords * grow_heap);
+      after.CombinedCapacityInWords() + (kPageSizeInWords * grow_heap);
 
   // Set the idle threshold halfway between the current capacity and the
   // capacity at which we'd block for a GC.
   idle_gc_threshold_in_words_ =
-      (after.capacity_in_words + gc_threshold_in_words_) / 2;
+      (after.CombinedCapacityInWords() + gc_threshold_in_words_) / 2;
 
   if (FLAG_log_growth) {
-    THR_Print("%s: threshold=%" Pd "kB, idle_threshold=%" Pd
-              "kB, external_threshold=%" Pd "kB\n",
+    THR_Print("%s: threshold=%" Pd "kB, idle_threshold=%" Pd "kB\n",
               heap_->isolate()->name(), gc_threshold_in_words_ / KBInWords,
-              idle_gc_threshold_in_words_ / KBInWords,
-              gc_external_threshold_in_words_ / KBInWords);
+              idle_gc_threshold_in_words_ / KBInWords);
   }
 }
 
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 9901fea..6a635d7 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -151,8 +151,6 @@
   // (e.g., promotion), as it does not change the state of the controller.
   bool NeedsGarbageCollection(SpaceUsage after) const;
 
-  bool NeedsExternalCollection(SpaceUsage after) const;
-
   // Returns whether an idle GC is worthwhile.
   bool NeedsIdleGarbageCollection(SpaceUsage current) const;
 
diff --git a/runtime/vm/heap/spaces.h b/runtime/vm/heap/spaces.h
index 3325d2f..2885ef5 100644
--- a/runtime/vm/heap/spaces.h
+++ b/runtime/vm/heap/spaces.h
@@ -11,11 +11,19 @@
 namespace dart {
 
 // Usage statistics for a space/generation at a particular moment in time.
-struct SpaceUsage {
+class SpaceUsage {
+ public:
   SpaceUsage() : capacity_in_words(0), used_in_words(0), external_in_words(0) {}
   intptr_t capacity_in_words;
   intptr_t used_in_words;
   intptr_t external_in_words;
+
+  intptr_t CombinedCapacityInWords() const {
+    return capacity_in_words + external_in_words;
+  }
+  intptr_t CombinedUsedInWords() const {
+    return used_in_words + external_in_words;
+  }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index c0a6799..58ae9ca 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -17,7 +17,7 @@
 // package:kernel/binary.md.
 
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 8;
+static const uint32_t kBinaryFormatVersion = 9;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 114ae9a..31148a0 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -762,6 +762,8 @@
       Z, ScriptAt(library_helper.source_uri_index_, import_uri_index));
 
   library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
+  intptr_t annotations_kernel_offset =
+      builder_.ReaderOffset() - correction_offset_;
   intptr_t annotation_count = builder_.ReadListLength();  // read list length.
   if (annotation_count > 0) {
     EnsurePotentialExtensionLibraries();
@@ -772,10 +774,6 @@
   }
   library_helper.SetJustRead(LibraryHelper::kAnnotations);
 
-  library_helper.ReadUntilExcluding(LibraryHelper::kDependencies);
-  LoadLibraryImportsAndExports(&library);
-  library_helper.SetJustRead(LibraryHelper::kDependencies);
-
   // Setup toplevel class (which contains library fields/procedures).
   Class& toplevel_class =
       Class::Handle(Z, Class::New(library, Symbols::TopLevel(), script,
@@ -783,6 +781,10 @@
   toplevel_class.set_is_cycle_free();
   library.set_toplevel_class(toplevel_class);
 
+  library_helper.ReadUntilExcluding(LibraryHelper::kDependencies);
+  LoadLibraryImportsAndExports(&library, toplevel_class);
+  library_helper.SetJustRead(LibraryHelper::kDependencies);
+
   const GrowableObjectArray& classes =
       GrowableObjectArray::Handle(Z, I->object_store()->pending_classes());
 
@@ -851,6 +853,12 @@
     LoadProcedure(library, toplevel_class, false, next_procedure_offset);
   }
 
+  if (FLAG_enable_mirrors && annotation_count > 0) {
+    ASSERT(annotations_kernel_offset > 0);
+    library.AddLibraryMetadata(toplevel_class, TokenPosition::kNoSource,
+                               annotations_kernel_offset);
+  }
+
   toplevel_class.SetFunctions(Array::Handle(MakeFunctionsArray()));
   classes.Add(toplevel_class, Heap::kOld);
   if (!library.Loaded()) library.SetLoaded();
@@ -858,7 +866,8 @@
   return library.raw();
 }
 
-void KernelLoader::LoadLibraryImportsAndExports(Library* library) {
+void KernelLoader::LoadLibraryImportsAndExports(Library* library,
+                                                const Class& toplevel_class) {
   GrowableObjectArray& show_list = GrowableObjectArray::Handle(Z);
   GrowableObjectArray& hide_list = GrowableObjectArray::Handle(Z);
   Array& show_names = Array::Handle(Z);
@@ -869,6 +878,11 @@
   const intptr_t deps_count = builder_.ReadListLength();
   for (intptr_t dep = 0; dep < deps_count; ++dep) {
     LibraryDependencyHelper dependency_helper(&builder_);
+
+    dependency_helper.ReadUntilExcluding(LibraryDependencyHelper::kAnnotations);
+    intptr_t annotations_kernel_offset =
+        builder_.ReaderOffset() - correction_offset_;
+
     dependency_helper.ReadUntilExcluding(LibraryDependencyHelper::kCombinators);
 
     // Ignore the dependency if the target library is invalid.
@@ -937,6 +951,11 @@
         }
       }
     }
+    if (FLAG_enable_mirrors && dependency_helper.annotation_count_ > 0) {
+      ASSERT(annotations_kernel_offset > 0);
+      ns.AddMetadata(toplevel_class, TokenPosition::kNoSource,
+                     annotations_kernel_offset);
+    }
   }
 }
 
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 2bc0bfc..bc41510 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -6,10 +6,10 @@
 #define RUNTIME_VM_KERNEL_LOADER_H_
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-#include <map>
 
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
+#include "vm/hash_map.h"
 #include "vm/kernel.h"
 #include "vm/object.h"
 
@@ -249,7 +249,8 @@
                                   const Function& function,
                                   const AbstractType& field_type);
 
-  void LoadLibraryImportsAndExports(Library* library);
+  void LoadLibraryImportsAndExports(Library* library,
+                                    const Class& toplevel_class);
 
   Library& LookupLibraryOrNull(NameIndex library);
   Library& LookupLibrary(NameIndex library);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2440091..cfdfcbc 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5952,6 +5952,20 @@
   }
 }
 
+// Enclosing outermost function of this local function.
+RawFunction* Function::GetOutermostFunction() const {
+  RawFunction* parent = parent_function();
+  if (parent == Object::null()) {
+    return raw();
+  }
+  Function& function = Function::Handle();
+  do {
+    function = parent;
+    parent = function.parent_function();
+  } while (parent != Object::null());
+  return function.raw();
+}
+
 bool Function::HasGenericParent() const {
   if (IsImplicitClosureFunction()) {
     // The parent function of an implicit closure function is not the enclosing
@@ -10612,8 +10626,9 @@
 }
 
 void Library::AddLibraryMetadata(const Object& tl_owner,
-                                 TokenPosition token_pos) const {
-  AddMetadata(tl_owner, Symbols::TopLevel(), token_pos);
+                                 TokenPosition token_pos,
+                                 intptr_t kernel_offset) const {
+  AddMetadata(tl_owner, Symbols::TopLevel(), token_pos, kernel_offset);
 }
 
 RawString* Library::MakeMetadataName(const Object& obj) const {
@@ -10681,7 +10696,8 @@
   metadata = field.StaticValue();
   if (field.StaticValue() == Object::empty_array().raw()) {
     if (field.kernel_offset() > 0) {
-      metadata = kernel::EvaluateMetadata(field);
+      metadata = kernel::EvaluateMetadata(
+          field, /* is_annotations_offset = */ obj.IsLibrary());
     } else {
       metadata = Parser::ParseMetadata(field);
     }
@@ -12273,7 +12289,9 @@
   StorePointer(&raw_ptr()->metadata_field_, value.raw());
 }
 
-void Namespace::AddMetadata(const Object& owner, TokenPosition token_pos) {
+void Namespace::AddMetadata(const Object& owner,
+                            TokenPosition token_pos,
+                            intptr_t kernel_offset) {
   ASSERT(Field::Handle(metadata_field()).IsNull());
   Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(),
                                                   false,  // is_final
@@ -12282,6 +12300,7 @@
   field.set_is_reflectable(false);
   field.SetFieldType(Object::dynamic_type());
   field.SetStaticValue(Array::empty_array(), true);
+  field.set_kernel_offset(kernel_offset);
   set_metadata_field(field);
 }
 
@@ -12297,7 +12316,12 @@
   Object& metadata = Object::Handle();
   metadata = field.StaticValue();
   if (field.StaticValue() == Object::empty_array().raw()) {
-    metadata = Parser::ParseMetadata(field);
+    if (field.kernel_offset() > 0) {
+      metadata =
+          kernel::EvaluateMetadata(field, /* is_annotations_offset = */ true);
+    } else {
+      metadata = Parser::ParseMetadata(field);
+    }
     if (metadata.IsArray()) {
       ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
       field.SetStaticValue(Array::Cast(metadata), true);
@@ -13540,7 +13564,7 @@
 }
 
 #if defined(TAG_IC_DATA)
-void ICData::set_tag(intptr_t value) const {
+void ICData::set_tag(Tag value) const {
   StoreNonPointer(&raw_ptr()->tag_, value);
 }
 #endif
@@ -14427,7 +14451,7 @@
   NOT_IN_PRECOMPILED(result.set_deopt_id(deopt_id));
   result.set_state_bits(0);
 #if defined(TAG_IC_DATA)
-  result.set_tag(-1);
+  result.set_tag(ICData::Tag::kUnknown);
 #endif
   result.set_rebind_rule(rebind_rule);
   result.SetNumArgsTested(num_args_tested);
@@ -14451,7 +14475,7 @@
   result.set_deopt_id(Thread::kNoDeoptId);
   result.set_state_bits(0);
 #if defined(TAG_IC_DATA)
-  result.set_tag(-1);
+  result.set_tag(ICData::Tag::kUnknown);
 #endif
   return result.raw();
 }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ba4f605..ff768b4 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2004,8 +2004,9 @@
   enum { kCachedICDataArrayCount = 4 };
 
 #if defined(TAG_IC_DATA)
-  void set_tag(intptr_t value) const;
-  intptr_t tag() const { return raw_ptr()->tag_; }
+  using Tag = RawICData::Tag;
+  void set_tag(Tag value) const;
+  Tag tag() const { return raw_ptr()->tag_; }
 #endif
 
   bool is_static_call() const;
@@ -2286,6 +2287,9 @@
   // Enclosing function of this local function.
   RawFunction* parent_function() const;
 
+  // Enclosing outermost function of this local function.
+  RawFunction* GetOutermostFunction() const;
+
   void set_extracted_method_closure(const Function& function) const;
   RawFunction* extracted_method_closure() const;
 
@@ -3845,7 +3849,8 @@
                            TokenPosition token_pos,
                            intptr_t kernel_offset = 0) const;
   void AddLibraryMetadata(const Object& tl_owner,
-                          TokenPosition token_pos) const;
+                          TokenPosition token_pos,
+                          intptr_t kernel_offset = 0) const;
   void AddTypeParameterMetadata(const TypeParameter& param,
                                 TokenPosition token_pos) const;
   void CloneMetadataFrom(const Library& from_library,
@@ -4061,7 +4066,9 @@
   RawArray* show_names() const { return raw_ptr()->show_names_; }
   RawArray* hide_names() const { return raw_ptr()->hide_names_; }
 
-  void AddMetadata(const Object& owner, TokenPosition token_pos);
+  void AddMetadata(const Object& owner,
+                   TokenPosition token_pos,
+                   intptr_t kernel_offset = 0);
   RawObject* GetMetadata() const;
 
   static intptr_t InstanceSize() {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index eb810c7..3e0d919 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -253,7 +253,7 @@
 
 kernel::ScopeBuildingResult* ParsedFunction::EnsureKernelScopes() {
   if (kernel_scopes_ == NULL) {
-    kernel::StreamingScopeBuilder builder(this);
+    kernel::ScopeBuilder builder(this);
     kernel_scopes_ = builder.BuildScopes();
   }
   return kernel_scopes_;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 5d7a7f0..88bd409 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1663,8 +1663,10 @@
   NOT_IN_PRECOMPILED(int32_t deopt_id_);
   uint32_t state_bits_;  // Number of arguments tested in IC, deopt reasons.
 #if defined(TAG_IC_DATA)
-  intptr_t tag_;  // Debugging, verifying that the icdata is assigned to the
-                  // same instruction again. Store -1 or Instruction::Tag.
+  enum class Tag : intptr_t{kUnknown, kInstanceCall, kStaticCall};
+
+  Tag tag_;  // Debugging, verifying that the icdata is assigned to the
+             // same instruction again.
 #endif
 };
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 435e697..2609707 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1639,7 +1639,7 @@
   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(reader->Read<int16_t>());
+  result.set_tag(static_cast<ICData::Tag>(reader->Read<int16_t>()));
 #endif
 
   // Set all the object fields.
@@ -1666,7 +1666,7 @@
   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>(ptr()->tag_);
+  writer->Write<int16_t>(static_cast<int64_t>(ptr()->tag_));
 #endif
 
   // Write out all the object pointer fields.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 9e2f105..6e5d05d 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -348,8 +348,7 @@
     int start = _arguments.length - _typeArgumentCount;
     var list = <Type>[];
     for (int index = 0; index < _typeArgumentCount; index++) {
-      list.add(
-          createRuntimeType(runtimeTypeToString(_arguments[start + index])));
+      list.add(createRuntimeType(_arguments[start + index]));
     }
     return list;
   }
@@ -3027,7 +3026,8 @@
 
   toString() {
     var receiver = _receiver == null ? _self : _receiver;
-    return "Closure '$_name' of ${Primitives.objectToHumanReadableString(receiver)}";
+    return "Closure '$_name' of "
+        "${Primitives.objectToHumanReadableString(receiver)}";
   }
 
   @NoInline()
@@ -3062,8 +3062,8 @@
   @NoSideEffects()
   static String computeFieldNamed(String fieldName) {
     var template = new BoundClosure('self', 'target', 'receiver', 'name');
-    var names = JSArray
-        .markFixedList(JS('', 'Object.getOwnPropertyNames(#)', template));
+    var names = JSArray.markFixedList(
+        JS('', 'Object.getOwnPropertyNames(#)', template));
     for (int i = 0; i < names.length; i++) {
       var name = names[i];
       if (JS('bool', '#[#] === #', template, name, fieldName)) {
@@ -3556,8 +3556,8 @@
 
   /// Normal type error caused by a failed subtype test.
   TypeErrorImplementation(Object value, String type)
-      : message = "TypeError: ${Error.safeToString(value)}: "
-            "type '${_typeDescription(value)}' is not a subtype of type '$type'";
+      : message = "TypeError: ${Error.safeToString(value)}: type "
+            "'${_typeDescription(value)}' is not a subtype of type '$type'";
 
   TypeErrorImplementation.fromMessage(String this.message);
 
@@ -3571,8 +3571,8 @@
 
   /// Normal cast error caused by a failed type cast.
   CastErrorImplementation(Object value, Object type)
-      : message = "CastError: ${Error.safeToString(value)}: "
-            "type '${_typeDescription(value)}' is not a subtype of type '$type'";
+      : message = "CastError: ${Error.safeToString(value)}: type "
+            "'${_typeDescription(value)}' is not a subtype of type '$type'";
 
   String toString() => message;
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 74a6352..f724172 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -42,26 +42,28 @@
 
 part of _js_helper;
 
-Type createRuntimeType(String name) {
-  // Use a 'JS' cast to String.  Since this is registered as used by the
-  // backend, type inference assumes the worst (name is dynamic).
-  return new TypeImpl(JS('String', '#', name));
+/// Called from generated code.
+Type createRuntimeType(rti) {
+  return new TypeImpl(rti);
 }
 
 class TypeImpl implements Type {
-  final String _typeName;
+  final dynamic _rti;
+  String __typeName;
   String _unmangledName;
+  int _hashCode;
 
-  TypeImpl(this._typeName);
+  TypeImpl(this._rti);
+
+  String get _typeName => __typeName ??= runtimeTypeToString(_rti);
 
   String toString() {
-    if (_unmangledName != null) return _unmangledName;
-    String unmangledName = unmangleAllIdentifiersIfPreservedAnyways(_typeName);
-    return _unmangledName = unmangledName;
+    return _unmangledName ??=
+        unmangleAllIdentifiersIfPreservedAnyways(_typeName);
   }
 
   // TODO(ahe): This is a poor hashCode as it collides with its name.
-  int get hashCode => _typeName.hashCode;
+  int get hashCode => _hashCode ??= _typeName.hashCode;
 
   bool operator ==(other) {
     return (other is TypeImpl) && _typeName == other._typeName;
@@ -171,10 +173,10 @@
  * of type 4, the JavaScript array, where the first element represents the class
  * and the remaining elements represent the type arguments.
  */
-String _getRuntimeTypeAsStringV1(var rti, {String onTypeVariable(int i)}) {
+String _getRuntimeTypeAsStringV1(var rti) {
   assert(isJsArray(rti));
   String className = rawRtiToJsConstructorName(getIndex(rti, 0));
-  return '$className${joinArgumentsV1(rti, 1, onTypeVariable: onTypeVariable)}';
+  return '$className${joinArgumentsV1(rti, 1)}';
 }
 
 String _getRuntimeTypeAsStringV2(var rti, List<String> genericContext) {
@@ -186,29 +188,27 @@
 /// Returns a human-readable representation of the type representation [rti].
 ///
 /// Called from generated code.
-///
-/// [onTypeVariable] is used only from dart:mirrors.
 @NoInline()
-String runtimeTypeToString(var rti, {String onTypeVariable(int i)}) {
+String runtimeTypeToString(var rti) {
   return JS_GET_FLAG('STRONG_MODE')
       ? runtimeTypeToStringV2(rti, null)
-      : runtimeTypeToStringV1(rti, onTypeVariable: onTypeVariable);
+      : runtimeTypeToStringV1(rti);
 }
 
-String runtimeTypeToStringV1(var rti, {String onTypeVariable(int i)}) {
+String runtimeTypeToStringV1(var rti) {
   if (rti == null) {
     return 'dynamic';
   }
   if (isJsArray(rti)) {
     // A list representing a type with arguments.
-    return _getRuntimeTypeAsStringV1(rti, onTypeVariable: onTypeVariable);
+    return _getRuntimeTypeAsStringV1(rti);
   }
   if (isJsFunction(rti)) {
     // A reference to the constructor.
     return rawRtiToJsConstructorName(rti);
   }
   if (rti is int) {
-    return '${onTypeVariable == null ? rti : onTypeVariable(rti)}';
+    return '${rti}';
   }
   String functionPropertyName = JS_GET_NAME(JsGetName.FUNCTION_TYPE_TAG);
   if (JS('bool', 'typeof #[#] != "undefined"', rti, functionPropertyName)) {
@@ -218,9 +218,9 @@
     String typedefPropertyName = JS_GET_NAME(JsGetName.TYPEDEF_TAG);
     var typedefInfo = JS('', '#[#]', rti, typedefPropertyName);
     if (typedefInfo != null) {
-      return runtimeTypeToStringV1(typedefInfo, onTypeVariable: onTypeVariable);
+      return runtimeTypeToStringV1(typedefInfo);
     }
-    return _functionRtiToStringV1(rti, onTypeVariable);
+    return _functionRtiToStringV1(rti);
   }
   // We should not get here.
   return 'unknown-reified-type';
@@ -263,7 +263,7 @@
   return 'unknown-reified-type';
 }
 
-String _functionRtiToStringV1(var rti, String onTypeVariable(int i)) {
+String _functionRtiToStringV1(var rti) {
   String returnTypeText;
   String voidTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
   if (JS('bool', '!!#[#]', rti, voidTag)) {
@@ -271,8 +271,7 @@
   } else {
     String returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
     var returnRti = JS('', '#[#]', rti, returnTypeTag);
-    returnTypeText =
-        runtimeTypeToStringV1(returnRti, onTypeVariable: onTypeVariable);
+    returnTypeText = runtimeTypeToStringV1(returnRti);
   }
 
   String argumentsText = '';
@@ -285,8 +284,7 @@
     List arguments = JS('JSFixedArray', '#[#]', rti, requiredParamsTag);
     for (var argument in arguments) {
       argumentsText += sep;
-      argumentsText +=
-          runtimeTypeToStringV1(argument, onTypeVariable: onTypeVariable);
+      argumentsText += runtimeTypeToStringV1(argument);
       sep = ', ';
     }
   }
@@ -300,8 +298,7 @@
     sep = '';
     for (var argument in optionalArguments) {
       argumentsText += sep;
-      argumentsText +=
-          runtimeTypeToStringV1(argument, onTypeVariable: onTypeVariable);
+      argumentsText += runtimeTypeToStringV1(argument);
       sep = ', ';
     }
     argumentsText += ']';
@@ -316,9 +313,8 @@
     sep = '';
     for (String name in extractKeys(namedArguments)) {
       argumentsText += sep;
-      argumentsText += runtimeTypeToStringV1(
-          JS('', '#[#]', namedArguments, name),
-          onTypeVariable: onTypeVariable);
+      argumentsText +=
+          runtimeTypeToStringV1(JS('', '#[#]', namedArguments, name));
       argumentsText += ' $name';
       sep = ', ';
     }
@@ -454,8 +450,7 @@
       : joinArgumentsV1(types, startIndex);
 }
 
-String joinArgumentsV1(var types, int startIndex,
-    {String onTypeVariable(int i)}) {
+String joinArgumentsV1(var types, int startIndex) {
   if (types == null) return '';
   assert(isJsArray(types));
   bool firstArgument = true;
@@ -471,8 +466,7 @@
     if (argument != null) {
       allDynamic = false;
     }
-    buffer
-        .write(runtimeTypeToStringV1(argument, onTypeVariable: onTypeVariable));
+    buffer.write(runtimeTypeToStringV1(argument));
   }
   return allDynamic ? '' : '<$buffer>';
 }
@@ -480,22 +474,19 @@
 String joinArgumentsV2(var types, int startIndex, List<String> genericContext) {
   if (types == null) return '';
   assert(isJsArray(types));
-  bool firstArgument = true;
+  var separator = '';
   bool allDynamic = true;
   StringBuffer buffer = new StringBuffer('');
   for (int index = startIndex; index < getLength(types); index++) {
-    if (firstArgument) {
-      firstArgument = false;
-    } else {
-      buffer.write(', ');
-    }
+    buffer.write(separator);
+    separator = ', ';
     var argument = getIndex(types, index);
     if (argument != null) {
       allDynamic = false;
     }
     buffer.write(runtimeTypeToStringV2(argument, genericContext));
   }
-  return allDynamic ? '' : '<$buffer>';
+  return (!JS_GET_FLAG('STRONG_MODE') && allDynamic) ? '' : '<$buffer>';
 }
 
 /**
@@ -519,9 +510,32 @@
   return "$className${joinArguments(rti, 0)}";
 }
 
+/// Returns the full type of [o] in the runtime type representation.
+getRti(o) {
+  if (o is Closure) {
+    // This excludes classes that implement Function via a `call` method, but
+    // includes classes generated to represent closures in closure conversion.
+    var functionRti = extractFunctionTypeObjectFrom(o);
+    if (functionRti != null) return functionRti;
+  }
+  var interceptor = getInterceptor(o);
+  var type = getRawRuntimeType(interceptor);
+  if (o == null) return type;
+  if (JS('bool', 'typeof # != "object"', o)) return type;
+  var rti = getRuntimeTypeInfo(o);
+  if (rti != null) {
+    // If the type has type variables (that is, `rti != null`), make a copy of
+    // the type arguments and insert [o] in the first position to create a
+    // compound type representation.
+    rti = JS('JSExtendableArray', '#.slice()', rti); // Make a copy.
+    JS('', '#.splice(0, 0, #)', rti, type); // Insert type at position 0.
+    type = rti;
+  }
+  return type;
+}
+
 Type getRuntimeType(var object) {
-  String type = getRuntimeTypeString(object);
-  return new TypeImpl(type);
+  return new TypeImpl(getRti(object));
 }
 
 /**
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 4c34ac7..6c2d46f 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -616,7 +616,6 @@
 LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
@@ -662,7 +661,6 @@
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError
 LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError
 LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
 LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
@@ -1744,7 +1742,6 @@
 LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: Pass, RuntimeError # Issue 29634
@@ -1771,7 +1768,6 @@
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: Pass, RuntimeError # Issue 29634
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: Pass, RuntimeError # Issue 29634
 LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: Pass, RuntimeError # Issue 29634
 LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # Please triage this failure
@@ -2713,7 +2709,6 @@
 LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
@@ -2810,7 +2805,6 @@
 LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # Issue 28983
 LayoutTests/fast/dom/shadow/event-path-not-in-document_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # Please triage this failure
@@ -3623,13 +3617,12 @@
 LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texture-complete_t01: Skip # Times out sometimes
 LayoutTests/fast/canvas/webgl/texture-npot_t01: Skip # Times out sometimes
-LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError
-LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError
 LayoutTests/fast/forms/submit-form-attributes_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError
 LayoutTests/fast/text/whitespace/nowrap-line-break-after-white-space_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
+LibTest/core/Uri/Uri_A06_t03: Pass, Slow
+LibTest/core/Uri/encodeQueryComponent_A01_t02: Pass, Slow
 
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 Language/Classes/Abstract_Instance_Members/override_no_named_parameters_t06: Pass, Slow # Issue 25940
@@ -4311,7 +4304,6 @@
 LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # Please triage this failure
@@ -5885,7 +5877,6 @@
 LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
index c1a2a01..6824a1a 100644
--- a/tests/co19_2/co19_2-analyzer.status
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -24,14 +24,25 @@
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError # Issue 27476
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError # Issue 27476
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError # Issue 27476
-Language/Classes/method_definition_t06: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t03: MissingCompileTimeError # Issue 27477
-Language/Expressions/Identifier_Reference/evaluation_library_or_getter_t01: StaticWarning
-Language/Expressions/Identifier_Reference/evaluation_type_parameter_t02: MissingCompileTimeError # Issue 27491
+Language/Classes/method_definition_t06: MissingCompileTimeError # Please triage this failure
+Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError # Please triage this failure
+Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError # Please triage this failure
+Language/Expressions/Function_Invocation/Unqualified_Invocation/function_expr_invocation_t05: CompileTimeError # Please triage this failure
+Language/Expressions/Identifier_Reference/evaluation_library_or_getter_t01: StaticWarning # Please triage this failure
+Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError # Please triage this failure
+Language/Expressions/Instance_Creation/Const/parameterized_type_t01: CompileTimeError # Please triage this failure
+Language/Expressions/Instance_Creation/Const/parameterized_type_t02: CompileTimeError # Please triage this failure
+Language/Expressions/Instance_Creation/New/syntax_t04: MissingCompileTimeError # Please triage this failure
+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/Functions/generator_return_type_t02: MissingCompileTimeError # Issue 32192
 Language/Functions/generator_return_type_t06: MissingCompileTimeError # Issue 32192
-Language/Generics/syntax_t02: Crash # Issue 29388
+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/Libraries_and_Scripts/Parts/compilation_t01: MissingCompileTimeError, Pass # 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
@@ -48,13 +59,45 @@
 Language/Mixins/Mixin_Application/warning_t03: CompileTimeError # Issue 23878
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
-Language/Statements/Assert/execution_t10: MissingCompileTimeError # Issue 27426
-Language/Statements/Assert/type_t02: MissingCompileTimeError # Issue 27426
-Language/Statements/Assert/type_t04: MissingCompileTimeError # Issue 26002
-Language/Statements/Do/condition_type_t02: MissingCompileTimeError
-Language/Types/Interface_Types/subtype_t12: StaticWarning
-Language/Types/Type_Void/syntax_t09: MissingCompileTimeError # Issue 30177
-Language/Types/Type_Void/using_t02: MissingCompileTimeError
+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
 Language/Variables/final_or_static_initialization_t01: MissingCompileTimeError # Issue 27510
 Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError # Issue 27510
 Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError # Issue 27510
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t01: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l3_t02: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t01: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t02: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t03: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t04: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t05: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t06: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_assign_l4_t07: Crash # Issue 33152, 33477
+LanguageFeatures/Instantiate-to-bound/interface/interface_neg_assign_l2_t01: MissingCompileTimeError # Issue 33308
+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/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
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index a32e005..956726a 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -3,27 +3,21 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $fasta ]
-Language/Classes/Abstract_Instance_Members/inherited_t01: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/inherited_t02: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/inherited_t03: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/inherited_t04: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/inherited_t05: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/inherited_t06: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/invocation_t01: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/invocation_t02: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/no_implementation_t01: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/override_default_value_t02: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError
-Language/Classes/Abstract_Instance_Members/override_default_value_t06: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError
 Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t01: MissingCompileTimeError
+Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError
+Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
+Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/arguments_type_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
@@ -31,17 +25,12 @@
 Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
 Language/Classes/Constructors/Factories/function_type_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/function_type_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t05: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t05: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/explicit_type_t01: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/static_type_t01: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError
 Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError
@@ -50,13 +39,11 @@
 Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError
 Language/Classes/Getters/override_t02: MissingCompileTimeError
 Language/Classes/Getters/override_t03: MissingCompileTimeError
-Language/Classes/Getters/static_getter_t01: MissingCompileTimeError
 Language/Classes/Getters/type_object_t01: CompileTimeError
 Language/Classes/Getters/type_object_t02: CompileTimeError
 Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_setter_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_setter_t02: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError
 Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError
@@ -71,25 +58,16 @@
 Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError
 Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError
 Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError
-Language/Classes/Setters/name_t01: MissingCompileTimeError
 Language/Classes/Setters/name_t02: MissingCompileTimeError
-Language/Classes/Setters/name_t03: MissingCompileTimeError
-Language/Classes/Setters/name_t04: MissingCompileTimeError
-Language/Classes/Setters/name_t05: MissingCompileTimeError
+Language/Classes/Setters/name_t06: CompileTimeError
+Language/Classes/Setters/name_t07: CompileTimeError
 Language/Classes/Setters/override_t02: MissingCompileTimeError
-Language/Classes/Setters/static_setter_t05: MissingCompileTimeError
-Language/Classes/Setters/static_setter_t06: MissingCompileTimeError
-Language/Classes/Superclasses/Inheritance_and_Overriding/abstract_method_t01: MissingCompileTimeError
+Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
-Language/Classes/Superinterfaces/no_member_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/no_member_t05: MissingCompileTimeError
+Language/Classes/Superinterfaces/more_than_once_t01: MissingCompileTimeError
+Language/Classes/Superinterfaces/superclass_as_superinterface_t01: MissingCompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
-Language/Classes/declarations_t06: MissingCompileTimeError
-Language/Classes/declarations_t08: MissingCompileTimeError
-Language/Classes/definition_t23: CompileTimeError
-Language/Classes/method_definition_t03: MissingCompileTimeError
-Language/Classes/method_definition_t04: MissingCompileTimeError
-Language/Classes/method_definition_t05: MissingCompileTimeError
+Language/Classes/definition_t24: MissingCompileTimeError
 Language/Classes/method_definition_t06: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
@@ -97,38 +75,26 @@
 Language/Enums/syntax_t09: CompileTimeError
 Language/Expressions/Assignable_Expressions/syntax_t01: CompileTimeError
 Language/Expressions/Assignment/expression_assignment_failed_t02: CompileTimeError
-Language/Expressions/Assignment/indexed_expression_super_t03: CompileTimeError
-Language/Expressions/Assignment/indexed_expression_super_t04: CompileTimeError
 Language/Expressions/Assignment/static_type_t02: CompileTimeError
 Language/Expressions/Assignment/static_type_t03: CompileTimeError
-Language/Expressions/Assignment/super_assignment_failed_t01: CompileTimeError
-Language/Expressions/Assignment/super_assignment_failed_t02: CompileTimeError
-Language/Expressions/Assignment/super_assignment_failed_t03: CompileTimeError
 Language/Expressions/Assignment/super_assignment_failed_t04: CompileTimeError
 Language/Expressions/Assignment/super_assignment_static_warning_t02: CompileTimeError
 Language/Expressions/Assignment/super_assignment_static_warning_t03: CompileTimeError
 Language/Expressions/Assignment/super_assignment_t06: CompileTimeError
 Language/Expressions/Assignment/super_assignment_value_t02: CompileTimeError
-Language/Expressions/Assignment/this_assignment_t02: CompileTimeError
 Language/Expressions/Bitwise_Expressions/syntax_t01: CompileTimeError
 Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
 Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
+Language/Expressions/Constants/depending_on_itself_t03: MissingCompileTimeError
 Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
+Language/Expressions/Constants/exception_t01: MissingCompileTimeError
+Language/Expressions/Constants/exception_t03: MissingCompileTimeError
 Language/Expressions/Constants/exception_t04: MissingCompileTimeError
-Language/Expressions/Constants/literal_number_t01: CompileTimeError
 Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
-Language/Expressions/Constants/math_operators_t01: CompileTimeError
-Language/Expressions/Constants/math_operators_t06: CompileTimeError
+Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError
+Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
 Language/Expressions/Equality/syntax_t01: CompileTimeError
 Language/Expressions/Function_Expressions/syntax_t05: CompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/names_matching_t02: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/names_matching_t03: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t02: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t03: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t06: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/number_of_arguments_t07: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/optional_parameter_type_t02: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Function_Expression_Invocation/static_type_t02: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t01: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t02: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t03: CompileTimeError
@@ -137,11 +103,8 @@
 Language/Expressions/Function_Invocation/async_cleanup_t06: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t07: CompileTimeError
 Language/Expressions/Function_Invocation/async_cleanup_t08: CompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t02: CompileTimeError
-Language/Expressions/Identifier_Reference/evaluation_property_extraction_t04: CompileTimeError
-Language/Expressions/Instance_Creation/Const/abstract_class_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/abstract_class_t04: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/parameterized_type_t01: CompileTimeError
 Language/Expressions/Instance_Creation/Const/parameterized_type_t02: CompileTimeError
 Language/Expressions/Instance_Creation/New/evaluation_t16: MissingCompileTimeError
@@ -155,34 +118,15 @@
 Language/Expressions/Instance_Creation/New/type_argument_t01: MissingCompileTimeError
 Language/Expressions/Instance_Creation/malformed_or_malbounded_t07: MissingCompileTimeError
 Language/Expressions/Lists/constant_list_t01: CompileTimeError
-Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t09: CompileTimeError
-Language/Expressions/Lookup/Getter_and_Setter_Lookup/definition_t10: CompileTimeError
 Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
 Language/Expressions/Maps/constant_map_type_t01: CompileTimeError
 Language/Expressions/Maps/equal_keys_t01: MissingCompileTimeError
 Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t03: CompileTimeError
 Language/Expressions/Method_Invocation/Ordinary_Invocation/accessible_instance_member_t04: CompileTimeError
 Language/Expressions/Method_Invocation/Ordinary_Invocation/function_type_t01: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t21: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/static_type_t04: CompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t03: CompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t04: CompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/accessible_instance_member_t05: CompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t05: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t06: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t07: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t08: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/evaluation_t09: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: CompileTimeError
 Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: CompileTimeError
 Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/static_type_dynamic_t02: CompileTimeError
 Language/Expressions/Multiplicative_Expressions/syntax_t01: CompileTimeError
-Language/Expressions/Numbers/static_type_of_int_t01: CompileTimeError
-Language/Expressions/Numbers/syntax_t06: CompileTimeError
-Language/Expressions/Numbers/syntax_t09: CompileTimeError
-Language/Expressions/Numbers/syntax_t10: CompileTimeError
 Language/Expressions/Postfix_Expressions/syntax_t01: CompileTimeError
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/instance_of_type_getter_t01: CompileTimeError
 Language/Expressions/Property_Extraction/Getter_Access_and_Method_Extraction/instance_of_type_getter_t03: CompileTimeError
@@ -196,51 +140,28 @@
 Language/Expressions/Strings/String_Interpolation/double_quote_t02: CompileTimeError
 Language/Expressions/Strings/String_Interpolation/single_quote_t02: CompileTimeError
 Language/Expressions/This/placement_t04: MissingCompileTimeError
-Language/Expressions/Type_Cast/evaluation_t10: MissingCompileTimeError
-Language/Expressions/Type_Test/evaluation_t10: MissingCompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t10: CompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t27: CompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
 Language/Functions/async_return_type_t01: MissingCompileTimeError
-Language/Functions/async_return_type_t02: MissingCompileTimeError
 Language/Functions/generator_return_type_t01: MissingCompileTimeError
 Language/Functions/generator_return_type_t02: MissingCompileTimeError
 Language/Functions/generator_return_type_t05: MissingCompileTimeError
 Language/Functions/generator_return_type_t06: MissingCompileTimeError
 Language/Generics/scope_t06: MissingCompileTimeError
+Language/Generics/syntax_t02: CompileTimeError
+Language/Generics/syntax_t03: CompileTimeError
 Language/Generics/upper_bound_t01: MissingCompileTimeError
-Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_members_t01: MissingCompileTimeError
-Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: MissingCompileTimeError
-Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: MissingCompileTimeError
 Language/Libraries_and_Scripts/Exports/reexport_t01: MissingCompileTimeError
 Language/Libraries_and_Scripts/Exports/same_name_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/deferred_import_t01: CompileTimeError
-Language/Libraries_and_Scripts/Imports/deferred_import_t02: CompileTimeError
-Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t03: CompileTimeError
 Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/library_name_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t01: CompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t02: CompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t16: CompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t17: CompileTimeError
-Language/Libraries_and_Scripts/Imports/static_type_t01: CompileTimeError
-Language/Mixins/Mixin_Application/abstract_t05: MissingCompileTimeError
-Language/Mixins/Mixin_Application/abstract_t06: MissingCompileTimeError
+Language/Metadata/compilation_t03: MissingCompileTimeError
 Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/interfaces_t05: MissingCompileTimeError
 Language/Mixins/Mixin_Application/static_warning_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/superinterfaces_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/superinterfaces_t02: MissingCompileTimeError
-Language/Mixins/Mixin_Application/superinterfaces_t06: MissingCompileTimeError
-Language/Mixins/Mixin_Application/superinterfaces_t08: MissingCompileTimeError
-Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
-Language/Statements/Assert/execution_t08: CompileTimeError
-Language/Statements/Assert/production_mode_t01: CompileTimeError
-Language/Statements/Assert/type_t08: CompileTimeError
 Language/Statements/Continue/async_loops_t01: CompileTimeError
 Language/Statements/Continue/async_loops_t02: CompileTimeError
 Language/Statements/Continue/async_loops_t03: CompileTimeError
@@ -253,14 +174,7 @@
 Language/Statements/Continue/async_loops_t10: CompileTimeError
 Language/Statements/Continue/control_transfer_t08: CompileTimeError
 Language/Statements/Continue/control_transfer_t09: CompileTimeError
-Language/Statements/Continue/label_t06: MissingCompileTimeError
 Language/Statements/Continue/label_t07: MissingCompileTimeError
-Language/Statements/Continue/label_t08: MissingCompileTimeError
-Language/Statements/Continue/label_t09: MissingCompileTimeError
-Language/Statements/Continue/label_t10: MissingCompileTimeError
-Language/Statements/Continue/label_t11: MissingCompileTimeError
-Language/Statements/Do/condition_type_t02: MissingCompileTimeError
-Language/Statements/Labels/scope_t05: MissingCompileTimeError
 Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError
 Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError
 Language/Statements/Switch/execution_t01: MissingCompileTimeError
@@ -270,10 +184,7 @@
 Language/Statements/Switch/type_t01: MissingCompileTimeError
 Language/Statements/Switch/type_t02: MissingCompileTimeError
 Language/Statements/Try/catch_scope_t01: CompileTimeError
-Language/Types/Dynamic_Type_System/deferred_type_error_t01: MissingCompileTimeError
 Language/Types/Dynamic_Type_System/malbounded_type_error_t01: MissingCompileTimeError
-Language/Types/Function_Types/call_t02: MissingCompileTimeError
-Language/Types/Interface_Types/subtype_t12: CompileTimeError
 Language/Types/Interface_Types/subtype_t30: CompileTimeError
 Language/Types/Parameterized_Types/arity_mismatch_t01: MissingCompileTimeError
 Language/Types/Parameterized_Types/arity_mismatch_t05: MissingCompileTimeError
@@ -284,246 +195,43 @@
 Language/Types/Parameterized_Types/malbounded_t04: MissingCompileTimeError
 Language/Types/Parameterized_Types/malbounded_t05: MissingCompileTimeError
 Language/Types/Parameterized_Types/malbounded_t06: MissingCompileTimeError
-Language/Types/Static_Types/deferred_type_t01: MissingCompileTimeError
-Language/Types/Static_Types/deferred_type_t02: MissingCompileTimeError
-Language/Types/Static_Types/deferred_type_t03: MissingCompileTimeError
-Language/Types/Static_Types/deferred_type_t04: MissingCompileTimeError
 Language/Types/Static_Types/malformed_type_t01/04: MissingCompileTimeError
 Language/Types/Static_Types/malformed_type_t01/05: MissingCompileTimeError
 Language/Types/Static_Types/malformed_type_t01/06: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/syntax_t01: CompileTimeError
 Language/Types/Type_Void/returning_t03: MissingCompileTimeError
 Language/Types/Type_Void/returning_t04: MissingCompileTimeError
 Language/Types/Type_Void/returning_t05: MissingCompileTimeError
-Language/Types/Type_Void/syntax_t05: MissingCompileTimeError
 Language/Types/Type_Void/syntax_t08: MissingCompileTimeError
-Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
 Language/Types/Type_Void/using_t01: MissingCompileTimeError
-Language/Types/Type_Void/using_t02: MissingCompileTimeError
 Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
 Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: CompileTimeError
-LibTest/async/Stream/Stream.fromFutures_A01_t01: CompileTimeError
-LibTest/async/Stream/Stream.fromFutures_A01_t02: CompileTimeError
-LibTest/async/Stream/Stream.fromFutures_A02_t01: CompileTimeError
-LibTest/async/Stream/Stream.fromFutures_A02_t02: CompileTimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t01: CompileTimeError
-LibTest/async/Stream/Stream.fromIterable_A03_t01: CompileTimeError
-LibTest/async/Stream/Stream.periodic_A01_t01: CompileTimeError
-LibTest/async/Stream/Stream.periodic_A04_t01: CompileTimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t01: CompileTimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t01: CompileTimeError
-LibTest/async/StreamController/stream_A02_t01: CompileTimeError
-LibTest/async/StreamController/stream_A03_t01: CompileTimeError
-LibTest/async/Zone/runBinaryGuarded_A01_t02: CompileTimeError
-LibTest/async/Zone/runUnary_A01_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/firstWhere_A02_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/firstWhere_A03_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/lastWhere_A02_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/lastWhere_A03_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/skipWhile_A02_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/takeWhile_A02_t01: CompileTimeError
-LibTest/collection/DoubleLinkedQueue/where_A02_t01: CompileTimeError
-LibTest/collection/HashMap/HashMap_class_A01_t01: CompileTimeError
-LibTest/collection/HashSet/HashSet_A01_t02: CompileTimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: CompileTimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: CompileTimeError
-LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/contains_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/every_A01_t01: CompileTimeError
-LibTest/collection/IterableMixin/every_A01_t02: CompileTimeError
-LibTest/collection/IterableMixin/every_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/expand_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/firstWhere_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/firstWhere_A02_t02: CompileTimeError
-LibTest/collection/IterableMixin/map_A03_t01: CompileTimeError
-LibTest/collection/IterableMixin/skipWhile_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/takeWhile_A02_t01: CompileTimeError
-LibTest/collection/IterableMixin/where_A02_t01: CompileTimeError
-LibTest/collection/LinkedHashMap/LinkedHashMap_A03_t01: CompileTimeError
-LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t01: CompileTimeError
-LibTest/collection/LinkedHashMap/LinkedHashMap_A04_t02: CompileTimeError
-LibTest/collection/LinkedHashMap/LinkedHashMap_class_A01_t01: CompileTimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_A03_t01: CompileTimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_A05_t01: CompileTimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_A05_t02: CompileTimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: CompileTimeError
-LibTest/collection/LinkedList/remove_A01_t01: CompileTimeError
-LibTest/collection/ListBase/ListBase_class_A01_t01: CompileTimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: CompileTimeError
-LibTest/collection/ListQueue/ListQueue_class_A01_t01: CompileTimeError
-LibTest/collection/MapBase/MapBase_class_A01_t01: CompileTimeError
-LibTest/collection/MapMixin/MapMixin_class_A01_t01: CompileTimeError
-LibTest/collection/MapView/MapView_class_A01_t01: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_l1_t05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/custom_extends_neg_l2_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/interface/interface_neg_assign_l2_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/interface/interface_neg_assign_l2_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/interface/interface_neg_l1_t06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/mixin/mixin_extends_neg_assign_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/mixin/mixin_extends_neg_l1_t01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/mixin/mixin_neg_l1_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_neg_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_named_extends_neg_l2_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_optparam_extends_neg_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_optparam_extends_neg_l2_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_neg_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_neg_l1_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_param_extends_neg_l2_t02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/typedef_ret_extends_neg_l1_t03: MissingCompileTimeError
+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
 LibTest/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
-LibTest/collection/Queue/Queue_class_A01_t01: CompileTimeError
-LibTest/collection/SetBase/SetBase_class_A01_t01: CompileTimeError
-LibTest/collection/SetMixin/SetMixin_class_A01_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A03_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A05_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A06_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterable_A06_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A04_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A05_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.fromIterables_A05_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.from_A02_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.from_A03_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap.from_A03_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A02_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A02_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A03_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A03_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A04_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A05_t01: CompileTimeError
-LibTest/collection/SplayTreeMap/SplayTreeMap_class_A05_t02: CompileTimeError
-LibTest/collection/SplayTreeMap/inherited_tests_A01_t01: CompileTimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t07: CompileTimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet.from_A02_t08: CompileTimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet_A04_t01: CompileTimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet_A05_t01: CompileTimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet_A06_t01: CompileTimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: CompileTimeError
-LibTest/collection/UnmodifiableListView/UnmodifiableListView_class_A01_t01: CompileTimeError
-LibTest/core/Function/apply_A01_t01: CompileTimeError
-LibTest/core/List/Iterable_A01_t01: CompileTimeError
-LibTest/core/List/List_class_A01_t01: CompileTimeError
-LibTest/core/List/List_class_A01_t02: CompileTimeError
-LibTest/core/Map/allTests_A01_t01: CompileTimeError
-LibTest/core/RegExp/allMatches_A01_t01: CompileTimeError
-LibTest/core/Set/every_A01_t01: CompileTimeError
-LibTest/core/Set/every_A01_t02: CompileTimeError
-LibTest/core/Set/every_A01_t03: CompileTimeError
-LibTest/core/Set/forEach_A01_t01: CompileTimeError
-LibTest/core/Set/forEach_A01_t02: CompileTimeError
-LibTest/core/Set/forEach_A01_t03: CompileTimeError
-LibTest/core/Set/forEach_A01_t04: CompileTimeError
-LibTest/core/Set/forEach_A01_t05: CompileTimeError
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A02_t01: CompileTimeError
-LibTest/core/double/operator_GT_A01_t03: CompileTimeError
-LibTest/core/double/operator_GT_A02_t01: CompileTimeError
-LibTest/core/double/operator_LE_A01_t03: CompileTimeError
-LibTest/core/double/operator_LE_A02_t01: CompileTimeError
-LibTest/core/double/operator_LT_A01_t03: CompileTimeError
-LibTest/core/double/operator_LT_A02_t01: CompileTimeError
-LibTest/core/double/operator_addition_A01_t07: CompileTimeError
-LibTest/core/double/operator_addition_A02_t01: CompileTimeError
-LibTest/core/double/operator_division_A01_t07: CompileTimeError
-LibTest/core/double/operator_division_A01_t08: CompileTimeError
-LibTest/core/double/operator_division_A01_t11: CompileTimeError
-LibTest/core/double/operator_division_A02_t01: CompileTimeError
-LibTest/core/double/operator_multiplication_A01_t06: CompileTimeError
-LibTest/core/double/operator_multiplication_A01_t08: CompileTimeError
-LibTest/core/double/operator_multiplication_A02_t01: CompileTimeError
-LibTest/core/double/operator_remainder_A01_t02: CompileTimeError
-LibTest/core/double/operator_remainder_A01_t03: CompileTimeError
-LibTest/core/double/operator_remainder_A01_t04: CompileTimeError
-LibTest/core/double/operator_remainder_A01_t05: CompileTimeError
-LibTest/core/double/operator_remainder_A01_t06: CompileTimeError
-LibTest/core/double/operator_remainder_A02_t01: CompileTimeError
-LibTest/core/double/operator_subtraction_A01_t07: CompileTimeError
-LibTest/core/double/operator_subtraction_A01_t08: CompileTimeError
-LibTest/core/double/operator_subtraction_A02_t01: CompileTimeError
-LibTest/core/double/operator_truncating_division_A01_t08: CompileTimeError
-LibTest/core/double/operator_truncating_division_A02_t01: CompileTimeError
-LibTest/core/double/remainder_A01_t02: CompileTimeError
-LibTest/core/double/remainder_A01_t03: CompileTimeError
-LibTest/core/double/remainder_A01_t04: CompileTimeError
-LibTest/core/double/remainder_A01_t05: CompileTimeError
-LibTest/core/double/remainder_A01_t06: CompileTimeError
-LibTest/core/double/remainder_A02_t01: CompileTimeError
-LibTest/core/double/toStringAsFixed_A02_t01: CompileTimeError
-LibTest/core/int/abs_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/ceil_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/compareTo_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/floor_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/isEven_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/isFinite_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/isNaN_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/isNegative_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/isOdd_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_GT_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_LE_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_NOT_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_OR_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_division_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_equality_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_equality_A02_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_equality_A03_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_left_shift_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_multiplication_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_remainder_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_remainder_A01_t02: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_right_shift_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_truncating_division_A01_t02: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/parse_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/remainder_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/remainder_A01_t02: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/round_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/sign_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/toDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/toInt_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/core/int/truncate_A01_t01: CompileTimeError # co19 issue 131. Test is broken for 64-bit ints
-LibTest/io/Directory/Directory.fromUri_A01_t01: CompileTimeError
-LibTest/io/File/parent_A01_t02: CompileTimeError
-LibTest/io/HttpClientRequest/addError_A02_t01: CompileTimeError
-LibTest/io/HttpClientRequest/addStream_A01_t01: CompileTimeError
-LibTest/io/HttpClientRequest/addStream_A02_t01: CompileTimeError
-LibTest/io/HttpClientRequest/addStream_A02_t02: CompileTimeError
-LibTest/io/HttpClientRequest/add_A03_t01: CompileTimeError
-LibTest/io/HttpClientRequest/add_A03_t02: CompileTimeError
-LibTest/io/HttpClientRequest/flush_A02_t01: CompileTimeError
-LibTest/io/HttpClientRequest/flush_A02_t02: CompileTimeError
-LibTest/io/Link/Link_A03_t02: CompileTimeError
-LibTest/io/RawDatagramSocket/asyncExpand_A01_t01: CompileTimeError
-LibTest/io/RawDatagramSocket/asyncExpand_A01_t02: CompileTimeError
-LibTest/io/WebSocket/connect_A01_t01: CompileTimeError
-LibTest/io/WebSocket/connect_A01_t02: CompileTimeError
-LibTest/isolate/Isolate/spawn_A01_t03: CompileTimeError
-LibTest/isolate/RawReceivePort/sendPort_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/any_A01_t02: CompileTimeError
-LibTest/isolate/ReceivePort/firstWhere_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/firstWhere_A02_t01: CompileTimeError
-LibTest/isolate/ReceivePort/fold_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/forEach_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/lastWhere_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/lastWhere_A02_t01: CompileTimeError
-LibTest/isolate/ReceivePort/reduce_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/singleWhere_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/toSet_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/transform_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/where_A01_t01: CompileTimeError
-LibTest/isolate/ReceivePort/where_A01_t02: CompileTimeError
-LibTest/math/pow_A10_t01: CompileTimeError
-LibTest/typed_data/ByteData/getUint64_A01_t01: CompileTimeError
-LibTest/typed_data/ByteData/setUint64_A01_t01: CompileTimeError
-LibTest/typed_data/Int32x4List/skipWhile_A01_t01: CompileTimeError
-LibTest/typed_data/Int32x4List/takeWhile_A01_t01: CompileTimeError
-LibTest/typed_data/Int32x4List/where_A01_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.fromList_A02_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError
 
 [ $compiler == dartk && $strong ]
 Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: Crash
diff --git a/tests/co19_2/co19_2-runtime.status b/tests/co19_2/co19_2-runtime.status
index 9b057d5..6033fda 100644
--- a/tests/co19_2/co19_2-runtime.status
+++ b/tests/co19_2/co19_2-runtime.status
@@ -5,7 +5,7 @@
 [ $runtime != none && !$checked ]
 LibTest/async/Future/catchError_A03_t05: RuntimeError
 
-[ $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
+[ $compiler == fasta || $runtime == dart_precompiled || $runtime == flutter || $runtime == vm ]
 LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
 LibTest/html/*: SkipByDesign # dart:html not supported on VM.
 WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
diff --git a/tests/compiler/dart2js/all_native_test.dart b/tests/compiler/dart2js/all_native_test.dart
index 9550f03..ae40236 100644
--- a/tests/compiler/dart2js/all_native_test.dart
+++ b/tests/compiler/dart2js/all_native_test.dart
@@ -16,15 +16,24 @@
 
 test(List<String> options) async {
   DiagnosticCollector collector = new DiagnosticCollector();
+  String fileName = 'sdk/tests/compiler/dart2js_native/main.dart';
+  Uri entryPoint = Uri.parse('memory:$fileName');
   await runCompiler(
+      entryPoint: entryPoint,
       memorySourceFiles: {
-        'main.dart': '''
+        fileName: '''
         import 'dart:html';
-        main() => document;
+        import 'dart:_js_helper';
+        
+        method(o) native;
+        
+        main() {
+          method(document);
+        }
         '''
       },
       diagnosticHandler: collector,
-      options: [Flags.analyzeAll, Flags.verbose]..addAll(options));
+      options: [Flags.verbose]..addAll(options));
   int allNativeUsedCount =
       collector.verboseInfos.where((CollectedMessage message) {
     return message.text.startsWith('All native types marked as used due to ');
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index 819890e..2bf98e9 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -24,47 +24,55 @@
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeKernelClosureData,
+    await checkTests(dataDir, const ClosureDataComputer(),
         skipForKernel: skipForKernel, args: args, testOmit: true);
   });
 }
 
-/// Compute closure data mapping for [member] as a kernel based element.
-///
-/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-/// for the data origin.
-void computeKernelClosureData(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
-  ClosureDataLookup closureDataLookup = backendStrategy.closureDataLookup;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  assert(
-      definition.kind == MemberKind.regular ||
-          definition.kind == MemberKind.constructor,
-      failedAt(member, "Unexpected member definition $definition"));
-  new ClosureIrChecker(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          member,
-          localsMap.getLocalsMap(member),
-          closureDataLookup,
-          compiler.codegenWorldBuilder,
-          verbose: verbose)
-      .run(definition.node);
+class ClosureDataComputer extends DataComputer {
+  const ClosureDataComputer();
+
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
+    ClosureDataLookup closureDataLookup = backendStrategy.closureDataLookup;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    assert(
+        definition.kind == MemberKind.regular ||
+            definition.kind == MemberKind.constructor,
+        failedAt(member, "Unexpected member definition $definition"));
+    new ClosureIrChecker(
+            compiler.reporter,
+            actualMap,
+            elementMap,
+            member,
+            localsMap.getLocalsMap(member),
+            closureDataLookup,
+            compiler.codegenWorldBuilder,
+            verbose: verbose)
+        .run(definition.node);
+  }
 }
 
 /// Kernel IR visitor for computing closure data.
-class ClosureIrChecker extends IrDataExtractor with ComputeValueMixin<ir.Node> {
+class ClosureIrChecker extends IrDataExtractor {
   final MemberEntity member;
-  final ClosureDataLookup<ir.Node> closureDataLookup;
+  final ClosureDataLookup closureDataLookup;
   final CodegenWorldBuilder codegenWorldBuilder;
   final KernelToLocalsMap _localsMap;
   final bool verbose;
 
+  Map<BoxLocal, String> boxNames = <BoxLocal, String>{};
+  Link<ScopeInfo> scopeInfoStack = const Link<ScopeInfo>();
+
+  Link<CapturedScope> capturedScopeStack = const Link<CapturedScope>();
+  Link<ClosureRepresentationInfo> closureRepresentationInfoStack =
+      const Link<ClosureRepresentationInfo>();
+
   ClosureIrChecker(
       DiagnosticReporter reporter,
       Map<Id, ActualData> actualMap,
@@ -78,6 +86,14 @@
     pushMember(member);
   }
 
+  ScopeInfo get scopeInfo => scopeInfoStack.head;
+  CapturedScope get capturedScope => capturedScopeStack.head;
+
+  ClosureRepresentationInfo get closureRepresentationInfo =>
+      closureRepresentationInfoStack.isNotEmpty
+          ? closureRepresentationInfoStack.head
+          : null;
+
   visitFunctionExpression(ir.FunctionExpression node) {
     ClosureRepresentationInfo info = closureDataLookup.getClosureInfo(node);
     pushMember(info.callMethod);
@@ -133,23 +149,6 @@
   String computeMemberValue(Id id, ir.Member node) {
     return computeObjectValue(member);
   }
-}
-
-abstract class ComputeValueMixin<T> {
-  bool get verbose;
-  Map<BoxLocal, String> boxNames = <BoxLocal, String>{};
-  ClosureDataLookup<T> get closureDataLookup;
-  Link<ScopeInfo> scopeInfoStack = const Link<ScopeInfo>();
-  ScopeInfo get scopeInfo => scopeInfoStack.head;
-  CapturedScope get capturedScope => capturedScopeStack.head;
-  Link<CapturedScope> capturedScopeStack = const Link<CapturedScope>();
-  Link<ClosureRepresentationInfo> closureRepresentationInfoStack =
-      const Link<ClosureRepresentationInfo>();
-  ClosureRepresentationInfo get closureRepresentationInfo =>
-      closureRepresentationInfoStack.isNotEmpty
-          ? closureRepresentationInfoStack.head
-          : null;
-  CodegenWorldBuilder get codegenWorldBuilder;
 
   void pushMember(MemberEntity member) {
     scopeInfoStack =
@@ -167,7 +166,7 @@
     capturedScopeStack = capturedScopeStack.tail;
   }
 
-  void pushLoopNode(T node) {
+  void pushLoopNode(ir.Node node) {
     //scopeInfoStack = // TODO?
     //    scopeInfoStack.prepend(closureDataLookup.getScopeInfo(member));
     capturedScopeStack = capturedScopeStack
@@ -182,7 +181,7 @@
     capturedScopeStack = capturedScopeStack.tail;
   }
 
-  void pushLocalFunction(T node) {
+  void pushLocalFunction(ir.Node node) {
     closureRepresentationInfoStack = closureRepresentationInfoStack
         .prepend(closureDataLookup.getClosureInfo(node));
     dump(node);
@@ -200,8 +199,8 @@
       print(' capturedScope (${capturedScope.runtimeType})');
       capturedScope.forEachBoxedVariable((a, b) => print('  boxed: $a->$b'));
     }
-    print(
-        ' closureRepresentationInfo (${closureRepresentationInfo.runtimeType})');
+    print(' closureRepresentationInfo (${closureRepresentationInfo
+        .runtimeType})');
     closureRepresentationInfo
         ?.forEachFreeVariable((a, b) => print('  free: $a->$b'));
     closureRepresentationInfo
diff --git a/tests/compiler/dart2js/closure/show.dart b/tests/compiler/dart2js/closure/show.dart
index 870eea9..e300f74 100644
--- a/tests/compiler/dart2js/closure/show.dart
+++ b/tests/compiler/dart2js/closure/show.dart
@@ -5,7 +5,6 @@
 /// Helper program that shows the closure data on a dart program.
 
 import 'package:args/args.dart';
-import '../equivalence/id_equivalence_helper.dart';
 import '../equivalence/show_helper.dart';
 import 'closure_test.dart';
 
@@ -16,6 +15,5 @@
   argParser.addFlag('callers', defaultsTo: false);
   ArgResults results = argParser.parse(args);
 
-  ComputeMemberDataFunction kernelFunction = computeKernelClosureData;
-  await show(results, kernelFunction);
+  await show(results, const ClosureDataComputer());
 }
diff --git a/tests/compiler/dart2js/codegen/interceptor_test.dart b/tests/compiler/dart2js/codegen/interceptor_test.dart
index 3776d52..5b3be69 100644
--- a/tests/compiler/dart2js/codegen/interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_test.dart
@@ -38,8 +38,8 @@
     // access.
     await compile(TEST_TWO, entry: 'foo', check: (String generated) {
       Expect.isFalse(generated.contains(r'a.get$length()'));
-      Expect
-          .isTrue(generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
       Expect.isTrue(
           generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
     });
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index df85ea4..5415410 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -43,7 +43,6 @@
     String methodName,
     bool enableTypeAssertions: false,
     bool minify: false,
-    bool analyzeAll: false,
     bool disableInlining: true,
     bool trustJSInteropTypeAnnotations: false,
     void check(String generatedEntry),
@@ -60,9 +59,6 @@
   if (minify) {
     options.add(Flags.minify);
   }
-  if (analyzeAll) {
-    options.add(Flags.analyzeAll);
-  }
   if (trustJSInteropTypeAnnotations) {
     options.add(Flags.trustJSInteropTypeAnnotations);
   }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index a79f3a6..2519623 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -18,7 +18,6 @@
 equivalence/id_equivalence1_test: Pass, Slow
 equivalence/id_equivalence2_test: Pass, Slow
 generate_code_with_compile_time_errors_test: RuntimeError # not supported yet with the new FE.
-in_user_code_test: RuntimeError # analyze-only with CFE is not complete (Issues 32512, 32513)
 inference/inference0_test: Slow, Pass
 inference/inference1_test: Slow, Pass
 inference/simple_inferrer_const_closure2_test: Fail # Issue 16507
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index ca8c88f..b98c3609 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -32,8 +32,7 @@
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeKernelOutputUnitData,
-        computeClassDataFromKernel: computeKernelClassOutputUnitData,
+    await checkTests(dataDir, const OutputUnitDataComputer(),
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
         skipForKernel: skipForKernel,
         options: compilerOptions,
@@ -79,35 +78,57 @@
   return 'OutputUnit(${unit.name}, {$sb})';
 }
 
-/// OutputData for [member] as a kernel based element.
-///
-/// At this point the compiler has already been run, so it is holding the
-/// relevant OutputUnits, we just need to extract that information from it. We
-/// fill [actualMap] with the data computed about what the resulting OutputUnit
-/// is.
-void computeKernelOutputUnitData(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new TypeMaskIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          member,
-          compiler.backend.outputUnitData,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
-      .run(definition.node);
+class OutputUnitDataComputer extends DataComputer {
+  const OutputUnitDataComputer();
+
+  /// OutputData for [member] as a kernel based element.
+  ///
+  /// At this point the compiler has already been run, so it is holding the
+  /// relevant OutputUnits, we just need to extract that information from it. We
+  /// fill [actualMap] with the data computed about what the resulting OutputUnit
+  /// is.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new OutputUnitIrComputer(compiler.reporter, actualMap, elementMap, member,
+            compiler.backend.outputUnitData, backendStrategy.closureDataLookup)
+        .run(definition.node);
+  }
+
+  @override
+  bool get computesClassData => true;
+
+  @override
+  void computeClassData(
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    OutputUnitData data = compiler.backend.outputUnitData;
+    String value = outputUnitString(data.outputUnitForClass(cls));
+
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    ClassDefinition definition = elementMap.getClassDefinition(cls);
+
+    _registerValue(
+        new ClassId(cls.name),
+        value,
+        cls,
+        computeSourceSpanFromTreeNode(definition.node),
+        actualMap,
+        compiler.reporter);
+  }
 }
 
-/// IR visitor for computing inference data for a member.
-class TypeMaskIrComputer extends IrDataExtractor {
+class OutputUnitIrComputer extends IrDataExtractor {
   final KernelToElementMapForBuilding _elementMap;
   final OutputUnitData _data;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final ClosureDataLookup _closureDataLookup;
 
-  TypeMaskIrComputer(
+  OutputUnitIrComputer(
       DiagnosticReporter reporter,
       Map<Id, ActualData> actualMap,
       this._elementMap,
@@ -158,25 +179,6 @@
   }
 }
 
-void computeKernelClassOutputUnitData(
-    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  OutputUnitData data = compiler.backend.outputUnitData;
-  String value = outputUnitString(data.outputUnitForClass(cls));
-
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  ClassDefinition definition = elementMap.getClassDefinition(cls);
-
-  _registerValue(
-      new ClassId(cls.name),
-      value,
-      cls,
-      computeSourceSpanFromTreeNode(definition.node),
-      actualMap,
-      compiler.reporter);
-}
-
 /// Set [actualMap] to hold a key of [id] with the computed data [value]
 /// corresponding to [object] at location [sourceSpan]. We also perform error
 /// checking to ensure that the same [id] isn't added twice.
diff --git a/tests/compiler/dart2js/end_to_end/dump_info_test.dart b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
new file mode 100644
index 0000000..c318e5f
--- /dev/null
+++ b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that dump-info has no effect on the compiler output.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:expect/expect.dart';
+
+import 'launch_helper.dart' show dart2JsCommand;
+
+copyDirectory(Directory sourceDir, Directory destinationDir) {
+  for (var element in sourceDir.listSync()) {
+    if (element.path.endsWith('.git')) continue;
+    String newPath =
+        path.join(destinationDir.path, path.basename(element.path));
+    if (element is File) {
+      element.copySync(newPath);
+    } else if (element is Directory) {
+      Directory newDestinationDir = new Directory(newPath);
+      newDestinationDir.createSync();
+      copyDirectory(element, newDestinationDir);
+    }
+  }
+}
+
+void main() {
+  Directory tmpDir = Directory.systemTemp.createTempSync('dump_info_test_');
+  Directory out1 = new Directory.fromUri(tmpDir.uri.resolve('without'));
+  out1.createSync();
+  Directory out2 = new Directory.fromUri(tmpDir.uri.resolve('with'));
+  out2.createSync();
+  Directory sunflowerDir =
+      new Directory.fromUri(Uri.base.resolve('third_party/sunflower'));
+
+  print("Copying '${sunflowerDir.path}' to '${tmpDir.path}'.");
+  copyDirectory(sunflowerDir, tmpDir);
+  try {
+    var command =
+        dart2JsCommand(['--out=without/out.js', 'web/sunflower.dart']);
+    print('Run $command');
+    var result = Process.runSync(Platform.resolvedExecutable, command,
+        workingDirectory: tmpDir.path);
+    print('exit code: ${result.exitCode}');
+    print('stdout:');
+    print(result.stdout);
+    print('stderr:');
+    print(result.stderr);
+    Expect.equals(0, result.exitCode);
+    String output1 = new File.fromUri(tmpDir.uri.resolve('without/out.js'))
+        .readAsStringSync();
+
+    command = dart2JsCommand(
+        ['--out=with/out.js', 'web/sunflower.dart', '--dump-info']);
+    print('Run $command');
+    result = Process.runSync(Platform.resolvedExecutable, command,
+        workingDirectory: tmpDir.path);
+    print('exit code: ${result.exitCode}');
+    print('stdout:');
+    print(result.stdout);
+    print('stderr:');
+    print(result.stderr);
+    Expect.equals(0, result.exitCode);
+    String output2 =
+        new File.fromUri(tmpDir.uri.resolve('with/out.js')).readAsStringSync();
+
+    print('Compare outputs...');
+    Expect.equals(output1, output2);
+    print('Done');
+  } finally {
+    print("Deleting '${tmpDir.path}'.");
+    tmpDir.deleteSync(recursive: true);
+  }
+}
diff --git a/tests/compiler/dart2js/end_to_end/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
index 7d543c7..49f7676 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -24,6 +24,7 @@
 import 'package:compiler/src/library_loader.dart';
 import 'package:compiler/src/null_compiler_output.dart';
 import 'package:compiler/src/options.dart' show CompilerOptions;
+import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/universe/world_impact.dart';
 import 'package:compiler/src/world.dart';
 import 'diagnostic_reporter_helper.dart';
@@ -113,9 +114,10 @@
             useNewSourceInfo: compiler.options.useNewSourceInfo);
 
   @override
-  WorldImpact codegen(CodegenWorkItem work, JClosedWorld closedWorld) {
+  WorldImpact codegen(CodegenWorkItem work, JClosedWorld closedWorld,
+      GlobalTypeInferenceResults results) {
     compiler.test('Compiler.codegen');
-    return super.codegen(work, closedWorld);
+    return super.codegen(work, closedWorld, results);
   }
 }
 
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index e634291..08a0a26 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -78,24 +78,11 @@
   return '${colorizeDelimiter(start)}$text${colorizeDelimiter(end)}';
 }
 
-/// Function that computes a data mapping for [member].
-///
-/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-/// for the data origin.
-typedef void ComputeMemberDataFunction(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose});
-
-/// Function that computes a data mapping for [cls].
-///
-/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-/// for the data origin.
-typedef void ComputeClassDataFunction(
-    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
-    {bool verbose});
-
 abstract class DataComputer {
-  void setup();
+  const DataComputer();
+
+  /// Called before testing to setup flags needed for data collection.
+  void setup() {}
 
   /// Function that computes a data mapping for [member].
   ///
@@ -105,13 +92,16 @@
       Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
       {bool verbose});
 
+  /// Returns `true` if [computeClassData] is supported.
+  bool get computesClassData => false;
+
   /// Function that computes a data mapping for [cls].
   ///
   /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
   /// for the data origin.
   void computeClassData(
       Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
-      {bool verbose});
+      {bool verbose}) {}
 }
 
 const String stopAfterTypeInference = 'stopAfterTypeInference';
@@ -137,17 +127,14 @@
 /// [entryPoint] and [memorySourceFiles].
 ///
 /// Actual data is computed using [computeMemberData].
-Future<CompiledData> computeData(
-    Uri entryPoint,
-    Map<String, String> memorySourceFiles,
-    ComputeMemberDataFunction computeMemberData,
+Future<CompiledData> computeData(Uri entryPoint,
+    Map<String, String> memorySourceFiles, DataComputer dataComputer,
     {List<String> options: const <String>[],
     bool verbose: false,
     bool testFrontend: false,
     bool forUserLibrariesOnly: true,
     bool skipUnprocessedMembers: false,
     bool skipFailedCompilations: false,
-    ComputeClassDataFunction computeClassData,
     Iterable<Id> globalIds: const <Id>[]}) async {
   CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
@@ -199,14 +186,15 @@
         return;
       }
     }
-    computeMemberData(compiler, member, actualMap, verbose: verbose);
+    dataComputer.computeMemberData(compiler, member, actualMap,
+        verbose: verbose);
   }
 
   void processClass(ClassEntity cls, Map<Id, ActualData> actualMap) {
     if (skipUnprocessedMembers && !closedWorld.isImplemented(cls)) {
       return;
     }
-    computeClassData(compiler, cls, actualMap, verbose: verbose);
+    dataComputer.computeClassData(compiler, cls, actualMap, verbose: verbose);
   }
 
   bool excludeLibrary(LibraryEntity library) {
@@ -215,7 +203,7 @@
             library.canonicalUri.scheme == 'package');
   }
 
-  if (computeClassData != null) {
+  if (dataComputer.computesClassData) {
     for (LibraryEntity library in elementEnvironment.libraries) {
       if (excludeLibrary(library)) continue;
       elementEnvironment.forEachClass(library, (ClassEntity cls) {
@@ -280,7 +268,7 @@
       }
       processMember(member, globalData);
     } else if (id is ClassId) {
-      if (computeClassData != null) {
+      if (dataComputer.computesClassData) {
         ClassEntity cls = getGlobalClass(id.className);
         processClass(cls, globalData);
       }
@@ -500,8 +488,7 @@
 /// [setUpFunction] is called once for every test that is executed.
 /// If [forUserSourceFilesOnly] is true, we examine the elements in the main
 /// file and any supporting libraries.
-Future checkTests(
-    Directory dataDir, ComputeMemberDataFunction computeFromKernel,
+Future checkTests(Directory dataDir, DataComputer dataComputer,
     {bool testStrongMode: true,
     List<String> skipForKernel: const <String>[],
     List<String> skipForStrong: const <String>[],
@@ -512,11 +499,12 @@
     bool testFrontend: false,
     bool forUserLibrariesOnly: true,
     Callback setUpFunction,
-    ComputeClassDataFunction computeClassDataFromKernel,
     int shards: 1,
     int shardIndex: 0,
     bool testOmit: false,
     void onTest(Uri uri)}) async {
+  dataComputer.setup();
+
   args = args.toList();
   bool verbose = args.remove('-v');
   bool shouldContinue = args.remove('-c');
@@ -616,8 +604,7 @@
       }
       MemberAnnotations<IdValue> annotations = expectedMaps[kernelMarker];
       CompiledData compiledData2 = await computeData(
-          entryPoint, memorySourceFiles, computeFromKernel,
-          computeClassData: computeClassDataFromKernel,
+          entryPoint, memorySourceFiles, dataComputer,
           options: options,
           verbose: verbose,
           testFrontend: testFrontend,
@@ -641,8 +628,7 @@
         }
         MemberAnnotations<IdValue> annotations = expectedMaps[strongMarker];
         CompiledData compiledData2 = await computeData(
-            entryPoint, memorySourceFiles, computeFromKernel,
-            computeClassData: computeClassDataFromKernel,
+            entryPoint, memorySourceFiles, dataComputer,
             options: options,
             verbose: verbose,
             testFrontend: testFrontend,
@@ -668,8 +654,7 @@
         ]..addAll(testOptions);
         MemberAnnotations<IdValue> annotations = expectedMaps[omitMarker];
         CompiledData compiledData2 = await computeData(
-            entryPoint, memorySourceFiles, computeFromKernel,
-            computeClassData: computeClassDataFromKernel,
+            entryPoint, memorySourceFiles, dataComputer,
             options: options,
             verbose: verbose,
             testFrontend: testFrontend,
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index b42f560..1db6c07 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -25,10 +25,10 @@
   return argParser;
 }
 
-show(ArgResults argResults, ComputeMemberDataFunction computeKernelData,
-    {ComputeClassDataFunction computeKernelClassData,
-    bool testFrontend: false,
-    List<String> options: const <String>[]}) async {
+show(ArgResults argResults, DataComputer dataComputer,
+    {bool testFrontend: false, List<String> options: const <String>[]}) async {
+  dataComputer.setup();
+
   if (argResults.wasParsed('colors')) {
     useColors = argResults['colors'];
   }
@@ -58,8 +58,7 @@
   if (omitImplicitChecks) {
     options.add(Flags.omitImplicitChecks);
   }
-  CompiledData data = await computeData(entryPoint, const {}, computeKernelData,
-      computeClassData: computeKernelClassData,
+  CompiledData data = await computeData(entryPoint, const {}, dataComputer,
       options: options,
       testFrontend: testFrontend,
       forUserLibrariesOnly: false,
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index aaef4ea..4d29bc9 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
@@ -24,8 +24,8 @@
 
 main() {
   asyncTest(() async {
-    var env = await TypeEnvironment
-        .create(createTypedefs(existentialTypeData, additionalData: """
+    var env = await TypeEnvironment.create(
+        createTypedefs(existentialTypeData, additionalData: """
     class C1 {}
     class C2 {}
     class C3<T> {
@@ -39,7 +39,22 @@
     }
     void F11<Q extends C3<Q>>(Q q) {}
     void F12<P extends C3<P>>(P p) {}
-  """), options: [Flags.strongMode]);
+
+    main() {
+      ${createUses(existentialTypeData)}
+      
+      new C1();
+      new C2();
+      new C3.fact();
+      new C4();
+      
+      F9(null, null);
+      F10();
+      F11(null);
+      F12(null);
+    }
+    """),
+        options: [Flags.strongMode]);
 
     testToString(FunctionType type, String expectedToString) {
       Expect.equals(expectedToString, type.toString());
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index 3d90b38..ae12d71 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
@@ -25,6 +25,11 @@
     TypeEnvironment env = await TypeEnvironment.create("""
       ${createTypedefs(signatures, prefix: 't')}
       ${createMethods(signatures, prefix: 'm')}
+
+    main() {
+      ${createUses(signatures, prefix: 't')}
+      ${createUses(signatures, prefix: 'm')}
+    }
     """, options: [Flags.strongMode]);
 
     for (FunctionTypeData data in signatures) {
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index dcf0e1d..76a1b43 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -17,10 +17,9 @@
 import '../equivalence/id_equivalence_helper.dart';
 
 main(List<String> args) {
-  ImpactCacheDeleter.retainCachesForTesting = true;
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeMemberImpact,
+    await checkTests(dataDir, const ImpactDataComputer(),
         args: args, skipForStrong: ['fallthrough.dart'], testFrontend: true);
   });
 }
@@ -33,45 +32,52 @@
   static const String runtimeTypeUse = 'runtimeType';
 }
 
-/// Compute type inference data for [member] from kernel based inference.
-///
-/// Fills [actualMap] with the data.
-void computeMemberImpact(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
-  WorldImpact impact = compiler.impactCache[member];
-  MemberDefinition definition =
-      frontendStrategy.elementMap.getMemberDefinition(member);
-  Features features = new Features();
-  if (impact.typeUses.length > 50) {
-    features.addElement(Tags.typeUse, '*');
-  } else {
-    for (TypeUse use in impact.typeUses) {
-      features.addElement(Tags.typeUse, use.shortText);
+class ImpactDataComputer extends DataComputer {
+  const ImpactDataComputer();
+
+  @override
+  void setup() {
+    ImpactCacheDeleter.retainCachesForTesting = true;
+  }
+
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
+    WorldImpact impact = compiler.impactCache[member];
+    MemberDefinition definition =
+        frontendStrategy.elementMap.getMemberDefinition(member);
+    Features features = new Features();
+    if (impact.typeUses.length > 50) {
+      features.addElement(Tags.typeUse, '*');
+    } else {
+      for (TypeUse use in impact.typeUses) {
+        features.addElement(Tags.typeUse, use.shortText);
+      }
     }
-  }
-  if (impact.staticUses.length > 50) {
-    features.addElement(Tags.staticUse, '*');
-  } else {
-    for (StaticUse use in impact.staticUses) {
-      features.addElement(Tags.staticUse, use.shortText);
+    if (impact.staticUses.length > 50) {
+      features.addElement(Tags.staticUse, '*');
+    } else {
+      for (StaticUse use in impact.staticUses) {
+        features.addElement(Tags.staticUse, use.shortText);
+      }
     }
-  }
-  for (DynamicUse use in impact.dynamicUses) {
-    features.addElement(Tags.dynamicUse, use.shortText);
-  }
-  for (ConstantUse use in impact.constantUses) {
-    features.addElement(Tags.constantUse, use.shortText);
-  }
-  if (impact is TransformedWorldImpact &&
-      impact.worldImpact is ResolutionImpact) {
-    ResolutionImpact resolutionImpact = impact.worldImpact;
-    for (RuntimeTypeUse use in resolutionImpact.runtimeTypeUses) {
-      features.addElement(Tags.runtimeTypeUse, use.shortText);
+    for (DynamicUse use in impact.dynamicUses) {
+      features.addElement(Tags.dynamicUse, use.shortText);
     }
+    for (ConstantUse use in impact.constantUses) {
+      features.addElement(Tags.constantUse, use.shortText);
+    }
+    if (impact is TransformedWorldImpact &&
+        impact.worldImpact is ResolutionImpact) {
+      ResolutionImpact resolutionImpact = impact.worldImpact;
+      for (RuntimeTypeUse use in resolutionImpact.runtimeTypeUses) {
+        features.addElement(Tags.runtimeTypeUse, use.shortText);
+      }
+    }
+    Id id = computeEntityId(definition.node);
+    actualMap[id] = new ActualData(new IdValue(id, features.getText()),
+        computeSourceSpanFromTreeNode(definition.node), member);
   }
-  Id id = computeEntityId(definition.node);
-  actualMap[id] = new ActualData(new IdValue(id, features.getText()),
-      computeSourceSpanFromTreeNode(definition.node), member);
 }
diff --git a/tests/compiler/dart2js/in_user_code_test.dart b/tests/compiler/dart2js/in_user_code_test.dart
index bc75652..82c080f 100644
--- a/tests/compiler/dart2js/in_user_code_test.dart
+++ b/tests/compiler/dart2js/in_user_code_test.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart' show Compiler;
 import 'memory_compiler.dart';
 
@@ -31,6 +30,8 @@
 
 import 'package:sup/boz.dart';
 import 'baz.dart';
+
+main() {}
 """,
   'pkg/sub/baz.dart': """
 library sub.baz;
@@ -44,12 +45,11 @@
 """
 };
 
-Future test(List<Uri> entryPoints, Map<String, bool> expectedResults) async {
-  print("Test: $entryPoints");
+Future test(Uri entryPoint, Map<String, bool> expectedResults) async {
+  print("Test: $entryPoint");
   CompilationResult result = await runCompiler(
-      entryPoints: entryPoints,
+      entryPoint: entryPoint,
       memorySourceFiles: SOURCE,
-      options: [Flags.analyzeOnly, Flags.analyzeAll],
       packageConfig: Uri.parse('memory:.packages'));
   Compiler compiler = result.compiler;
   expectedResults.forEach((String uri, bool expectedResult) {
@@ -69,9 +69,7 @@
 }
 
 Future runTests() async {
-  await test([
-    Uri.parse('memory:main.dart')
-  ], {
+  await test(Uri.parse('memory:main.dart'), {
     'memory:main.dart': true,
     'memory:foo.dart': true,
     'memory:pkg/sub/bar.dart': true,
@@ -82,35 +80,10 @@
     'dart:core': false,
     'dart:async': false
   });
-  // TODO(sigmund): compiler with CFE doesn't work when given sdk libraries as
-  // entrypoints (Issue XYZ).
-  //await test(
-  //    [Uri.parse('dart:async')], {'dart:core': true, 'dart:async': true});
-  await test([
-    Uri.parse('package:sub/bar.dart')
-  ], {
+  await test(Uri.parse('package:sub/bar.dart'), {
     'package:sub/bar.dart': true,
     'package:sub/baz.dart': true,
     'package:sup/boz.dart': false,
     'dart:core': false
   });
-  await test([
-    Uri.parse('package:sub/bar.dart'),
-    Uri.parse('package:sup/boz.dart')
-  ], {
-    'package:sub/bar.dart': true,
-    'package:sub/baz.dart': true,
-    'package:sup/boz.dart': true,
-    'dart:core': false
-  });
-  //await test([
-  //  Uri.parse('dart:async'),
-  //  Uri.parse('package:sub/bar.dart')
-  //], {
-  //  'package:sub/bar.dart': true,
-  //  'package:sub/baz.dart': true,
-  //  'package:sup/boz.dart': false,
-  //  'dart:core': true,
-  //  'dart:async': true
-  //});
 }
diff --git a/tests/compiler/dart2js/inference/callers_test.dart b/tests/compiler/dart2js/inference/callers_test.dart
index 60bc82f..edaaedb 100644
--- a/tests/compiler/dart2js/inference/callers_test.dart
+++ b/tests/compiler/dart2js/inference/callers_test.dart
@@ -18,17 +18,48 @@
 import '../equivalence/id_equivalence_helper.dart';
 
 main(List<String> args) {
-  InferrerEngineImpl.retainDataForTesting = true;
   asyncTest(() async {
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('callers'));
-    await checkTests(dataDir, computeMemberIrCallers,
+    await checkTests(dataDir, const CallersDataComputer(),
         args: args, options: [stopAfterTypeInference]);
   });
 }
 
-abstract class ComputeValueMixin<T> {
-  TypeGraphInferrer get inferrer;
+class CallersDataComputer extends DataComputer {
+  const CallersDataComputer();
+
+  @override
+  void setup() {
+    InferrerEngineImpl.retainDataForTesting = true;
+  }
+
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new CallersIrComputer(
+            compiler.reporter,
+            actualMap,
+            elementMap,
+            compiler.globalInference.typesInferrerInternal,
+            backendStrategy.closureDataLookup)
+        .run(definition.node);
+  }
+}
+
+/// AST visitor for computing side effects data for a member.
+class CallersIrComputer extends IrDataExtractor {
+  final TypeGraphInferrer inferrer;
+  final KernelToElementMapForBuilding _elementMap;
+  final ClosureDataLookup _closureDataLookup;
+
+  CallersIrComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
+      this._elementMap, this.inferrer, this._closureDataLookup)
+      : super(reporter, actualMap);
 
   String getMemberValue(MemberEntity member) {
     Iterable<MemberEntity> callers = inferrer.getCallersOfForTesting(member);
@@ -50,36 +81,6 @@
     }
     return null;
   }
-}
-
-/// Compute callers data for [member] from kernel based inference.
-///
-/// Fills [actualMap] with the data.
-void computeMemberIrCallers(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new CallersIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          compiler.globalInference.typesInferrerInternal,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
-      .run(definition.node);
-}
-
-/// AST visitor for computing side effects data for a member.
-class CallersIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
-  final TypeGraphInferrer inferrer;
-  final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
-
-  CallersIrComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
-      this._elementMap, this.inferrer, this._closureDataLookup)
-      : super(reporter, actualMap);
 
   @override
   String computeMemberValue(Id id, ir.Member node) {
diff --git a/tests/compiler/dart2js/inference/data/narrowing.dart b/tests/compiler/dart2js/inference/data/narrowing.dart
new file mode 100644
index 0000000..4ab579c
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/narrowing.dart
@@ -0,0 +1,120 @@
+// 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.
+
+/// Regression test for Issue #33761: is-checks and null-checks were assumed to
+/// be true even in nested non-condition contexts.
+
+/*element: argIsNonNull1:[null]*/
+argIsNonNull1(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull1:[null]*/
+void nonNull1() {
+  var x = 1;
+  if (x == null) return;
+  argIsNonNull1(x);
+}
+
+/*element: argIsNonNull2:[null]*/
+argIsNonNull2(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull2:[null]*/
+void nonNull2() {
+  var x = 1;
+  if ((x == null) /*invoke: [exact=JSBool]*/ == true) return;
+  argIsNonNull2(x);
+}
+
+/*element: argIsNonNull3:[null]*/
+argIsNonNull3(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull3:[null]*/
+void nonNull3() {
+  var x = 1;
+  if ((x == null) /*invoke: [exact=JSBool]*/ != false) return;
+  argIsNonNull3(x);
+}
+
+/*element: argIsNonNull4:[null]*/
+argIsNonNull4(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: discard:Value([exact=JSBool], value: false)*/
+discard(/*[exact=JSBool]*/ x) => false;
+
+/*element: nonNull4:[null]*/
+void nonNull4() {
+  var x = 1;
+  if (discard(x != null)) return;
+  argIsNonNull4(x);
+}
+
+/*element: argIsNonNull5:[null]*/
+argIsNonNull5(/*[null|exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull5:[null]*/
+void nonNull5() {
+  var x = 1;
+  if (x != null ? false : false) return;
+  argIsNonNull5(x);
+}
+
+/*element: argIsNonNull6:[null]*/
+argIsNonNull6(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull6:[null]*/
+void nonNull6() {
+  var x = 1;
+  if ((/*[exact=JSBool]*/ (/*[exact=JSBool]*/ y) => y && false)(x != null))
+    return;
+  argIsNonNull6(x);
+}
+
+/*element: argIsNonNull7:[null]*/
+argIsNonNull7(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull7:[null]*/
+void nonNull7() {
+  var f = false;
+  var x = 1;
+  if (f ? (throw x != null) : false) return;
+  argIsNonNull7(x);
+}
+
+/*element: argIsNonNull8:[null]*/
+argIsNonNull8(/*[exact=JSUInt31]*/ x) {
+  print('>> is null: ${x == null}');
+}
+
+/*element: nonNull8:[null]*/
+void nonNull8() {
+  var f = false;
+  var x = 1;
+  if (f ?? (x != null)) return;
+  argIsNonNull8(x);
+}
+
+/*element: main:[null]*/
+void main() {
+  nonNull1();
+  nonNull2();
+  nonNull3();
+  nonNull4();
+  nonNull5();
+  nonNull6();
+  nonNull7();
+  nonNull8();
+}
diff --git a/tests/compiler/dart2js/inference/data/non_null.dart b/tests/compiler/dart2js/inference/data/non_null.dart
new file mode 100644
index 0000000..da87bbe
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/non_null.dart
@@ -0,0 +1,52 @@
+// 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.
+
+/*element: main:[null]*/
+main() {
+  nonNullStaticField();
+  nonNullInstanceField1();
+  nonNullInstanceField2();
+  nonNullLocal();
+}
+
+/*element: staticField:[null|exact=JSUInt31]*/
+var staticField;
+
+/*element: nonNullStaticField:[exact=JSUInt31]*/
+nonNullStaticField() => staticField ??= 42;
+
+/*element: Class1.:[exact=Class1]*/
+class Class1 {
+  /*element: Class1.field:[null|exact=JSUInt31]*/
+  var field;
+}
+
+/*element: nonNullInstanceField1:[exact=JSUInt31]*/
+nonNullInstanceField1() {
+  return new Class1(). /*[exact=Class1]*/ /*update: [exact=Class1]*/ field ??=
+      42;
+}
+
+/*element: Class2.:[exact=Class2]*/
+class Class2 {
+  /*element: Class2.field:[null|exact=JSUInt31]*/
+  var field;
+
+  /*element: Class2.method:[exact=JSUInt31]*/
+  method() {
+    return /*[exact=Class2]*/ /*update: [exact=Class2]*/ field ??= 42;
+  }
+}
+
+/*element: nonNullInstanceField2:[exact=JSUInt31]*/
+nonNullInstanceField2() {
+  return new Class2(). /*invoke: [exact=Class2]*/ method();
+}
+
+// TODO(johnniwinther): We should infer that the returned value cannot be null.
+/*element: nonNullLocal:[null|exact=JSUInt31]*/
+nonNullLocal() {
+  var local = null;
+  return local ??= 42;
+}
diff --git a/tests/compiler/dart2js/inference/data/type_literal.dart b/tests/compiler/dart2js/inference/data/type_literal.dart
new file mode 100644
index 0000000..b0d8246
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/type_literal.dart
@@ -0,0 +1,25 @@
+// 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.
+
+/*element: main:[null]*/
+main() {
+  typeLiteral();
+  typeLiteralToString();
+  typeLiteralSubstring();
+}
+
+/*element: typeLiteral:[exact=TypeImpl]*/
+typeLiteral() => Object;
+
+/*kernel.element: typeLiteralToString:[null|subclass=Object]*/
+/*strong.element: typeLiteralToString:[exact=JSString]*/
+typeLiteralToString() => (Object). /*invoke: [exact=TypeImpl]*/ toString();
+
+/*element: typeLiteralSubstring:[exact=JSString]*/
+typeLiteralSubstring() {
+  String name = (List). /*invoke: [exact=TypeImpl]*/ toString();
+  name = name. /*strong.invoke: [exact=JSString]*/ substring(
+      0, name. /*strong.invoke: [exact=JSString]*/ indexOf('<'));
+  return name;
+}
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index ac4a410..436126a 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -21,7 +21,7 @@
   asyncTest(() async {
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('inference_data'));
-    await checkTests(dataDir, computeMemberIrInferredData,
+    await checkTests(dataDir, const InferenceDataComputer(),
         args: args, options: [stopAfterTypeInference]);
   });
 }
@@ -32,8 +32,45 @@
   static const String cannotThrow = 'no-throw';
 }
 
-abstract class ComputeValueMixin<T> {
-  InferredData get inferredData;
+class InferenceDataComputer extends DataComputer {
+  const InferenceDataComputer();
+
+  /// Compute side effects data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new InferredDataIrComputer(
+            compiler.reporter,
+            actualMap,
+            elementMap,
+            compiler.backendClosedWorldForTesting,
+            backendStrategy.closureDataLookup,
+            compiler.globalInference.resultsForTesting.inferredData)
+        .run(definition.node);
+  }
+}
+
+/// AST visitor for computing side effects data for a member.
+class InferredDataIrComputer extends IrDataExtractor {
+  final JClosedWorld closedWorld;
+  final KernelToElementMapForBuilding _elementMap;
+  final ClosureDataLookup _closureDataLookup;
+  final InferredData inferredData;
+
+  InferredDataIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData> actualMap,
+      this._elementMap,
+      this.closedWorld,
+      this._closureDataLookup,
+      this.inferredData)
+      : super(reporter, actualMap);
 
   String getMemberValue(MemberEntity member) {
     Features features = new Features();
@@ -50,43 +87,6 @@
     }
     return features.getText();
   }
-}
-
-/// Compute side effects data for [member] from kernel based inference.
-///
-/// Fills [actualMap] with the data.
-void computeMemberIrInferredData(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new InferredDataIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          compiler.backendClosedWorldForTesting,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>,
-          compiler.globalInference.inferredData)
-      .run(definition.node);
-}
-
-/// AST visitor for computing side effects data for a member.
-class InferredDataIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
-  final JClosedWorld closedWorld;
-  final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
-  final InferredData inferredData;
-
-  InferredDataIrComputer(
-      DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
-      this._elementMap,
-      this.closedWorld,
-      this._closureDataLookup,
-      this.inferredData)
-      : super(reporter, actualMap);
 
   @override
   String computeMemberValue(Id id, ir.Member node) {
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index 4788158..43d222a 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -44,7 +44,7 @@
 runTests(List<String> args, [int shardIndex]) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeMemberIrTypeMasks,
+    await checkTests(dataDir, const TypeMaskDataComputer(),
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
         forUserLibrariesOnly: true,
         args: args,
@@ -58,11 +58,53 @@
   });
 }
 
-abstract class ComputeValueMixin<T> {
-  GlobalTypeInferenceResults<T> get results;
+class TypeMaskDataComputer extends DataComputer {
+  const TypeMaskDataComputer();
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new TypeMaskIrComputer(
+            compiler.reporter,
+            actualMap,
+            elementMap,
+            member,
+            localsMap.getLocalsMap(member),
+            compiler.globalInference.resultsForTesting,
+            backendStrategy.closureDataLookup)
+        .run(definition.node);
+  }
+}
+
+/// IR visitor for computing inference data for a member.
+class TypeMaskIrComputer extends IrDataExtractor {
+  final GlobalTypeInferenceResults results;
+  GlobalTypeInferenceElementResult result;
+  final KernelToElementMapForBuilding _elementMap;
+  final KernelToLocalsMap _localsMap;
+  final ClosureDataLookup _closureDataLookup;
+
+  TypeMaskIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this._localsMap,
+      this.results,
+      this._closureDataLookup)
+      : result = results.resultOfMember(member),
+        super(reporter, actualMap);
 
   String getMemberValue(MemberEntity member) {
-    GlobalTypeInferenceMemberResult<T> memberResult =
+    GlobalTypeInferenceMemberResult memberResult =
         results.resultOfMember(member);
     if (member.isFunction || member.isConstructor || member.isGetter) {
       return getTypeMaskValue(memberResult.returnType);
@@ -78,7 +120,7 @@
   }
 
   String getParameterValue(Local parameter) {
-    GlobalTypeInferenceParameterResult<T> elementResult =
+    GlobalTypeInferenceParameterResult elementResult =
         results.resultOfParameter(parameter);
     return getTypeMaskValue(elementResult.type);
   }
@@ -86,52 +128,10 @@
   String getTypeMaskValue(TypeMask typeMask) {
     return typeMask != null ? '$typeMask' : null;
   }
-}
-
-/// Compute type inference data for [member] from kernel based inference.
-///
-/// Fills [actualMap] with the data.
-void computeMemberIrTypeMasks(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new TypeMaskIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          member,
-          localsMap.getLocalsMap(member),
-          compiler.globalInference.results,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
-      .run(definition.node);
-}
-
-/// IR visitor for computing inference data for a member.
-class TypeMaskIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
-  final GlobalTypeInferenceResults<ir.Node> results;
-  GlobalTypeInferenceElementResult<ir.Node> result;
-  final KernelToElementMapForBuilding _elementMap;
-  final KernelToLocalsMap _localsMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
-
-  TypeMaskIrComputer(
-      DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
-      this._elementMap,
-      MemberEntity member,
-      this._localsMap,
-      this.results,
-      this._closureDataLookup)
-      : result = results.resultOfMember(member),
-        super(reporter, actualMap);
 
   @override
   visitFunctionExpression(ir.FunctionExpression node) {
-    GlobalTypeInferenceElementResult<ir.Node> oldResult = result;
+    GlobalTypeInferenceElementResult oldResult = result;
     ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
     result = results.resultOfMember(info.callMethod);
     super.visitFunctionExpression(node);
@@ -140,7 +140,7 @@
 
   @override
   visitFunctionDeclaration(ir.FunctionDeclaration node) {
-    GlobalTypeInferenceElementResult<ir.Node> oldResult = result;
+    GlobalTypeInferenceElementResult oldResult = result;
     ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
     result = results.resultOfMember(info.callMethod);
     super.visitFunctionDeclaration(node);
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index df01c26..0bcafc9 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -60,7 +60,7 @@
   MemberDefinition definition =
       backendStrategy.elementMap.getMemberDefinition(loadDeferredLibrary);
   ir.Procedure procedure = definition.node;
-  typeMask = compiler.globalInference.results
+  typeMask = compiler.globalInference.resultsForTesting
       .resultOfParameter(localsMap
           .getLocalVariable(procedure.function.positionalParameters.first))
       .type;
diff --git a/tests/compiler/dart2js/inference/show.dart b/tests/compiler/dart2js/inference/show.dart
index 0602a54..d6ff3d4 100644
--- a/tests/compiler/dart2js/inference/show.dart
+++ b/tests/compiler/dart2js/inference/show.dart
@@ -5,7 +5,6 @@
 /// Helper program that shows the inferrer data on a dart program.
 
 import 'package:args/args.dart';
-import 'package:compiler/src/inferrer/inferrer_engine.dart';
 import '../equivalence/id_equivalence_helper.dart';
 import '../equivalence/show_helper.dart';
 import 'inference_test_helper.dart';
@@ -19,16 +18,14 @@
   argParser.addFlag('callers', defaultsTo: false);
   ArgResults results = argParser.parse(args);
 
-  ComputeMemberDataFunction kernelFunction;
+  DataComputer dataComputer;
   if (results['side-effects']) {
-    kernelFunction = computeMemberIrSideEffects;
+    dataComputer = const SideEffectsDataComputer();
   }
   if (results['callers']) {
-    InferrerEngineImpl.retainDataForTesting = true;
-    kernelFunction = computeMemberIrCallers;
+    dataComputer = const CallersDataComputer();
   } else {
-    InferrerEngineImpl.useSorterForTesting = true;
-    kernelFunction = computeMemberIrTypeMasks;
+    dataComputer = const TypeMaskDataComputer();
   }
-  await show(results, kernelFunction, options: [/*stopAfterTypeInference*/]);
+  await show(results, dataComputer, options: [/*stopAfterTypeInference*/]);
 }
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index 3920656..d97b477 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -21,49 +21,42 @@
   asyncTest(() async {
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('side_effects'));
-    await checkTests(dataDir, computeMemberIrSideEffects,
+    await checkTests(dataDir, const SideEffectsDataComputer(),
         args: args,
         options: [stopAfterTypeInference],
         skipForStrong: ['closure_call.dart']);
   });
 }
 
-abstract class ComputeValueMixin<T> {
-  InferredData get inferredData;
+class SideEffectsDataComputer extends DataComputer {
+  const SideEffectsDataComputer();
 
-  String getMemberValue(MemberEntity member) {
-    if (member is FunctionEntity) {
-      return inferredData.getSideEffectsOfElement(member).toString();
-    }
-    return null;
+  /// Compute side effects data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new SideEffectsIrComputer(
+            compiler.reporter,
+            actualMap,
+            elementMap,
+            compiler.backendClosedWorldForTesting,
+            backendStrategy.closureDataLookup,
+            compiler.globalInference.resultsForTesting.inferredData)
+        .run(definition.node);
   }
 }
 
-/// Compute side effects data for [member] from kernel based inference.
-///
-/// Fills [actualMap] with the data.
-void computeMemberIrSideEffects(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new SideEffectsIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          compiler.backendClosedWorldForTesting,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>,
-          compiler.globalInference.inferredData)
-      .run(definition.node);
-}
-
 /// AST visitor for computing side effects data for a member.
-class SideEffectsIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
+class SideEffectsIrComputer extends IrDataExtractor {
   final JClosedWorld closedWorld;
   final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final ClosureDataLookup _closureDataLookup;
   final InferredData inferredData;
 
   SideEffectsIrComputer(
@@ -75,6 +68,13 @@
       this.inferredData)
       : super(reporter, actualMap);
 
+  String getMemberValue(MemberEntity member) {
+    if (member is FunctionEntity) {
+      return inferredData.getSideEffectsOfElement(member).toString();
+    }
+    return null;
+  }
+
   @override
   String computeMemberValue(Id id, ir.Member node) {
     return getMemberValue(_elementMap.getMember(node));
diff --git a/tests/compiler/dart2js/inference/type_mask2_test.dart b/tests/compiler/dart2js/inference/type_mask2_test.dart
index 200f245..4ceb18b 100644
--- a/tests/compiler/dart2js/inference/type_mask2_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask2_test.dart
@@ -97,7 +97,7 @@
       class C extends A {}
       class D implements A {}
       class E extends B implements A {}
-      """, mainSource: r"""
+
       main() {
         new A();
         new B();
@@ -209,30 +209,28 @@
 }
 
 Future testStringSubtypes() async {
-  TypeEnvironment env = await TypeEnvironment.create('',
-      mainSource: r"""
+  TypeEnvironment env = await TypeEnvironment.create(r"""
       main() {
         '' is String;
       }
-      """,
-      testBackendWorld: true);
+      """, testBackendWorld: true);
   JClosedWorld closedWorld = env.jClosedWorld;
 
   ClassEntity Object_ = env.getElement("Object");
   ClassEntity String_ = env.getElement("String");
   ClassEntity JSString = closedWorld.commonElements.jsStringClass;
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(Object_));
-  Expect.isTrue(closedWorld.isIndirectlyInstantiated(Object_));
-  Expect.isTrue(closedWorld.isInstantiated(Object_));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(Object_));
+  Expect.isTrue(closedWorld.classHierarchy.isIndirectlyInstantiated(Object_));
+  Expect.isTrue(closedWorld.classHierarchy.isInstantiated(Object_));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(String_));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(String_));
-  Expect.isFalse(closedWorld.isInstantiated(String_));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(String_));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(String_));
+  Expect.isFalse(closedWorld.classHierarchy.isInstantiated(String_));
 
-  Expect.isTrue(closedWorld.isDirectlyInstantiated(JSString));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(JSString));
-  Expect.isTrue(closedWorld.isInstantiated(JSString));
+  Expect.isTrue(closedWorld.classHierarchy.isDirectlyInstantiated(JSString));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(JSString));
+  Expect.isTrue(closedWorld.classHierarchy.isInstantiated(JSString));
 
   TypeMask subtypeString = new TypeMask.nonNullSubtype(String_, closedWorld);
   TypeMask exactJSString = new TypeMask.nonNullExact(JSString, closedWorld);
diff --git a/tests/compiler/dart2js/inference/union_type_test.dart b/tests/compiler/dart2js/inference/union_type_test.dart
index a34dceb..bec8ae3 100644
--- a/tests/compiler/dart2js/inference/union_type_test.dart
+++ b/tests/compiler/dart2js/inference/union_type_test.dart
@@ -13,7 +13,7 @@
     TypeEnvironment env = await TypeEnvironment.create(r"""
       class A {}
       class B {}
-      """, mainSource: r"""
+
       main() {
         new A();
         new B();
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index 18951fc..8c5d88c 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -20,19 +20,50 @@
 import '../equivalence/id_equivalence_helper.dart';
 
 main(List<String> args) {
-  JavaScriptBackend.cacheCodegenImpactForTesting = true;
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeMemberIrInlinings, args: args);
+    await checkTests(dataDir, const InliningDataComputer(), args: args);
   });
 }
 
-abstract class ComputeValueMixin<T> {
-  JavaScriptBackend get backend;
+class InliningDataComputer extends DataComputer {
+  const InliningDataComputer();
 
-  ConstructorBodyEntity getConstructorBody(ConstructorEntity constructor);
+  @override
+  void setup() {
+    JavaScriptBackend.cacheCodegenImpactForTesting = true;
+  }
 
-  String getTooDifficultReason(MemberEntity member);
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new InliningIrComputer(compiler.reporter, actualMap, elementMap, member,
+            compiler.backend, backendStrategy.closureDataLookup)
+        .run(definition.node);
+  }
+}
+
+/// AST visitor for computing inference data for a member.
+class InliningIrComputer extends IrDataExtractor {
+  final JavaScriptBackend backend;
+  final KernelToElementMapForBuilding _elementMap;
+  final ClosureDataLookup _closureDataLookup;
+
+  InliningIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this.backend,
+      this._closureDataLookup)
+      : super(reporter, actualMap);
 
   String getMemberValue(MemberEntity member) {
     if (member is FunctionEntity) {
@@ -76,49 +107,12 @@
     }
     return null;
   }
-}
-
-/// Compute type inference data for [member] from kernel based inference.
-///
-/// Fills [actualMap] with the data.
-void computeMemberIrInlinings(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new InliningIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          member,
-          compiler.backend,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
-      .run(definition.node);
-}
-
-/// AST visitor for computing inference data for a member.
-class InliningIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
-  final JavaScriptBackend backend;
-  final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
-
-  InliningIrComputer(
-      DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
-      this._elementMap,
-      MemberEntity member,
-      this.backend,
-      this._closureDataLookup)
-      : super(reporter, actualMap);
 
   ConstructorBodyEntity getConstructorBody(ConstructorEntity constructor) {
     return _elementMap
         .getConstructorBody(_elementMap.getMemberDefinition(constructor).node);
   }
 
-  @override
   String getTooDifficultReason(MemberEntity member) {
     if (member is! FunctionEntity) return null;
     return kernel.InlineWeeder.cannotBeInlinedReason(_elementMap, member, null,
diff --git a/tests/compiler/dart2js/inlining/inlining_viewer.dart b/tests/compiler/dart2js/inlining/inlining_viewer.dart
index 9b11031..902deaf 100644
--- a/tests/compiler/dart2js/inlining/inlining_viewer.dart
+++ b/tests/compiler/dart2js/inlining/inlining_viewer.dart
@@ -4,11 +4,9 @@
 
 /// Helper program that shows the inlining data on a dart program.
 
-import 'package:compiler/src/js_backend/backend.dart';
 import '../equivalence/show_helper.dart';
 import 'inlining_test.dart';
 
 main(List<String> args) async {
-  JavaScriptBackend.cacheCodegenImpactForTesting = true;
-  await show(createArgParser().parse(args), computeMemberIrInlinings);
+  await show(createArgParser().parse(args), const InliningDataComputer());
 }
diff --git a/tests/compiler/dart2js/instantiated_classes_test.dart b/tests/compiler/dart2js/instantiated_classes_test.dart
index b51bee2..4289d6f 100644
--- a/tests/compiler/dart2js/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/instantiated_classes_test.dart
@@ -16,13 +16,13 @@
     Future test(String source, List<String> directlyInstantiatedClasses,
         [List<String> newClasses = const <String>["Class"]]) async {
       StringBuffer mainSource = new StringBuffer();
+      mainSource.writeln(source);
       mainSource.write('main() {\n');
       for (String newClass in newClasses) {
         mainSource.write('  new $newClass();\n');
       }
       mainSource.write('}');
-      dynamic env = await TypeEnvironment.create(source,
-          mainSource: mainSource.toString());
+      dynamic env = await TypeEnvironment.create(mainSource.toString());
       LibraryEntity mainLibrary =
           env.compiler.frontendStrategy.elementEnvironment.mainLibrary;
       Iterable<ClassEntity> expectedClasses =
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index cb9cf2c..8233d0b 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -11,6 +11,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/names.dart';
+import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/selector.dart';
 import 'package:compiler/src/world.dart';
 import '../helpers/element_lookup.dart';
@@ -149,16 +150,16 @@
       if (directlyInstantiated.contains(name)) {
         isInstantiated = true;
         Expect.isTrue(
-            world.isDirectlyInstantiated(cls),
+            world.classHierarchy.isDirectlyInstantiated(cls),
             "Expected $name to be directly instantiated in `${mainSource}`:"
-            "\n${world.dump(cls)}");
+            "\n${world.classHierarchy.dump(cls)}");
       }
       if (abstractlyInstantiated.contains(name)) {
         isInstantiated = true;
         Expect.isTrue(
-            world.isAbstractlyInstantiated(cls),
+            world.classHierarchy.isAbstractlyInstantiated(cls),
             "Expected $name to be abstractly instantiated in `${mainSource}`:"
-            "\n${world.dump(cls)}");
+            "\n${world.classHierarchy.dump(cls)}");
         Expect.isTrue(
             world.needsNoSuchMethod(cls, nonExisting, ClassQuery.EXACT),
             "Expected $name to need noSuchMethod for $nonExisting.");
@@ -172,15 +173,15 @@
       if (indirectlyInstantiated.contains(name)) {
         isInstantiated = true;
         Expect.isTrue(
-            world.isIndirectlyInstantiated(cls),
+            world.classHierarchy.isIndirectlyInstantiated(cls),
             "Expected $name to be indirectly instantiated in `${mainSource}`:"
-            "\n${world.dump(cls)}");
+            "\n${world.classHierarchy.dump(cls)}");
       }
       if (!isInstantiated && (name != 'Object' && name != 'Interceptor')) {
         Expect.isFalse(
-            world.isInstantiated(cls),
+            world.classHierarchy.isInstantiated(cls),
             "Expected $name to be uninstantiated in `${mainSource}`:"
-            "\n${world.dump(cls)}");
+            "\n${world.classHierarchy.dump(cls)}");
       }
     }
   }
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index ddc8766..c8e9e12 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_test.dart
@@ -20,26 +20,31 @@
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeKernelJumpsData,
+    await checkTests(dataDir, const JumpDataComputer(),
         options: [Flags.disableTypeInference, stopAfterTypeInference],
         args: args);
   });
 }
 
-/// Compute closure data mapping for [member] as a kernel based element.
-///
-/// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-/// for the data origin.
-void computeKernelJumpsData(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new JumpsIrChecker(
-          compiler.reporter, actualMap, localsMap.getLocalsMap(member))
-      .run(definition.node);
+class JumpDataComputer extends DataComputer {
+  const JumpDataComputer();
+
+  /// Compute closure data mapping for [member] as a kernel based element.
+  ///
+  /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
+  /// for the data origin.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    GlobalLocalsMap localsMap = backendStrategy.globalLocalsMapForTesting;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new JumpsIrChecker(
+            compiler.reporter, actualMap, localsMap.getLocalsMap(member))
+        .run(definition.node);
+  }
 }
 
 class TargetData {
@@ -64,12 +69,17 @@
   String toString() => 'GotoData(id=$id,sourceSpan=$sourceSpan,target=$target)';
 }
 
-abstract class JumpsMixin {
+/// Kernel IR visitor for computing jump data.
+class JumpsIrChecker extends IrDataExtractor {
+  final KernelToLocalsMap _localsMap;
+
   int index = 0;
   Map<JumpTarget, TargetData> targets = <JumpTarget, TargetData>{};
   List<GotoData> gotos = <GotoData>[];
 
-  void registerValue(SourceSpan sourceSpan, Id id, String value, Object object);
+  JumpsIrChecker(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
+      this._localsMap)
+      : super(reporter, actualMap);
 
   void processData() {
     targets.forEach((JumpTarget target, TargetData data) {
@@ -101,15 +111,6 @@
       registerValue(data.sourceSpan, data.id, value, data);
     });
   }
-}
-
-/// Kernel IR visitor for computing jump data.
-class JumpsIrChecker extends IrDataExtractor with JumpsMixin {
-  final KernelToLocalsMap _localsMap;
-
-  JumpsIrChecker(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
-      this._localsMap)
-      : super(reporter, actualMap);
 
   void run(ir.Node root) {
     super.run(root);
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 6564b2b..70b8757 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -83,7 +83,6 @@
 Future<CompilationResult> runCompiler(
     {Map<String, dynamic> memorySourceFiles: const <String, dynamic>{},
     Uri entryPoint,
-    List<Uri> entryPoints,
     CompilerDiagnostics diagnosticHandler,
     CompilerOutput outputProvider,
     List<String> options: const <String>[],
@@ -107,7 +106,6 @@
       packageRoot: packageRoot,
       packageConfig: packageConfig,
       packagesDiscoveryProvider: packagesDiscoveryProvider);
-  compiler.librariesToAnalyzeWhenRun = entryPoints;
   if (beforeRun != null) {
     beforeRun(compiler);
   }
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index f91acf6..da0633f 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -46,7 +46,7 @@
       class E extends C {}
       class F extends C {}
       class G extends C {}
-      """, mainSource: r"""
+
       main() {
         new A();
         new C();
@@ -68,7 +68,7 @@
 
   void checkClass(ClassEntity cls,
       {bool directlyInstantiated: false, bool indirectlyInstantiated: false}) {
-    ClassHierarchyNode node = world.getClassHierarchyNode(cls);
+    ClassHierarchyNode node = world.classHierarchy.getClassHierarchyNode(cls);
     Expect.isNotNull(node, "Expected ClassHierarchyNode for $cls.");
     Expect.equals(
         directlyInstantiated || indirectlyInstantiated,
@@ -139,7 +139,7 @@
   }
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
+          world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
       .iterator;
   checkState(G, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -151,7 +151,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
+          world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(G, currentNode: null, stack: null);
@@ -161,7 +161,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
+          world.classHierarchy.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
       .iterator;
   checkState(C, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -182,7 +182,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
+          world.classHierarchy.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
       .iterator;
   checkState(D, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -194,7 +194,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
+          world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
       .iterator;
   checkState(B, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -209,7 +209,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
+          world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(B, currentNode: null, stack: null);
@@ -222,7 +222,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-      world.getClassHierarchyNode(B),
+      world.classHierarchy.getClassHierarchyNode(B),
       new EnumSet<Instantiation>.fromValues(<Instantiation>[
         Instantiation.DIRECTLY_INSTANTIATED,
         Instantiation.UNINSTANTIATED
@@ -237,7 +237,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
+          world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
       .iterator;
   checkState(A, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -267,7 +267,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
+          world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(A, currentNode: null, stack: null);
@@ -295,7 +295,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-      world.getClassHierarchyNode(A),
+      world.classHierarchy.getClassHierarchyNode(A),
       new EnumSet<Instantiation>.fromValues(<Instantiation>[
         Instantiation.DIRECTLY_INSTANTIATED,
         Instantiation.UNINSTANTIATED
@@ -325,7 +325,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.getClassHierarchyNode(A),
+          world.classHierarchy.getClassHierarchyNode(A),
           new EnumSet<Instantiation>.fromValues(<Instantiation>[
             Instantiation.DIRECTLY_INSTANTIATED,
             Instantiation.UNINSTANTIATED
@@ -374,7 +374,7 @@
       class H extends F {}
       class I extends F {}
       class X {}
-      """, mainSource: r"""
+
       main() {
         new A();
         new C();
@@ -400,7 +400,7 @@
   ClassEntity X = env.getClass("X");
 
   void checkForEachSubclass(ClassEntity cls, List<ClassEntity> expected) {
-    ClassSet classSet = world.getClassSet(cls);
+    ClassSet classSet = world.classHierarchy.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
     classSet.forEachSubclass((cls) {
       visited.add(cls);
@@ -437,7 +437,7 @@
   checkForEachSubclass(X, [X]);
 
   void checkForEachSubtype(ClassEntity cls, List<ClassEntity> expected) {
-    ClassSet classSet = world.getClassSet(cls);
+    ClassSet classSet = world.classHierarchy.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
     classSet.forEachSubtype((cls) {
       visited.add(cls);
@@ -482,7 +482,7 @@
       mask = ClassHierarchyNode.ALL;
     }
 
-    ClassSet classSet = world.getClassSet(cls);
+    ClassSet classSet = world.classHierarchy.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
 
     IterationStep visit(_cls) {
@@ -539,7 +539,7 @@
 
   void checkAny(ClassEntity cls, List<ClassEntity> expected,
       {ClassEntity find, bool expectedResult, bool anySubtype: false}) {
-    ClassSet classSet = world.getClassSet(cls);
+    ClassSet classSet = world.classHierarchy.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
 
     bool visit(cls) {
@@ -593,8 +593,7 @@
       class A {
         call() => null;
       }
-      """,
-      mainSource: r"""
+
       main() {
         new A();
         () {};
@@ -612,12 +611,12 @@
   checkIsFunction(ClassEntity cls, {bool expected: true}) {
     Expect.equals(
         expected,
-        world.isSubtypeOf(cls, functionClass),
+        world.classHierarchy.isSubtypeOf(cls, functionClass),
         "Expected $cls ${expected ? '' : 'not '}to be a subtype "
         "of $functionClass.");
   }
 
   checkIsFunction(A, expected: !strongMode);
 
-  world.forEachStrictSubtypeOf(closureClass, checkIsFunction);
+  world.classHierarchy.forEachStrictSubtypeOf(closureClass, checkIsFunction);
 }
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index 05d5194..5f5fa16 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_test.dart
@@ -16,14 +16,16 @@
   enableDebugMode();
 
   asyncTest(() async {
-    TypeEnvironment env = await TypeEnvironment.create('''
+    TypeEnvironment env = await TypeEnvironment.create("""
     class C {
       final field1;
       final field2;
 
       C(this.field1, this.field2);
     }
-    ''');
+
+    main() => new C(null, null);
+    """);
     ClassEntity C = env.getClass('C');
     InterfaceType C_raw = env.elementEnvironment.getRawType(C);
     FieldEntity field1 = env.elementEnvironment.lookupClassMember(C, 'field1');
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
index 4da2f32..bdee3aa 100644
--- a/tests/compiler/dart2js/model/future_or_test.dart
+++ b/tests/compiler/dart2js/model/future_or_test.dart
@@ -11,7 +11,9 @@
 
 main() {
   asyncTest(() async {
-    var env = await TypeEnvironment.create('''
+    var env = await TypeEnvironment.create("""
+import 'dart:async';
+
 Future<num> futureNum() async => null;
 FutureOr<num> futureOrNum() async => null;
 
@@ -33,7 +35,22 @@
   Future<T> futureT() async => null;
   FutureOr<T> futureOrT() async => null;
 }
-''', options: [Flags.strongMode]);
+
+main() {
+  futureNum();
+  futureOrNum();
+  futureInt();
+  futureOrInt();
+  futureListNum();
+  futureOrListNum();
+  futureFutureNum();
+  futureOrFutureOrNum();
+  futureNull();
+  futureOrNull();
+  new C().futureT();
+  new C().futureOrT();
+}
+""", options: [Flags.strongMode]);
     FunctionType getFunctionType(String name, String expectedType,
         [ClassEntity cls]) {
       FunctionType type = env.getMemberType(name, cls);
diff --git a/tests/compiler/dart2js/model/mixin_typevariable_test.dart b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
index ff9a9ec..5cfca15 100644
--- a/tests/compiler/dart2js/model/mixin_typevariable_test.dart
+++ b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
@@ -26,6 +26,11 @@
 
       class C1<C1_T> extends S<C1_T> with M1<C1_T>, M2<C1_T>, M3<C1_T> {}
       class C2<C2_T> = S<C2_T> with M1<C2_T>, M2<C2_T>, M3<C2_T>;
+
+      main() {
+        new C1();
+        new C2();
+      }
       """, expectNoWarningsOrErrors: true);
   ClassEntity Object = env.getElement('Object');
   ClassEntity S = env.getClass('S');
@@ -89,6 +94,17 @@
 
       class F1<F1_T> extends A<_> with B<_, B<F1_T, _>> {}
       class F2<F2_T> = A<_> with B<_, B<F2_T, _>>;
+
+      main() {
+        new C1();
+        new C2();
+        new D1();
+        new D2();
+        new E1();
+        new E2();
+        new F1();
+        new F2();
+      }
       """, expectNoWarningsOrErrors: true);
   DartType _dynamic = env['dynamic'];
   DartType _ = env['_'];
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index 3f761876..2a98af7 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_test.dart
@@ -59,9 +59,12 @@
       // TODO(johnniwinther): Inheritance with different type arguments is
       // currently not supported by the implementation.
       class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {}
-      """,
-      options:
-          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
+
+      main() {
+        new C();
+      }
+      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -313,9 +316,19 @@
         int m4(V v, U u) => null;
         void m5(V v, int i) => null;
       }
-      """,
-      options:
-          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
+
+      main() {
+        new W();
+        var a = new A();
+        a.call(null, null);
+        a.m1(null, null);
+        a.m2(null, null);
+        a.m3(null, null);
+        a.m4(null, null);
+        a.m5(null, null);
+      }
+      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -363,15 +376,23 @@
 ];
 
 Future testFunctionSubtyping({bool strongMode}) async {
-  await TypeEnvironment
-      .create(createMethods(functionTypesData),
+  await TypeEnvironment.create(
+          createMethods(functionTypesData, additionalData: """
+  main() {
+    ${createUses(functionTypesData)}
+  }
+  """),
           options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then(functionSubtypingHelper);
 }
 
 Future testTypedefSubtyping({bool strongMode}) async {
-  await TypeEnvironment
-      .create(createTypedefs(functionTypesData),
+  await TypeEnvironment.create(
+          createTypedefs(functionTypesData, additionalData: """
+  main() {
+    ${createUses(functionTypesData)}
+  }
+  """),
           options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then(functionSubtypingHelper);
 }
@@ -449,15 +470,23 @@
 ];
 
 Future testFunctionSubtypingOptional({bool strongMode}) async {
-  await TypeEnvironment
-      .create(createMethods(optionalFunctionTypesData),
+  await TypeEnvironment.create(
+          createMethods(optionalFunctionTypesData, additionalData: """
+  main() {
+    ${createUses(optionalFunctionTypesData)}
+  }
+  """),
           options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingOptionalHelper(env, strongMode));
 }
 
 Future testTypedefSubtypingOptional({bool strongMode}) async {
-  await TypeEnvironment
-      .create(createTypedefs(optionalFunctionTypesData),
+  await TypeEnvironment.create(
+          createTypedefs(optionalFunctionTypesData, additionalData: """
+  main() {
+    ${createUses(optionalFunctionTypesData)}
+  }
+  """),
           options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingOptionalHelper(env, strongMode));
 }
@@ -523,15 +552,23 @@
 ];
 
 Future testFunctionSubtypingNamed({bool strongMode}) async {
-  await TypeEnvironment
-      .create(createMethods(namedFunctionTypesData),
+  await TypeEnvironment.create(
+          createMethods(namedFunctionTypesData, additionalData: """
+  main() {
+    ${createUses(namedFunctionTypesData)}
+  }
+  """),
           options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingNamedHelper(env, strongMode));
 }
 
 Future testTypedefSubtypingNamed({bool strongMode}) async {
-  await TypeEnvironment
-      .create(createTypedefs(namedFunctionTypesData),
+  await TypeEnvironment.create(
+          createTypedefs(namedFunctionTypesData, additionalData: """
+  main() {
+    ${createUses(namedFunctionTypesData)}
+  }
+  """),
           options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
       .then((env) => functionSubtypingNamedHelper(env, strongMode));
 }
@@ -584,9 +621,21 @@
       class H<T extends S, S extends T> {}
       class I<T extends S, S extends U, U extends T> {}
       class J<T extends S, S extends U, U extends S> {}
-      """,
-      options:
-          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
+
+      main() {
+        new A();
+        new B();
+        new C();
+        new D();
+        new E<num, int>();
+        new F();
+        new G();
+        new H();
+        new I();
+        new J();
+      }
+      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S,
         {bool expectMoreSpecific}) {
       testTypes(env, T, S, expectSubtype, expectMoreSpecific);
@@ -810,9 +859,21 @@
       takeInt(int o) => null;
       takeVoid(void o) => null;
       takeObject(Object o) => null;
-      """,
-      options:
-          strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2]).then((env) {
+      
+      main() {
+        new ClassWithCall().call;
+        returnNum();
+        returnInt();
+        returnVoid();
+        returnObject();
+        
+        takeNum(null);
+        takeInt(null);
+        takeVoid(null);
+        takeObject(null);
+      }
+      """, options: strongMode ? [Flags.strongMode] : [Flags.noPreviewDart2])
+      .then((env) {
     void expect(bool expectSubtype, DartType T, DartType S) {
       Expect.equals(expectSubtype, env.isSubtype(T, S), '$T <: $S');
       if (expectSubtype) {
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index fd5e963..6b338b0 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -42,7 +42,7 @@
       class G extends C {}
       abstract class H implements C {}
       abstract class I implements H {}
-      """, mainSource: r"""
+
       main() {
         new A().call;
         new C();
@@ -67,7 +67,7 @@
 
   void checkClass(ClassEntity cls, List<ClassEntity> expectedSubtypes,
       {bool checkSubset: false}) {
-    ClassSet node = world.getClassSet(cls);
+    ClassSet node = world.classHierarchy.getClassSet(cls);
     Set<ClassEntity> actualSubtypes = node.subtypes().toSet();
     if (checkSubset) {
       for (ClassEntity subtype in expectedSubtypes) {
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index 2844a00..6aec923 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(johnniwinther): Port this test to be frontend agnostic.
-
 library type_substitution_test;
 
 import 'package:expect/expect.dart';
@@ -50,7 +48,7 @@
       class D<T> extends A<int> {}
       class E<T> extends A<A<T>> {}
       class F<T, U> extends B<F<T, String>> implements A<F<B<U>, int>> {}
-      ''', mainSource: '''
+
       main() {
         new A();
         new B();
@@ -118,6 +116,8 @@
 testTypeSubstitution() async {
   var env = await TypeEnvironment.create(r"""
       class Class<T,S> {}
+
+      main() => new Class();
       """);
   InterfaceType Class_T_S = env["Class"];
   Expect.isNotNull(Class_T_S);
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index 3abdd5d..a4b49ce 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_test.dart
@@ -9,8 +9,9 @@
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/class_set.dart';
-import 'package:compiler/src/world.dart' show ClassQuery, JClosedWorld;
+import 'package:compiler/src/world.dart' show JClosedWorld;
 import '../type_test_helper.dart';
 
 void main() {
@@ -29,6 +30,8 @@
 
 testClassSets() async {
   var env = await TypeEnvironment.create(r"""
+      import 'dart:html' as html;
+
       class A implements X {}
       class B {}
       class C_Super extends A {}
@@ -38,8 +41,7 @@
       class F extends Object with A implements B {}
       class G extends Object with B, A {}
       class X {}
-      """, mainSource: r"""
-      import 'dart:html' as html;
+
       main() {
         new A();
         new B();
@@ -73,7 +75,7 @@
           foundClasses.contains(expectedClass),
           "Expect $expectedClass in '$property' on $cls. "
           "Found:\n ${foundClasses.join('\n ')}\n"
-          "${closedWorld.dump(cls)}");
+          "${closedWorld.classHierarchy.dump(cls)}");
     }
     if (exact) {
       Expect.equals(
@@ -82,7 +84,7 @@
           "Unexpected classes "
           "${foundClasses.where((c) => !expectedClasses.contains(c))} "
           "in '$property' on $cls.\n"
-          "${closedWorld.dump(cls)}");
+          "${closedWorld.classHierarchy.dump(cls)}");
     }
   }
 
@@ -108,32 +110,33 @@
           expectedClasses.length,
           count,
           "Unexpected class count in '$property' on $cls.\n"
-          "${closedWorld.dump(cls)}");
+          "${closedWorld.classHierarchy.dump(cls)}");
     }
   }
 
   void testSubclasses(ClassEntity cls, List<ClassEntity> expectedClasses,
       {bool exact: true}) {
-    check('subclassesOf', cls, closedWorld.subclassesOf(cls), expectedClasses,
+    check('subclassesOf', cls, closedWorld.classHierarchy.subclassesOf(cls),
+        expectedClasses,
         exact: exact);
   }
 
   void testStrictSubclasses(ClassEntity cls, List<ClassEntity> expectedClasses,
       {bool exact: true}) {
-    check('strictSubclassesOf', cls, closedWorld.strictSubclassesOf(cls),
-        expectedClasses,
+    check('strictSubclassesOf', cls,
+        closedWorld.classHierarchy.strictSubclassesOf(cls), expectedClasses,
         exact: exact,
-        forEach: closedWorld.forEachStrictSubclassOf,
-        getCount: closedWorld.strictSubclassCount);
+        forEach: closedWorld.classHierarchy.forEachStrictSubclassOf,
+        getCount: closedWorld.classHierarchy.strictSubclassCount);
   }
 
   void testStrictSubtypes(ClassEntity cls, List<ClassEntity> expectedClasses,
       {bool exact: true}) {
-    check('strictSubtypesOf', cls, closedWorld.strictSubtypesOf(cls),
-        expectedClasses,
+    check('strictSubtypesOf', cls,
+        closedWorld.classHierarchy.strictSubtypesOf(cls), expectedClasses,
         exact: exact,
-        forEach: closedWorld.forEachStrictSubtypeOf,
-        getCount: closedWorld.strictSubtypeCount);
+        forEach: closedWorld.classHierarchy.forEachStrictSubtypeOf,
+        getCount: closedWorld.classHierarchy.strictSubtypeCount);
   }
 
   void testMixinUses(ClassEntity cls, List<ClassEntity> expectedClasses,
@@ -230,7 +233,7 @@
       class H2 extends H1 {}
       class H3 extends H2 implements H {}
       class H4 extends H2 with H {}
-      """, mainSource: r"""
+
       main() {
         new B();
         new C1();
@@ -247,9 +250,13 @@
 
   check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) {
     ClassEntity cls = env.getElement(name);
-    Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls),
+    Expect.equals(
+        hasStrictSubtype,
+        closedWorld.classHierarchy.hasAnyStrictSubtype(cls),
         "Unexpected hasAnyStrictSubtype property on $cls.");
-    Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls),
+    Expect.equals(
+        hasOnlySubclasses,
+        closedWorld.classHierarchy.hasOnlySubclasses(cls),
         "Unexpected hasOnlySubclasses property on $cls.");
   }
 
@@ -309,8 +316,7 @@
 }
 
 testNativeClasses() async {
-  var env = await TypeEnvironment.create('',
-      mainSource: r"""
+  var env = await TypeEnvironment.create(r"""
       import 'dart:html' as html;
       main() {
         html.window; // Creates 'Window'.
@@ -318,8 +324,7 @@
         new html.CanvasElement() // Creates CanvasElement
             ..getContext(''); // Creates CanvasRenderingContext2D
       }
-      """,
-      testBackendWorld: true);
+      """, testBackendWorld: true);
   JClosedWorld closedWorld = env.jClosedWorld;
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   LibraryEntity dart_html = elementEnvironment.lookupLibrary(Uris.dart_html);
@@ -359,26 +364,30 @@
       int instantiatedSubtypeCount,
       List<ClassEntity> subclasses: const <ClassEntity>[],
       List<ClassEntity> subtypes: const <ClassEntity>[]}) {
-    ClassSet classSet = closedWorld.getClassSet(cls);
+    ClassSet classSet = closedWorld.classHierarchy.getClassSet(cls);
     ClassHierarchyNode node = classSet.node;
 
-    String dumpText = '\n${closedWorld.dump(cls)}';
+    String dumpText = '\n${closedWorld.classHierarchy.dump(cls)}';
 
     Expect.equals(
         isDirectlyInstantiated,
-        closedWorld.isDirectlyInstantiated(cls),
+        closedWorld.classHierarchy.isDirectlyInstantiated(cls),
         "Unexpected isDirectlyInstantiated property on $cls.$dumpText");
     Expect.equals(
         isAbstractlyInstantiated,
-        closedWorld.isAbstractlyInstantiated(cls),
+        closedWorld.classHierarchy.isAbstractlyInstantiated(cls),
         "Unexpected isAbstractlyInstantiated property on $cls.$dumpText");
     Expect.equals(
         isIndirectlyInstantiated,
-        closedWorld.isIndirectlyInstantiated(cls),
+        closedWorld.classHierarchy.isIndirectlyInstantiated(cls),
         "Unexpected isIndirectlyInstantiated property on $cls.$dumpText");
-    Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls),
+    Expect.equals(
+        hasStrictSubtype,
+        closedWorld.classHierarchy.hasAnyStrictSubtype(cls),
         "Unexpected hasAnyStrictSubtype property on $cls.$dumpText");
-    Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls),
+    Expect.equals(
+        hasOnlySubclasses,
+        closedWorld.classHierarchy.hasOnlySubclasses(cls),
         "Unexpected hasOnlySubclasses property on $cls.$dumpText");
     Expect.equals(
         lubOfInstantiatedSubclasses,
@@ -398,19 +407,20 @@
     }
     for (ClassEntity other in allClasses) {
       if (other == cls) continue;
-      if (!closedWorld.isExplicitlyInstantiated(other)) continue;
+      if (!closedWorld.classHierarchy.isExplicitlyInstantiated(other)) continue;
       Expect.equals(
           subclasses.contains(other),
-          closedWorld.isSubclassOf(other, cls),
+          closedWorld.classHierarchy.isSubclassOf(other, cls),
           "Unexpected subclass relation between $other and $cls.");
       Expect.equals(
           subtypes.contains(other),
-          closedWorld.isSubtypeOf(other, cls),
+          closedWorld.classHierarchy.isSubtypeOf(other, cls),
           "Unexpected subtype relation between $other and $cls.");
     }
 
     Set<ClassEntity> strictSubclasses = new Set<ClassEntity>();
-    closedWorld.forEachStrictSubclassOf(cls, (ClassEntity other) {
+    closedWorld.classHierarchy.forEachStrictSubclassOf(cls,
+        (ClassEntity other) {
       if (allClasses.contains(other)) {
         strictSubclasses.add(other);
       }
@@ -419,7 +429,7 @@
         "Unexpected strict subclasses of $cls: ${strictSubclasses}.");
 
     Set<ClassEntity> strictSubtypes = new Set<ClassEntity>();
-    closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity other) {
+    closedWorld.classHierarchy.forEachStrictSubtypeOf(cls, (ClassEntity other) {
       if (allClasses.contains(other)) {
         strictSubtypes.add(other);
       }
@@ -519,8 +529,7 @@
 }
 
 testCommonSubclasses() async {
-  var env = await TypeEnvironment.create('',
-      mainSource: r"""
+  var env = await TypeEnvironment.create(r"""
       class A {}
       class B {}
       class C extends A {}
@@ -543,72 +552,138 @@
         new I();
         new J();
       }
-      """,
-      testBackendWorld: true);
+      """, testBackendWorld: true);
   JClosedWorld closedWorld = env.jClosedWorld;
 
   ClassEntity A = env.getElement("A");
   ClassEntity B = env.getElement("B");
   ClassEntity C = env.getElement("C");
-  ClassEntity D = env.getElement("D");
   ClassEntity F = env.getElement("F");
   ClassEntity G = env.getElement("G");
-  ClassEntity H = env.getElement("H");
   ClassEntity I = env.getElement("I");
   ClassEntity J = env.getElement("J");
 
-  void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
-      ClassQuery query2, List<ClassEntity> expectedResult) {
-    Iterable<ClassEntity> result1 =
-        closedWorld.commonSubclasses(cls1, query1, cls2, query2);
-    Iterable<ClassEntity> result2 =
-        closedWorld.commonSubclasses(cls2, query2, cls1, query1);
-    Expect.setEquals(
-        result1,
-        result2,
-        "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
-        "\n a vs b: $result1\n b vs a: $result2");
-    Expect.setEquals(
-        expectedResult,
-        result1,
-        "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
-        "\n expected: $expectedResult\n actual: $result1");
+  ClassQuery toClassQuery(SubclassResultKind kind, ClassEntity cls1,
+      ClassQuery query1, ClassEntity cls2, ClassQuery query2) {
+    switch (kind) {
+      case SubclassResultKind.EMPTY:
+        return null;
+      case SubclassResultKind.EXACT1:
+        return ClassQuery.EXACT;
+      case SubclassResultKind.EXACT2:
+        return ClassQuery.EXACT;
+      case SubclassResultKind.SUBCLASS1:
+        return ClassQuery.SUBCLASS;
+      case SubclassResultKind.SUBCLASS2:
+        return ClassQuery.SUBCLASS;
+      case SubclassResultKind.SUBTYPE1:
+        return ClassQuery.SUBTYPE;
+      case SubclassResultKind.SUBTYPE2:
+        return ClassQuery.SUBTYPE;
+      case SubclassResultKind.SET:
+      default:
+        return null;
+    }
   }
 
-  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT, []);
-  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS, []);
-  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE, []);
-  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS, [C]);
-  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE, [C]);
-  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE, [C, D]);
+  ClassEntity toClassEntity(SubclassResultKind kind, ClassEntity cls1,
+      ClassQuery query1, ClassEntity cls2, ClassQuery query2) {
+    switch (kind) {
+      case SubclassResultKind.EMPTY:
+        return null;
+      case SubclassResultKind.EXACT1:
+        return cls1;
+      case SubclassResultKind.EXACT2:
+        return cls2;
+      case SubclassResultKind.SUBCLASS1:
+        return cls1;
+      case SubclassResultKind.SUBCLASS2:
+        return cls2;
+      case SubclassResultKind.SUBTYPE1:
+        return cls1;
+      case SubclassResultKind.SUBTYPE2:
+        return cls2;
+      case SubclassResultKind.SET:
+      default:
+        return null;
+    }
+  }
 
-  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT, []);
-  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS, []);
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT, []);
-  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE, []);
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT, []);
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS, []);
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE, [G]);
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS, [J]);
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE, [F, G, I, J]);
+  void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
+      ClassQuery query2, SubclassResult expectedResult) {
+    SubclassResult result1 =
+        closedWorld.classHierarchy.commonSubclasses(cls1, query1, cls2, query2);
+    SubclassResult result2 =
+        closedWorld.classHierarchy.commonSubclasses(cls2, query2, cls1, query1);
+    Expect.equals(
+        toClassQuery(result1.kind, cls1, query1, cls2, query2),
+        toClassQuery(result2.kind, cls2, query2, cls1, query1),
+        "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
+        "\n a vs b: $result1\n b vs a: $result2");
+    Expect.equals(
+        toClassEntity(result1.kind, cls1, query1, cls2, query2),
+        toClassEntity(result2.kind, cls2, query2, cls1, query1),
+        "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
+        "\n a vs b: $result1\n b vs a: $result2");
+    Expect.equals(
+        expectedResult.kind,
+        result1.kind,
+        "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
+        "\n expected: $expectedResult\n actual: $result1");
+    if (expectedResult.kind == SubclassResultKind.SET) {
+      Expect.setEquals(
+          result1.classes,
+          result2.classes,
+          "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
+          "\n a vs b: $result1\n b vs a: $result2");
+      Expect.setEquals(
+          expectedResult.classes,
+          result1.classes,
+          "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
+          "\n expected: $expectedResult\n actual: $result1");
+    }
+  }
 
-  check(A, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
-  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
-  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, [G]);
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, [G]);
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G, H]);
+  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT, SubclassResult.EXACT1);
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS, SubclassResult.EXACT1);
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE, SubclassResult.EXACT1);
+  check(
+      A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS, SubclassResult.SUBCLASS1);
+  check(
+      A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE, SubclassResult.SUBCLASS1);
+  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE, SubclassResult.SUBTYPE1);
 
-  check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
-  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
-  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []);
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []);
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]);
+  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS, SubclassResult.EMPTY);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE, SubclassResult.EMPTY);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS, SubclassResult.EMPTY);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE, new SubclassResult([G]));
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS, new SubclassResult([J]));
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE,
+      new SubclassResult([F, G, I, J]));
+
+  check(A, ClassQuery.EXACT, C, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, SubclassResult.EMPTY);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, SubclassResult.EXACT2);
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, SubclassResult.EMPTY);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, SubclassResult.EXACT2);
+  check(
+      A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, SubclassResult.SUBCLASS2);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, new SubclassResult([C]));
+  check(
+      A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, SubclassResult.SUBCLASS2);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, SubclassResult.SUBTYPE2);
+
+  check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, SubclassResult.EMPTY);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, SubclassResult.EMPTY);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, SubclassResult.EMPTY);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, SubclassResult.EMPTY);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, new SubclassResult([]));
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, new SubclassResult([G]));
+  check(
+      B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, new SubclassResult([F, G]));
 }
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 5cd35d2..58babc1 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -9,8 +9,9 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/call_structure.dart';
+import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld, ClassQuery;
+import 'package:compiler/src/world.dart' show JClosedWorld;
 import 'type_test_helper.dart';
 
 void main() {
@@ -40,6 +41,7 @@
 
   Future run(List<String> instantiated) async {
     StringBuffer main = new StringBuffer();
+    main.writeln(CLASSES);
     main.write('main() {');
     for (String cls in instantiated) {
       main.write('new $cls();');
@@ -47,10 +49,8 @@
     main.write('}');
     testMode = '$instantiated';
 
-    var env = await TypeEnvironment.create(CLASSES,
-        mainSource: main.toString(),
-        testBackendWorld: true,
-        options: [Flags.noPreviewDart2]);
+    var env = await TypeEnvironment.create(main.toString(),
+        testBackendWorld: true, options: [Flags.noPreviewDart2]);
     foo = new Selector.call(const PublicName('foo'), CallStructure.NO_ARGS);
     bar = new Selector.call(const PublicName('bar'), CallStructure.NO_ARGS);
     baz = new Selector.call(const PublicName('baz'), CallStructure.NO_ARGS);
@@ -64,7 +64,7 @@
   void check(ClassEntity cls, ClassQuery query, Selector selector,
       bool expectedResult) {
     bool result;
-    if (closedWorld.getClassSet(cls) == null) {
+    if (closedWorld.classHierarchy.getClassSet(cls) == null) {
       // The class isn't live, so it can't need a noSuchMethod for [selector].
       result = false;
     } else {
@@ -79,16 +79,17 @@
 
   await run([]);
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(superclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(superclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(superclass));
+  Expect.isFalse(
+      closedWorld.classHierarchy.isIndirectlyInstantiated(superclass));
   Expect.isFalse(closedWorld.isImplemented(superclass));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(subclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subclass));
   Expect.isFalse(closedWorld.isImplemented(subclass));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(subtype));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subtype));
   Expect.isFalse(closedWorld.isImplemented(subtype));
 
   check(superclass, ClassQuery.EXACT, foo, false);
@@ -123,16 +124,17 @@
 
   await run(['Superclass']);
 
-  Expect.isTrue(closedWorld.isDirectlyInstantiated(superclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(superclass));
+  Expect.isTrue(closedWorld.classHierarchy.isDirectlyInstantiated(superclass));
+  Expect.isFalse(
+      closedWorld.classHierarchy.isIndirectlyInstantiated(superclass));
   Expect.isTrue(closedWorld.isImplemented(superclass));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(subclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subclass));
   Expect.isFalse(closedWorld.isImplemented(subclass));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(subtype));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subtype));
   Expect.isFalse(closedWorld.isImplemented(subtype));
 
   check(superclass, ClassQuery.EXACT, foo, false);
@@ -167,16 +169,17 @@
 
   await run(['Subclass']);
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(superclass));
-  Expect.isTrue(closedWorld.isIndirectlyInstantiated(superclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(superclass));
+  Expect.isTrue(
+      closedWorld.classHierarchy.isIndirectlyInstantiated(superclass));
   Expect.isTrue(closedWorld.isImplemented(superclass));
 
-  Expect.isTrue(closedWorld.isDirectlyInstantiated(subclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subclass));
+  Expect.isTrue(closedWorld.classHierarchy.isDirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subclass));
   Expect.isTrue(closedWorld.isImplemented(subclass));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(subtype));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subtype));
   Expect.isFalse(closedWorld.isImplemented(subtype));
 
   check(superclass, ClassQuery.EXACT, foo, false);
@@ -211,16 +214,17 @@
 
   await run(['Subtype']);
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(superclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(superclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(superclass));
+  Expect.isFalse(
+      closedWorld.classHierarchy.isIndirectlyInstantiated(superclass));
   Expect.isTrue(closedWorld.isImplemented(superclass));
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(subclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subclass));
   Expect.isFalse(closedWorld.isImplemented(subclass));
 
-  Expect.isTrue(closedWorld.isDirectlyInstantiated(subtype));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subtype));
+  Expect.isTrue(closedWorld.classHierarchy.isDirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subtype));
   Expect.isTrue(closedWorld.isImplemented(subtype));
 
   check(superclass, ClassQuery.EXACT, foo, false);
@@ -255,16 +259,17 @@
 
   await run(['Subclass', 'Subtype']);
 
-  Expect.isFalse(closedWorld.isDirectlyInstantiated(superclass));
-  Expect.isTrue(closedWorld.isIndirectlyInstantiated(superclass));
+  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(superclass));
+  Expect.isTrue(
+      closedWorld.classHierarchy.isIndirectlyInstantiated(superclass));
   Expect.isTrue(closedWorld.isImplemented(superclass));
 
-  Expect.isTrue(closedWorld.isDirectlyInstantiated(subclass));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subclass));
+  Expect.isTrue(closedWorld.classHierarchy.isDirectlyInstantiated(subclass));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subclass));
   Expect.isTrue(closedWorld.isImplemented(subclass));
 
-  Expect.isTrue(closedWorld.isDirectlyInstantiated(subtype));
-  Expect.isFalse(closedWorld.isIndirectlyInstantiated(subtype));
+  Expect.isTrue(closedWorld.classHierarchy.isDirectlyInstantiated(subtype));
+  Expect.isFalse(closedWorld.classHierarchy.isIndirectlyInstantiated(subtype));
   Expect.isTrue(closedWorld.isImplemented(subtype));
 
   check(superclass, ClassQuery.EXACT, foo, false);
diff --git a/tests/compiler/dart2js/receiver_type_test.dart b/tests/compiler/dart2js/receiver_type_test.dart
index 50b8fc3..d8ad1ac 100644
--- a/tests/compiler/dart2js/receiver_type_test.dart
+++ b/tests/compiler/dart2js/receiver_type_test.dart
@@ -28,7 +28,7 @@
     class C extends B {
       call() {}
     }
-    """, mainSource: """
+
     main() {
       (new A())();
       new B();
@@ -47,8 +47,8 @@
   JClosedWorld closedWorld = env.jClosedWorld;
   int closureCount = 0;
   Selector callSelector = new Selector.callClosure(0);
-  closedWorld.forEachStrictSubclassOf(closedWorld.commonElements.objectClass,
-      (ClassEntity cls) {
+  closedWorld.classHierarchy.forEachStrictSubclassOf(
+      closedWorld.commonElements.objectClass, (ClassEntity cls) {
     if (cls.library.canonicalUri.scheme != 'memory') return;
 
     TypeMask mask = new TypeMask.nonNullSubclass(cls, closedWorld);
diff --git a/tests/compiler/dart2js/rti/data/indirect_type_literal.dart b/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
new file mode 100644
index 0000000..bd9a39f
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A<T> {}
+
+class B<T extends num> {}
+
+/*class: Indirect:exp,needsArgs*/
+class Indirect<T> {
+  Type get type => T;
+}
+
+void main() {
+  Expect.equals(A, new Indirect<A>().type);
+  Expect.equals(A, new Indirect<A<dynamic>>().type);
+  Expect.notEquals(A, new Indirect<A<num>>().type);
+  Expect.equals(B, new Indirect<B>().type);
+  Expect.equals(B, new Indirect<B<num>>().type);
+  Expect.notEquals(B, new Indirect<B<int>>().type);
+}
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args.dart b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
index 452b820..f4fad6e3 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
@@ -59,8 +59,8 @@
   Expect.isTrue(({Object m, Object l, Object g}) {} is genericsFunc);
 
   Expect.isTrue(({A x, G y, mixFunc z, var v}) {} is dynamicFunc);
-  Expect
-      .isTrue(({int x, bool y, List<Map> z, classesFunc v}) {} is dynamicFunc);
+  Expect.isTrue(
+      ({int x, bool y, List<Map> z, classesFunc v}) {} is dynamicFunc);
 
   Expect.isTrue((
       {okWithClassesFunc_1 f1,
diff --git a/tests/compiler/dart2js/rti/emission/closure_function.dart b/tests/compiler/dart2js/rti/emission/closure_function.dart
index 9b11f64..1874f1a 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function.dart
@@ -10,6 +10,8 @@
 main() {
   test(
       /*kernel.checks=[],functionType,instance*/
-      /*strong.checks=[],instance*/ () {});
+      /*strong.checks=[],instance*/
+      /*omit.checks=[],instance*/
+      () {});
   test(null);
 }
diff --git a/tests/compiler/dart2js/rti/emission/closure_function_type.dart b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
index 22ffd4f..b37395b 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
@@ -9,5 +9,9 @@
 
 main() {
   test(/*checks=[],functionType,instance*/ () {});
-  test(/*checks=[],functionType,instance*/ (a) {});
+  test(
+      /*kernel.checks=[],functionType,instance*/
+      /*strong.checks=[],instance*/
+      /*omit.checks=[],instance*/
+      (a) {});
 }
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
index 6ffe4e3..52b2ec9 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
@@ -13,6 +13,7 @@
     return
         /*kernel.checks=[$signature],instance*/
         /*strong.checks=[],instance*/
+        /*omit.checks=[],instance*/
         (T t, String s) {};
   }
 }
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
new file mode 100644
index 0000000..8f7ce92
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/dynamic_type_literal.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: global#Type:checks=[],instance,typeLiteral*/
+
+import "package:expect/expect.dart";
+
+void main() {
+  Expect.isTrue(dynamic is Type);
+  Expect.isFalse(dynamic == Type);
+}
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart b/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
index faa845a..cac5f11 100644
--- a/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
@@ -5,12 +5,14 @@
 import 'package:expect/expect.dart';
 import 'package:meta/dart2js.dart';
 
-/*class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*omit.class: C:checks=[],instance,typeArgument*/
 class C {
   call(int i) {}
 }
 
-/*class: D:checkedInstance,checks=[],instance,typeArgument*/
+/*strong.class: D:checkedInstance,checks=[],instance,typeArgument*/
+/*omit.class: D:checks=[],instance,typeArgument*/
 class D {
   call(double i) {}
 }
diff --git a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
index ccc9db9..e091714 100644
--- a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
@@ -6,10 +6,12 @@
 
 library generic_methods_dynamic_test;
 
-/*class: A:checkedInstance,checks=[],typeArgument*/
+/*strong.class: A:checkedInstance,checks=[],typeArgument*/
+/*omit.class: A:*/
 class A {}
 
-/*class: B:checks=[],instance*/
+/*strong.class: B:checks=[],instance*/
+/*omit.class: B:*/
 class B {}
 
 /*class: C:*/
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
index de9bc8b..963c073 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
@@ -14,6 +14,7 @@
 
 /*kernel.class: A:checkedTypeArgument,checks=[],typeArgument*/
 /*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
 @JS()
 @anonymous
 class A<T> {
diff --git a/tests/compiler/dart2js/rti/emission/list.dart b/tests/compiler/dart2js/rti/emission/list.dart
index 997bd49..0c8d312 100644
--- a/tests/compiler/dart2js/rti/emission/list.dart
+++ b/tests/compiler/dart2js/rti/emission/list.dart
@@ -6,15 +6,18 @@
 
 /*kernel.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
 /*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
+/*omit.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
 
 /*class: global#Iterable:checkedInstance*/
 
 /*kernel.class: A:checkedTypeArgument,checks=[],typeArgument*/
 /*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
 /*kernel.class: B:checks=[],typeArgument*/
 /*strong.class: B:checkedInstance,checks=[],typeArgument*/
+/*omit.class: B:checks=[],typeArgument*/
 class B {}
 
 @noInline
diff --git a/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart b/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart
index f3ac8a5..e4ded08 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart
@@ -4,7 +4,8 @@
 
 import 'package:expect/expect.dart';
 
-/*class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
+/*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
+/*omit.class: global#JSArray:checkedInstance,checks=[$isList],instance*/
 
 @NoInline()
 method<T>() {
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
index da4456d..3123b79 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
-  /*checks=[],functionType,instance*/
+  /*strong.checks=[],functionType,instance*/
+  /*omit.checks=[],instance*/
   T id<T>(T t) => t;
   int Function(int) x = id;
   print("${x.runtimeType}");
diff --git a/tests/compiler/dart2js/rti/emission/static_argument_strong.dart b/tests/compiler/dart2js/rti/emission/static_argument_strong.dart
index 7bdc190..4df0ab4 100644
--- a/tests/compiler/dart2js/rti/emission/static_argument_strong.dart
+++ b/tests/compiler/dart2js/rti/emission/static_argument_strong.dart
@@ -4,18 +4,22 @@
 
 import 'package:meta/dart2js.dart';
 
-/*class: I1:checkedInstance*/
+/*strong.class: I1:checkedInstance*/
+/*omit.class: I1:*/
 class I1 {}
 
-/*class: I2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*strong.class: I2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
+/*omit.class: I2:checkedTypeArgument,checks=[],typeArgument*/
 class I2 {}
 
 // TODO(32954): Exclude $isI1 because foo is only called directly.
-/*class: A:checks=[$isI1,$isI2],instance*/
+/*strong.class: A:checks=[$isI1,$isI2],instance*/
+/*omit.class: A:checks=[$isI2],instance*/
 class A implements I1, I2 {}
 
 // TODO(32954): Exclude $isI1 because foo is only called directly.
-/*class: B:checks=[$isI1,$isI2],instance*/
+/*strong.class: B:checks=[$isI1,$isI2],instance*/
+/*omit.class: B:checks=[$isI2],instance*/
 class B implements I1, I2 {}
 
 @noInline
diff --git a/tests/compiler/dart2js/rti/emission/type_literal.dart b/tests/compiler/dart2js/rti/emission/type_literal.dart
new file mode 100644
index 0000000..e46e083
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/type_literal.dart
@@ -0,0 +1,18 @@
+// 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: Class1:checks=[],typeLiteral*/
+class Class1 {}
+
+/*class: Class2:checks=[],typeLiteral*/
+class Class2<X> {}
+
+void main() {
+  String name1 = '${Class1}';
+  String name2 = '${Class2}';
+  Expect.equals('Class1', name1);
+  Expect.equals('Class2<dynamic>', name2);
+}
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index 416fabe..36fefb6 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_test.dart
@@ -25,9 +25,9 @@
         new Directory.fromUri(Platform.script.resolve('emission'));
     await checkTests(
       dataDir,
-      computeKernelRtiMemberEmission,
-      computeClassDataFromKernel: computeKernelRtiClassEmission,
+      const RtiEmissionDataComputer(),
       args: args,
+      testOmit: true,
       skipForStrong: [
         // Dart 1 semantics:
         'call.dart',
@@ -51,10 +51,11 @@
   static const String checkedInstance = 'checkedInstance';
   static const String typeArgument = 'typeArgument';
   static const String checkedTypeArgument = 'checkedTypeArgument';
+  static const String typeLiteral = 'typeLiteral';
   static const String functionType = 'functionType';
 }
 
-abstract class ComputeValueMixin<T> {
+abstract class ComputeValueMixin {
   Compiler get compiler;
   ProgramLookup lookup;
 
@@ -88,6 +89,9 @@
       if (classUse.checkedTypeArgument) {
         features.add(Tags.checkedTypeArgument);
       }
+      if (classUse.typeLiteral) {
+        features.add(Tags.typeLiteral);
+      }
     }
     return features.getText();
   }
@@ -100,33 +104,41 @@
   }
 }
 
-void computeKernelRtiMemberEmission(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new RtiMemberEmissionIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          member,
-          compiler,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
-      .run(definition.node);
+class RtiEmissionDataComputer extends DataComputer {
+  const RtiEmissionDataComputer();
+
+  @override
+  void setup() {
+    cacheRtiDataForTesting = true;
+  }
+
+  @override
+  bool get computesClassData => true;
+
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new RtiMemberEmissionIrComputer(compiler.reporter, actualMap, elementMap,
+            member, compiler, backendStrategy.closureDataLookup)
+        .run(definition.node);
+  }
+
+  @override
+  void computeClassData(
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    new RtiClassEmissionIrComputer(compiler, elementMap, actualMap)
+        .computeClassValue(cls);
+  }
 }
 
-void computeKernelRtiClassEmission(
-    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  new RtiClassEmissionIrComputer(compiler, elementMap, actualMap)
-      .computeClassValue(cls);
-}
-
-class RtiClassEmissionIrComputer extends DataRegistry
-    with ComputeValueMixin<ir.Node> {
+class RtiClassEmissionIrComputer extends DataRegistry with ComputeValueMixin {
   final Compiler compiler;
   final KernelToElementMapForBuilding _elementMap;
   final Map<Id, ActualData> actualMap;
@@ -144,9 +156,9 @@
 }
 
 class RtiMemberEmissionIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node> {
+    with ComputeValueMixin {
   final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final ClosureDataLookup _closureDataLookup;
   final Compiler compiler;
 
   RtiMemberEmissionIrComputer(
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index 1145266..2e6f996 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -31,8 +31,7 @@
   cacheRtiDataForTesting = true;
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, computeKernelRtiMemberNeed,
-        computeClassDataFromKernel: computeKernelRtiClassNeed,
+    await checkTests(dataDir, const RtiNeedDataComputer(),
         options: [],
         skipForKernel: [
           'runtime_type_closure_equals2.dart',
@@ -63,7 +62,7 @@
   static const String instantiationsNeedTypeArguments = 'needsInst';
 }
 
-abstract class ComputeValueMixin<T> {
+abstract class ComputeValueMixin {
   Compiler get compiler;
 
   ResolutionWorldBuilder get resolutionWorldBuilder =>
@@ -239,38 +238,47 @@
   }
 }
 
-/// Compute RTI need data for [member] from the new frontend.
-///
-/// Fills [actualMap] with the data.
-void computeKernelRtiMemberNeed(
-    Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  MemberDefinition definition = elementMap.getMemberDefinition(member);
-  new RtiMemberNeedIrComputer(
-          compiler.reporter,
-          actualMap,
-          elementMap,
-          member,
-          compiler,
-          backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>)
-      .run(definition.node);
+class RtiNeedDataComputer extends DataComputer {
+  const RtiNeedDataComputer();
+
+  @override
+  void setup() {
+    cacheRtiDataForTesting = true;
+  }
+
+  @override
+  bool get computesClassData => true;
+
+  /// Compute RTI need data for [member] from the new frontend.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(
+      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new RtiMemberNeedIrComputer(compiler.reporter, actualMap, elementMap,
+            member, compiler, backendStrategy.closureDataLookup)
+        .run(definition.node);
+  }
+
+  /// Compute RTI need data for [cls] from the new frontend.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeClassData(
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      {bool verbose: false}) {
+    KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+    KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+    new RtiClassNeedIrComputer(compiler, elementMap, actualMap)
+        .computeClassValue(cls);
+  }
 }
 
-/// Compute RTI need data for [cls] from the new frontend.
-///
-/// Fills [actualMap] with the data.
-void computeKernelRtiClassNeed(
-    Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
-    {bool verbose: false}) {
-  KernelBackendStrategy backendStrategy = compiler.backendStrategy;
-  KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
-  new RtiClassNeedIrComputer(compiler, elementMap, actualMap)
-      .computeClassValue(cls);
-}
-
-abstract class IrMixin implements ComputeValueMixin<ir.Node> {
+abstract class IrMixin implements ComputeValueMixin {
   @override
   MemberEntity getFrontendMember(MemberEntity backendMember) {
     ElementEnvironment elementEnvironment = compiler
@@ -320,7 +328,7 @@
 }
 
 class RtiClassNeedIrComputer extends DataRegistry
-    with ComputeValueMixin<ir.Node>, IrMixin {
+    with ComputeValueMixin, IrMixin {
   final Compiler compiler;
   final KernelToElementMapForBuilding _elementMap;
   final Map<Id, ActualData> actualMap;
@@ -339,9 +347,9 @@
 
 /// AST visitor for computing inference data for a member.
 class RtiMemberNeedIrComputer extends IrDataExtractor
-    with ComputeValueMixin<ir.Node>, IrMixin {
+    with ComputeValueMixin, IrMixin {
   final KernelToElementMapForBuilding _elementMap;
-  final ClosureDataLookup<ir.Node> _closureDataLookup;
+  final ClosureDataLookup _closureDataLookup;
   final Compiler compiler;
 
   RtiMemberNeedIrComputer(
diff --git a/tests/compiler/dart2js/rti/show.dart b/tests/compiler/dart2js/rti/show.dart
index 6c0ff7f..a2e9056 100644
--- a/tests/compiler/dart2js/rti/show.dart
+++ b/tests/compiler/dart2js/rti/show.dart
@@ -5,29 +5,23 @@
 /// Helper program that shows the rti data on a dart program.
 
 import 'package:args/args.dart';
-import 'package:compiler/src/js_backend/runtime_types.dart';
 import '../equivalence/id_equivalence_helper.dart';
 import '../equivalence/show_helper.dart';
 import 'rti_emission_test.dart';
 import 'rti_need_test_helper.dart';
 
 main(List<String> args) async {
-  cacheRtiDataForTesting = true;
   ArgParser argParser = createArgParser();
   argParser.addFlag('need', defaultsTo: true);
   argParser.addFlag('emission');
   ArgResults results = argParser.parse(args);
 
-  ComputeMemberDataFunction computeKernelData;
-  ComputeClassDataFunction computeKernelClassData;
+  DataComputer dataComputer;
   if (results['emission']) {
-    computeKernelData = computeKernelRtiMemberEmission;
-    computeKernelClassData = computeKernelRtiClassEmission;
+    dataComputer = const RtiEmissionDataComputer();
   } else {
-    computeKernelData = computeKernelRtiMemberNeed;
-    computeKernelClassData = computeKernelRtiClassNeed;
+    dataComputer = const RtiNeedDataComputer();
   }
 
-  await show(results, computeKernelData,
-      computeKernelClassData: computeKernelClassData);
+  await show(results, dataComputer);
 }
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index a4a6f9e..147cd0d 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_test.dart
@@ -187,9 +187,11 @@
   // List<E>
   expect(elementEnvironment.getThisType(List_), '[$List_rep, $List_E_rep]');
   // List
-  expect(elementEnvironment.getRawType(List_), '$List_rep');
+  expect(elementEnvironment.getRawType(List_),
+      strongMode ? '[$List_rep,,]' : '$List_rep');
   // List<dynamic>
-  expect(instantiate(List_, [dynamic_]), '$List_rep');
+  expect(instantiate(List_, [dynamic_]),
+      strongMode ? '[$List_rep,,]' : '$List_rep');
   // List<int>
   expect(instantiate(List_, [int_]), '[$List_rep, $int_rep]');
   // List<Typedef1>
@@ -263,9 +265,11 @@
   expect(elementEnvironment.getThisType(Map_),
       '[$Map_rep, $Map_K_rep, $Map_V_rep]');
   // Map
-  expect(elementEnvironment.getRawType(Map_), '$Map_rep');
+  expect(elementEnvironment.getRawType(Map_),
+      strongMode ? '[$Map_rep,,,]' : '$Map_rep');
   // Map<dynamic,dynamic>
-  expect(instantiate(Map_, [dynamic_, dynamic_]), '$Map_rep');
+  expect(instantiate(Map_, [dynamic_, dynamic_]),
+      strongMode ? '[$Map_rep,,,]' : '$Map_rep');
   // Map<int,String>
   expect(
       instantiate(Map_, [int_, String_]), '[$Map_rep, $int_rep, $String_rep]');
diff --git a/tests/compiler/dart2js/show_package_warnings_test.dart b/tests/compiler/dart2js/show_package_warnings_test.dart
index 5182eef..284d6ae 100644
--- a/tests/compiler/dart2js/show_package_warnings_test.dart
+++ b/tests/compiler/dart2js/show_package_warnings_test.dart
@@ -78,7 +78,7 @@
     int warnings: 0,
     int hints: 0,
     int infos: 0}) async {
-  var options = [Flags.analyzeOnly];
+  List<String> options = <String>[];
   if (showPackageWarnings != null) {
     if (showPackageWarnings.isEmpty) {
       options.add(Flags.showPackageWarnings);
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
index cc49c33..a0b6a5a 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
@@ -49,8 +49,8 @@
       //
       // Expect.isTrue(entry.column < target[line.line].length);
       Expect.isTrue(entry.column >= 0);
-      Expect
-          .isTrue(urlIndex == null || (urlIndex >= 0 && urlIndex < urlsLength));
+      Expect.isTrue(
+          urlIndex == null || (urlIndex >= 0 && urlIndex < urlsLength));
       Expect.isTrue(entry.sourceLine == null ||
           (entry.sourceLine >= 0 &&
               entry.sourceLine < sources[urlIndex].length));
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index 6b3a329..88372a5 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
@@ -19,7 +19,6 @@
 import 'package:compiler/src/js/js_source_mapping.dart';
 import 'package:compiler/src/js_backend/js_backend.dart';
 import 'package:compiler/src/source_file_provider.dart';
-import 'package:kernel/ast.dart' as ir;
 import '../../memory_compiler.dart';
 import '../../output_collector.dart';
 
@@ -188,7 +187,7 @@
 /// A wrapper of [JavaScriptSourceInformationStrategy] that records
 /// [RecordedSourceInformationProcess].
 class RecordingSourceInformationStrategy
-    extends JavaScriptSourceInformationStrategy<ir.Node> {
+    extends JavaScriptSourceInformationStrategy {
   final JavaScriptSourceInformationStrategy strategy;
   final Map<RecordedSourceInformationProcess, js.Node> processMap =
       <RecordedSourceInformationProcess, js.Node>{};
@@ -198,8 +197,7 @@
   RecordingSourceInformationStrategy(this.strategy);
 
   @override
-  SourceInformationBuilder<ir.Node> createBuilderForContext(
-      MemberEntity member) {
+  SourceInformationBuilder createBuilderForContext(MemberEntity member) {
     return strategy.createBuilderForContext(member);
   }
 
diff --git a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
index ead452a..ea6456b 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
@@ -186,8 +186,8 @@
   }
 
   static AnnotatedOutput loadOutput(filename) {
-    AnnotatedOutput output = AnnotatedOutput
-        .fromJson(json.decode(new File(filename).readAsStringSync()));
+    AnnotatedOutput output = AnnotatedOutput.fromJson(
+        json.decode(new File(filename).readAsStringSync()));
     print('Output loaded from $filename');
     return output;
   }
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 1aed7af..b5f162a 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -27,41 +27,22 @@
   static Future<TypeEnvironment> create(String source,
       {bool expectNoErrors: false,
       bool expectNoWarningsOrErrors: false,
-      bool stopAfterTypeInference: false,
-      String mainSource,
       bool testBackendWorld: false,
       List<String> options: const <String>[],
       Map<String, String> fieldTypeMap: const <String, String>{}}) async {
     Uri uri;
     Compiler compiler;
-    if (mainSource != null) {
-      stopAfterTypeInference = true;
-    }
-    if (testBackendWorld) {
-      stopAfterTypeInference = true;
-      assert(mainSource != null);
-    }
-    if (mainSource == null) {
-      source = '''import 'dart:async';
-                  main() {}
-                  $source''';
-    } else {
-      source = '$mainSource\n$source';
-    }
     memory.DiagnosticCollector collector;
     collector = new memory.DiagnosticCollector();
     uri = Uri.parse('memory:main.dart');
     memory.CompilationResult result = await memory.runCompiler(
         entryPoint: uri,
         memorySourceFiles: {'main.dart': source},
-        options: stopAfterTypeInference
-            ? ([Flags.disableTypeInference]..addAll(options))
-            : ([Flags.disableTypeInference, Flags.analyzeAll, Flags.analyzeOnly]
-              ..addAll(options)),
+        options: [Flags.disableTypeInference]..addAll(options),
         diagnosticHandler: collector,
         beforeRun: (compiler) {
           ImpactCacheDeleter.retainCachesForTesting = true;
-          compiler.stopAfterTypeInference = stopAfterTypeInference;
+          compiler.stopAfterTypeInference = true;
         });
     compiler = result.compiler;
     if (expectNoErrors || expectNoWarningsOrErrors) {
diff --git a/tests/compiler/dart2js_extra/28749_test.dart b/tests/compiler/dart2js_extra/28749_test.dart
index ca4d3bf..1795ea6 100644
--- a/tests/compiler/dart2js_extra/28749_test.dart
+++ b/tests/compiler/dart2js_extra/28749_test.dart
@@ -37,7 +37,7 @@
 
 void main() {
   var name = '${Wrap}';
-  if (name.length < 4) return; // minified.
+  if ('$Object' != 'Object') return; // minified
 
   Expect.equals(
     'Wrap<(int) => ((int) => void) => (int) => void>',
diff --git a/tests/compiler/dart2js_extra/bounded_type_literal_test.dart b/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
new file mode 100644
index 0000000..ad0fbe8
--- /dev/null
+++ b/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Foo<T extends num> {}
+
+main() {
+  var a = new Foo();
+  var b = Foo;
+  Expect.equals(a.runtimeType, b);
+
+  var runtimeTypeToString = "${a.runtimeType}";
+  var typeLiteralToString = "${b}";
+  Expect.equals(runtimeTypeToString, typeLiteralToString);
+
+  if ('$Object' == 'Object') {
+    // `true` if non-minified.
+    Expect.equals("Foo<num>", runtimeTypeToString);
+    Expect.equals("Foo<num>", typeLiteralToString);
+  }
+  print(runtimeTypeToString);
+  print(typeLiteralToString);
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 9887001..69f5055 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -98,8 +98,12 @@
 mirrors_used_warning_test/minif: Fail, OK # Tests warning that minified code will be broken.
 runtime_type_test: Fail, OK # Tests extected output of Type.toString().
 to_string_test: Fail # Issue 7179.
+type_literal_test: Fail, OK # Tests expected output of Type.toString().
 typevariable_typedef_test: Fail, OK # Tests expected output of Type.toString().
 
+[ $compiler == dart2js && $strong ]
+bound_closure_interceptor_type_test: RuntimeError
+
 [ $compiler == dart2js && !$strong ]
 extract_type_arguments_1_test: RuntimeError # Uses function type variables
 extract_type_arguments_2_test: RuntimeError # Uses function type variables
@@ -115,9 +119,6 @@
 [ $compiler == dart2js && ($runtime == chrome || $runtime == chromeOnAndroid || $runtime == drt || $runtime == ff || $runtime == safari) ]
 isolate2_test/01: Fail # Issue 14458.
 
-[ $compiler == dart2js && ($runtime == chrome || $runtime == d8 || $runtime == drt) ]
-bound_closure_interceptor_type_test: Fail, Pass # v8 issue 3084. https://code.google.com/p/v8/issues/detail?id=3084
-
 [ $compiler == dart2js && ($runtime == drt || $runtime == ff || $runtime == jsshell || $runtime == safari) ]
 code_motion_exception_test: Skip # Required V8 specific format of JavaScript errors.
 
diff --git a/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart b/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart
new file mode 100644
index 0000000..3231717
--- /dev/null
+++ b/tests/compiler/dart2js_extra/dynamic_type_literal_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.
+
+// dart2jsOptions=--strong --omit-implicit-checks
+
+// Test generation of 'dynamic' type literals.
+
+import "package:expect/expect.dart";
+
+void main() {
+  Expect.isTrue(dynamic is Type);
+  Expect.isFalse(dynamic == Type);
+}
diff --git a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
new file mode 100644
index 0000000..8becaf9
--- /dev/null
+++ b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Foo<T extends num> {}
+
+class Bar<T extends num> {}
+
+main() {
+  test(new Foo(), Foo, expectTypeArguments: false);
+  test(new Bar() as Bar<num>, Bar, expectTypeArguments: true);
+}
+
+void test(dynamic object, Type type, {bool expectTypeArguments}) {
+  bool caught = false;
+  try {
+    print(type);
+    object as List<String>;
+  } catch (e) {
+    String expected = '$type';
+    if (!expectTypeArguments) {
+      expected = expected.substring(0, expected.indexOf('<'));
+    }
+    expected = "'$expected'";
+    Expect.isTrue(e.toString().contains(expected),
+        'Expected "$expected" in the message: $e');
+    caught = true;
+    print(e);
+  }
+  Expect.isTrue(caught);
+}
diff --git a/tests/compiler/dart2js_extra/indirect_type_literal_test.dart b/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
new file mode 100644
index 0000000..8929796
--- /dev/null
+++ b/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import "package:expect/expect.dart";
+
+class A<T> {}
+
+class B<T extends num> {}
+
+class Indirect<T> {
+  Type get type => T;
+}
+
+void main() {
+  Expect.equals(A, new Indirect<A>().type);
+  Expect.equals(A, new Indirect<A<dynamic>>().type);
+  Expect.notEquals(A, new Indirect<A<num>>().type);
+  Expect.equals(B, new Indirect<B>().type);
+  Expect.equals(B, new Indirect<B<num>>().type);
+  Expect.notEquals(B, new Indirect<B<int>>().type);
+}
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
index d8b456c..26ba4e8 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
@@ -14,7 +14,7 @@
     // `true` if non-minified.
     // The signature of `id` is not otherwise needed so the instantiation
     // wrapper doesn't have a function type.
-    Expect.equals("Instantiation1", toString);
+    Expect.equals("Instantiation1<dynamic>", toString);
   }
   print(toString);
 }
diff --git a/tests/compiler/dart2js_extra/runtime_type_test.dart b/tests/compiler/dart2js_extra/runtime_type_test.dart
index c307ef4..f127dbe 100644
--- a/tests/compiler/dart2js_extra/runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// dart2jsOptions=--strong
+
 // Test that Type.toString returns nice strings for native classes with
 // reserved names and for raw types.
 
@@ -14,17 +16,18 @@
 class Class$With$Dollar {}
 
 void main() {
-  Expect.equals('C', new C().runtimeType.toString());
+  Expect.equals('C<dynamic>', new C().runtimeType.toString());
   Expect.equals('C<int>', new C<int>().runtimeType.toString());
   Expect.equals('C<double>', new C<double>().runtimeType.toString());
   Expect.equals('C<num>', new C<num>().runtimeType.toString());
   Expect.equals('C<bool>', new C<bool>().runtimeType.toString());
-  Expect.equals('D', new D().runtimeType.toString());
+  Expect.equals('D<dynamic, dynamic, dynamic>', new D().runtimeType.toString());
   Expect.equals('D<dynamic, int, dynamic>',
       new D<dynamic, int, dynamic>().runtimeType.toString());
   D d = new D<dynamic, D, D<dynamic, dynamic, int>>();
   Expect.equals(
-      'D<dynamic, D, D<dynamic, dynamic, int>>', d.runtimeType.toString());
+      'D<dynamic, D<dynamic, dynamic, dynamic>, D<dynamic, dynamic, int>>',
+      d.runtimeType.toString());
   Expect.equals(r'C<Class$With$Dollar>',
       new C<Class$With$Dollar>().runtimeType.toString());
 }
diff --git a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
index 8c6cbb4..80fa25c 100644
--- a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
@@ -11,6 +11,11 @@
 }
 
 main() {
-  Expect.equals((Class).toString(), new Class().runtimeType.toString());
-  Expect.equals((Class).toString(), new Class<int>().runtimeType.toString());
+  // Since the type argument of `Class` is only needed for
+  // `.runtimeType.toString()`, it is not reified, and the toString is therefore
+  // only 'Class'.
+  String className = (Class).toString();
+  className = className.substring(0, className.indexOf('<'));
+  Expect.equals(className, new Class().runtimeType.toString());
+  Expect.equals(className, new Class<int>().runtimeType.toString());
 }
diff --git a/tests/compiler/dart2js_extra/type_error_message_test.dart b/tests/compiler/dart2js_extra/type_error_message_test.dart
index d097577..6f34931 100644
--- a/tests/compiler/dart2js_extra/type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/type_error_message_test.dart
@@ -25,12 +25,16 @@
       C<String, String> x = (new C<C<int, String>, String>()) as dynamic;
     } catch (e) {
       String nameOfC = (C).toString();
+      if (nameOfC.contains('<')) {
+        nameOfC = nameOfC.substring(0, nameOfC.indexOf('<'));
+      }
       String nameOfInt = (int).toString();
       String nameOfString = (String).toString();
       String expected =
-          '$nameOfC<$nameOfC<$nameOfInt, $nameOfString>, $nameOfString>';
+          "'$nameOfC<$nameOfC<$nameOfInt, $nameOfString>, $nameOfString>'";
       Expect.isTrue(e.toString().contains(expected),
-          'Expected "$expected" in the message');
+          'Expected "$expected" in the message: $e');
+      print(e);
       caught = true;
     }
     Expect.isTrue(caught);
diff --git a/tests/compiler/dart2js_extra/type_literal_test.dart b/tests/compiler/dart2js_extra/type_literal_test.dart
new file mode 100644
index 0000000..4426847
--- /dev/null
+++ b/tests/compiler/dart2js_extra/type_literal_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1 {}
+
+class Class2<X> {}
+
+void main() {
+  String name1 = '${Class1}';
+  String name2 = '${Class2}';
+  Expect.equals('Class1', name1);
+  Expect.equals('Class2<dynamic>', name2);
+}
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index ee3a46a..65d9def 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -149,39 +149,9 @@
 [ $compiler != app_jitk && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkp && $runtime != none ]
 map_keys2_test: RuntimeError # needs Dart 2 is checks
 
-[ $compiler == dart2analyzer && !$checked && !$strong ]
-from_environment_const_type_test/02: MissingCompileTimeError
-from_environment_const_type_test/03: MissingCompileTimeError
-from_environment_const_type_test/04: MissingCompileTimeError
-from_environment_const_type_test/06: MissingCompileTimeError
-from_environment_const_type_test/07: MissingCompileTimeError
-from_environment_const_type_test/08: MissingCompileTimeError
-from_environment_const_type_test/09: MissingCompileTimeError
-from_environment_const_type_test/11: MissingCompileTimeError
-from_environment_const_type_test/12: MissingCompileTimeError
-from_environment_const_type_test/13: MissingCompileTimeError
-from_environment_const_type_test/14: MissingCompileTimeError
-from_environment_const_type_test/16: MissingCompileTimeError
-from_environment_const_type_undefined_test/02: MissingCompileTimeError
-from_environment_const_type_undefined_test/03: MissingCompileTimeError
-from_environment_const_type_undefined_test/04: MissingCompileTimeError
-from_environment_const_type_undefined_test/06: MissingCompileTimeError
-from_environment_const_type_undefined_test/07: MissingCompileTimeError
-from_environment_const_type_undefined_test/08: MissingCompileTimeError
-from_environment_const_type_undefined_test/09: MissingCompileTimeError
-from_environment_const_type_undefined_test/11: MissingCompileTimeError
-from_environment_const_type_undefined_test/12: MissingCompileTimeError
-from_environment_const_type_undefined_test/13: MissingCompileTimeError
-from_environment_const_type_undefined_test/14: MissingCompileTimeError
-from_environment_const_type_undefined_test/16: MissingCompileTimeError
-
 [ $compiler == dart2analyzer && $strong ]
 int_parse_radix_bad_handler_test: Pass
 
-[ $compiler == dart2analyzer && !$strong ]
-regress_33166_test: StaticWarning # Not a Dart 1 test
-symbol_reserved_word_test/05: MissingCompileTimeError # Issue 30245
-
 [ $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk ]
 bigint_js_test: SkipByDesign # JavaScript-specific test
 
@@ -204,6 +174,9 @@
 regexp/no-extensions_test: RuntimeError
 regexp/overflow_test: RuntimeError
 
+[ $compiler == dart2js && $runtime == safari && $strong ]
+regexp/no-extensions_test: Pass, RuntimeError
+
 [ $compiler == dart2js && !$browser ]
 package_resource_test: RuntimeError # Issue 26842
 
@@ -644,7 +617,8 @@
 string_case_test/01: RuntimeError # Issue 18061: German double S.
 
 [ $runtime == ff || $runtime == jsshell ]
-double_parse_test/02: Fail, OK # Issue 30468
+double_parse_test: Fail, OK # Issue 30468
+double_try_parse_test: Fail, OK # Issue 30468
 regexp/UC16_test: RuntimeError
 
 [ $hot_reload || $hot_reload_rollback ]
diff --git a/tests/language_2/async_nested_01_test.dart b/tests/language_2/async_nested_01_test.dart
new file mode 100644
index 0000000..a4d0891
--- /dev/null
+++ b/tests/language_2/async_nested_01_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10";
+  Node node = new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      await new Future.value(new Node('4', [
+        new Node('5', [
+          await new Future.value(new Node('6', [
+            await new Future.value(new Node('7', [])),
+          ])),
+          await new Future.value(new Node('8', [])),
+          await new Future.value(new Node('9', [])),
+        ]),
+      ])),
+    ])),
+    await new Future.value(new Node('10', [])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_02_test.dart b/tests/language_2/async_nested_02_test.dart
new file mode 100644
index 0000000..5d42d9e
--- /dev/null
+++ b/tests/language_2/async_nested_02_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11";
+  Node node = new Node('1', [
+    new Node('2', [
+      new Node('3', []),
+    ]),
+    await new Future.value(new Node('4', [
+      await new Future.value(new Node('5', [])),
+      new Node('6', [
+        new Node('7', []),
+        await new Future.value(new Node('8', [])),
+      ]),
+      await new Future.value(new Node('9', [])),
+    ])),
+    await new Future.value(new Node('10', [])),
+    new Node('11', []),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_03_test.dart b/tests/language_2/async_nested_03_test.dart
new file mode 100644
index 0000000..5b485ac
--- /dev/null
+++ b/tests/language_2/async_nested_03_test.dart
@@ -0,0 +1,48 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12";
+  Node node = new Node('1', [
+    new Node('2', [
+      await new Future.value(new Node('3', [])),
+      await new Future.value(new Node('4', [
+        new Node('5', []),
+        await new Future.value(new Node('6', [])),
+        await new Future.value(new Node('7', [])),
+        new Node('8', []),
+      ])),
+      new Node('9', []),
+      new Node('10', [
+        new Node('11', [
+          await new Future.value(new Node('12', [])),
+        ]),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_04_test.dart b/tests/language_2/async_nested_04_test.dart
new file mode 100644
index 0000000..1731ccd
--- /dev/null
+++ b/tests/language_2/async_nested_04_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [])),
+    await new Future.value(new Node('4', [
+      await new Future.value(new Node('5', [])),
+      new Node('6', []),
+      new Node('7', [
+        new Node('8', []),
+        await new Future.value(new Node('9', [])),
+      ]),
+      await new Future.value(new Node('10', [])),
+    ])),
+    new Node('11', []),
+    await new Future.value(new Node('12', [])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_05_test.dart b/tests/language_2/async_nested_05_test.dart
new file mode 100644
index 0000000..88a0aff
--- /dev/null
+++ b/tests/language_2/async_nested_05_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [
+      await new Future.value(new Node('4', [])),
+      await new Future.value(new Node('5', [])),
+      await new Future.value(new Node('6', [])),
+    ])),
+    new Node('7', []),
+    new Node('8', [
+      new Node('9', []),
+      await new Future.value(new Node('10', [])),
+      new Node('11', []),
+      await new Future.value(new Node('12', [])),
+    ]),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_06_test.dart b/tests/language_2/async_nested_06_test.dart
new file mode 100644
index 0000000..787a292
--- /dev/null
+++ b/tests/language_2/async_nested_06_test.dart
@@ -0,0 +1,49 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12";
+  Node node = new Node('1', [
+    new Node('2', [
+      await new Future.value(new Node('3', [
+        new Node('4', []),
+      ])),
+      new Node('5', [
+        await new Future.value(new Node('6', [
+          await new Future.value(new Node('7', [
+            new Node('8', []),
+          ])),
+          new Node('9', []),
+          await new Future.value(new Node('10', [])),
+        ])),
+        await new Future.value(new Node('11', [])),
+        await new Future.value(new Node('12', [])),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_07_test.dart b/tests/language_2/async_nested_07_test.dart
new file mode 100644
index 0000000..7a56f3d
--- /dev/null
+++ b/tests/language_2/async_nested_07_test.dart
@@ -0,0 +1,48 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [
+      new Node('4', []),
+      new Node('5', []),
+      await new Future.value(new Node('6', [])),
+      new Node('7', [
+        await new Future.value(new Node('8', [
+          new Node('9', []),
+        ])),
+        await new Future.value(new Node('10', [])),
+      ]),
+    ])),
+    new Node('11', [
+      await new Future.value(new Node('12', [])),
+    ]),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_08_test.dart b/tests/language_2/async_nested_08_test.dart
new file mode 100644
index 0000000..43f5f25
--- /dev/null
+++ b/tests/language_2/async_nested_08_test.dart
@@ -0,0 +1,48 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [
+      await new Future.value(new Node('3', [])),
+    ])),
+    await new Future.value(new Node('4', [
+      await new Future.value(new Node('5', [])),
+      await new Future.value(new Node('6', [])),
+      new Node('7', []),
+      new Node('8', []),
+      new Node('9', [
+        await new Future.value(new Node('10', [])),
+      ]),
+      new Node('11', []),
+      new Node('12', []),
+    ])),
+    await new Future.value(new Node('13', [])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_09_test.dart b/tests/language_2/async_nested_09_test.dart
new file mode 100644
index 0000000..48b383d
--- /dev/null
+++ b/tests/language_2/async_nested_09_test.dart
@@ -0,0 +1,49 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13";
+  Node node = new Node('1', [
+    new Node('2', [
+      await new Future.value(new Node('3', [])),
+      await new Future.value(new Node('4', [
+        new Node('5', []),
+        new Node('6', []),
+        new Node('7', []),
+        new Node('8', []),
+        await new Future.value(new Node('9', [
+          new Node('10', [
+            new Node('11', []),
+          ]),
+        ])),
+        await new Future.value(new Node('12', [])),
+      ])),
+      await new Future.value(new Node('13', [])),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_10_test.dart b/tests/language_2/async_nested_10_test.dart
new file mode 100644
index 0000000..8af92fc
--- /dev/null
+++ b/tests/language_2/async_nested_10_test.dart
@@ -0,0 +1,51 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', []),
+      await new Future.value(new Node('4', [
+        await new Future.value(new Node('5', [
+          new Node('6', []),
+          new Node('7', [
+            new Node('8', []),
+          ]),
+          await new Future.value(new Node('9', [])),
+          new Node('10', [
+            new Node('11', []),
+          ]),
+        ])),
+      ])),
+      await new Future.value(new Node('12', [
+        new Node('13', []),
+      ])),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_11_test.dart b/tests/language_2/async_nested_11_test.dart
new file mode 100644
index 0000000..15e1bd6
--- /dev/null
+++ b/tests/language_2/async_nested_11_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', []),
+      new Node('4', [
+        new Node('5', []),
+        new Node('6', []),
+        await new Future.value(new Node('7', [
+          new Node('8', [
+            new Node('9', []),
+          ]),
+          new Node('10', []),
+          new Node('11', [
+            await new Future.value(new Node('12', [])),
+          ]),
+        ])),
+        await new Future.value(new Node('13', [])),
+      ]),
+    ])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_12_test.dart b/tests/language_2/async_nested_12_test.dart
new file mode 100644
index 0000000..514632d
--- /dev/null
+++ b/tests/language_2/async_nested_12_test.dart
@@ -0,0 +1,49 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [])),
+    new Node('4', [
+      await new Future.value(new Node('5', [
+        new Node('6', []),
+        new Node('7', []),
+        await new Future.value(new Node('8', [
+          new Node('9', []),
+        ])),
+      ])),
+      new Node('10', [
+        new Node('11', []),
+        await new Future.value(new Node('12', [])),
+      ]),
+    ]),
+    await new Future.value(new Node('13', [])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_13_test.dart b/tests/language_2/async_nested_13_test.dart
new file mode 100644
index 0000000..cfb9a95
--- /dev/null
+++ b/tests/language_2/async_nested_13_test.dart
@@ -0,0 +1,52 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14";
+  Node node = new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [])),
+    await new Future.value(new Node('4', [
+      new Node('5', [
+        await new Future.value(new Node('6', [
+          new Node('7', [
+            new Node('8', [
+              new Node('9', []),
+              new Node('10', []),
+              await new Future.value(new Node('11', [])),
+            ]),
+            await new Future.value(new Node('12', [])),
+          ]),
+        ])),
+        await new Future.value(new Node('13', [
+          new Node('14', []),
+        ])),
+      ]),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_14_test.dart b/tests/language_2/async_nested_14_test.dart
new file mode 100644
index 0000000..4f43ef9
--- /dev/null
+++ b/tests/language_2/async_nested_14_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14";
+  Node node = new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      new Node('4', [
+        await new Future.value(new Node('5', [])),
+        new Node('6', []),
+        new Node('7', []),
+        new Node('8', [
+          await new Future.value(new Node('9', [
+            new Node('10', []),
+            await new Future.value(new Node('11', [])),
+          ])),
+        ]),
+        await new Future.value(new Node('12', [])),
+      ]),
+      new Node('13', []),
+    ])),
+    await new Future.value(new Node('14', [])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_15_test.dart b/tests/language_2/async_nested_15_test.dart
new file mode 100644
index 0000000..140d1ff
--- /dev/null
+++ b/tests/language_2/async_nested_15_test.dart
@@ -0,0 +1,52 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [
+      await new Future.value(new Node('3', [
+        new Node('4', []),
+        await new Future.value(new Node('5', [
+          await new Future.value(new Node('6', [])),
+          new Node('7', [
+            new Node('8', []),
+            await new Future.value(new Node('9', [])),
+            new Node('10', []),
+            new Node('11', [
+              new Node('12', []),
+            ]),
+          ]),
+        ])),
+        new Node('13', [
+          await new Future.value(new Node('14', [])),
+        ]),
+      ])),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_16_test.dart b/tests/language_2/async_nested_16_test.dart
new file mode 100644
index 0000000..1e4a945
--- /dev/null
+++ b/tests/language_2/async_nested_16_test.dart
@@ -0,0 +1,51 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      new Node('4', []),
+      new Node('5', []),
+      new Node('6', []),
+      new Node('7', []),
+      new Node('8', [
+        await new Future.value(new Node('9', [
+          await new Future.value(new Node('10', [])),
+        ])),
+      ]),
+      new Node('11', []),
+    ])),
+    new Node('12', [
+      new Node('13', [
+        await new Future.value(new Node('14', [])),
+      ]),
+    ]),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_17_test.dart b/tests/language_2/async_nested_17_test.dart
new file mode 100644
index 0000000..8f7584d
--- /dev/null
+++ b/tests/language_2/async_nested_17_test.dart
@@ -0,0 +1,49 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      new Node('4', [
+        await new Future.value(new Node('5', [])),
+        new Node('6', []),
+        new Node('7', []),
+      ]),
+      await new Future.value(new Node('8', [])),
+      new Node('9', [
+        new Node('10', []),
+        await new Future.value(new Node('11', [])),
+      ]),
+      await new Future.value(new Node('12', [])),
+    ])),
+    await new Future.value(new Node('13', [])),
+    new Node('14', []),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_18_test.dart b/tests/language_2/async_nested_18_test.dart
new file mode 100644
index 0000000..6c68db7
--- /dev/null
+++ b/tests/language_2/async_nested_18_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = new Node('1', [
+    new Node('2', []),
+    new Node('3', [
+      await new Future.value(new Node('4', [])),
+      new Node('5', [
+        new Node('6', [
+          new Node('7', [
+            await new Future.value(new Node('8', [
+              new Node('9', []),
+              new Node('10', []),
+              await new Future.value(new Node('11', [])),
+              await new Future.value(new Node('12', [])),
+              new Node('13', []),
+            ])),
+            await new Future.value(new Node('14', [
+              new Node('15', []),
+            ])),
+          ]),
+        ]),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_19_test.dart b/tests/language_2/async_nested_19_test.dart
new file mode 100644
index 0000000..21aadf7
--- /dev/null
+++ b/tests/language_2/async_nested_19_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    new Node('3', []),
+    new Node('4', [
+      new Node('5', []),
+    ]),
+    new Node('6', [
+      new Node('7', []),
+    ]),
+    new Node('8', [
+      new Node('9', [
+        await new Future.value(new Node('10', [
+          new Node('11', [
+            new Node('12', []),
+            new Node('13', []),
+            await new Future.value(new Node('14', [])),
+          ]),
+        ])),
+        await new Future.value(new Node('15', [])),
+      ]),
+    ]),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_20_test.dart b/tests/language_2/async_nested_20_test.dart
new file mode 100644
index 0000000..217d46b
--- /dev/null
+++ b/tests/language_2/async_nested_20_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', []),
+      await new Future.value(new Node('4', [
+        await new Future.value(new Node('5', [
+          new Node('6', []),
+          new Node('7', [
+            await new Future.value(new Node('8', [
+              new Node('9', []),
+            ])),
+            new Node('10', []),
+            new Node('11', []),
+            new Node('12', [
+              await new Future.value(new Node('13', [])),
+              new Node('14', []),
+            ]),
+          ]),
+        ])),
+        await new Future.value(new Node('15', [])),
+      ])),
+    ])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_21_test.dart b/tests/language_2/async_nested_21_test.dart
new file mode 100644
index 0000000..b2eb8e2
--- /dev/null
+++ b/tests/language_2/async_nested_21_test.dart
@@ -0,0 +1,54 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', [
+        new Node('4', [
+          await new Future.value(new Node('5', [])),
+          new Node('6', [
+            await new Future.value(new Node('7', [
+              new Node('8', [
+                await new Future.value(new Node('9', [])),
+                new Node('10', []),
+              ]),
+              new Node('11', []),
+              await new Future.value(new Node('12', [])),
+              new Node('13', []),
+            ])),
+            new Node('14', [
+              await new Future.value(new Node('15', [])),
+            ]),
+          ]),
+        ]),
+      ]),
+    ])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_22_test.dart b/tests/language_2/async_nested_22_test.dart
new file mode 100644
index 0000000..5184ee9
--- /dev/null
+++ b/tests/language_2/async_nested_22_test.dart
@@ -0,0 +1,52 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [])),
+    new Node('3', []),
+    await new Future.value(new Node('4', [
+      await new Future.value(new Node('5', [])),
+      new Node('6', [
+        new Node('7', [
+          new Node('8', [
+            new Node('9', []),
+          ]),
+        ]),
+        await new Future.value(new Node('10', [
+          new Node('11', []),
+        ])),
+        await new Future.value(new Node('12', [])),
+      ]),
+      new Node('13', []),
+    ])),
+    await new Future.value(new Node('14', [])),
+    new Node('15', []),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_23_test.dart b/tests/language_2/async_nested_23_test.dart
new file mode 100644
index 0000000..53f011e
--- /dev/null
+++ b/tests/language_2/async_nested_23_test.dart
@@ -0,0 +1,51 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [
+      new Node('4', [
+        new Node('5', [
+          new Node('6', []),
+          new Node('7', [
+            new Node('8', []),
+          ]),
+          new Node('9', []),
+          await new Future.value(new Node('10', [])),
+          new Node('11', []),
+        ]),
+      ]),
+      new Node('12', []),
+      await new Future.value(new Node('13', [])),
+    ])),
+    await new Future.value(new Node('14', [])),
+    new Node('15', []),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_24_test.dart b/tests/language_2/async_nested_24_test.dart
new file mode 100644
index 0000000..52a6878
--- /dev/null
+++ b/tests/language_2/async_nested_24_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    new Node('3', []),
+    await new Future.value(new Node('4', [
+      await new Future.value(new Node('5', [])),
+      new Node('6', []),
+      await new Future.value(new Node('7', [])),
+      await new Future.value(new Node('8', [])),
+    ])),
+    new Node('9', []),
+    new Node('10', [
+      await new Future.value(new Node('11', [])),
+      new Node('12', [
+        await new Future.value(new Node('13', [])),
+        new Node('14', []),
+        await new Future.value(new Node('15', [])),
+      ]),
+    ]),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_25_test.dart b/tests/language_2/async_nested_25_test.dart
new file mode 100644
index 0000000..6020ccf
--- /dev/null
+++ b/tests/language_2/async_nested_25_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = new Node('1', [
+    new Node('2', [
+      new Node('3', [
+        new Node('4', []),
+        await new Future.value(new Node('5', [
+          await new Future.value(new Node('6', [
+            new Node('7', [
+              await new Future.value(new Node('8', [])),
+              new Node('9', []),
+              await new Future.value(new Node('10', [])),
+              await new Future.value(new Node('11', [])),
+              new Node('12', [
+                await new Future.value(new Node('13', [])),
+              ]),
+              new Node('14', []),
+            ]),
+          ])),
+          await new Future.value(new Node('15', [])),
+        ])),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_26_test.dart b/tests/language_2/async_nested_26_test.dart
new file mode 100644
index 0000000..23a7165
--- /dev/null
+++ b/tests/language_2/async_nested_26_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14";
+  Node node = new Node('1', [
+    new Node('2', [
+      await new Future.value(new Node('3', [])),
+    ]),
+    await new Future.value(new Node('4', [
+      await new Future.value(new Node('5', [
+        new Node('6', [
+          new Node('7', []),
+        ]),
+        new Node('8', []),
+        await new Future.value(new Node('9', [])),
+        new Node('10', []),
+        new Node('11', []),
+      ])),
+      await new Future.value(new Node('12', [])),
+      new Node('13', []),
+      new Node('14', []),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_27_test.dart b/tests/language_2/async_nested_27_test.dart
new file mode 100644
index 0000000..629bfdc
--- /dev/null
+++ b/tests/language_2/async_nested_27_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      new Node('4', []),
+      await new Future.value(new Node('5', [
+        new Node('6', []),
+        await new Future.value(new Node('7', [
+          new Node('8', []),
+        ])),
+      ])),
+    ])),
+    await new Future.value(new Node('9', [
+      new Node('10', [
+        new Node('11', []),
+        new Node('12', []),
+        await new Future.value(new Node('13', [])),
+        await new Future.value(new Node('14', [])),
+        await new Future.value(new Node('15', [])),
+        new Node('16', []),
+      ]),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_28_test.dart b/tests/language_2/async_nested_28_test.dart
new file mode 100644
index 0000000..8106fee
--- /dev/null
+++ b/tests/language_2/async_nested_28_test.dart
@@ -0,0 +1,54 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', []),
+      new Node('4', []),
+      new Node('5', [
+        new Node('6', []),
+        await new Future.value(new Node('7', [
+          new Node('8', [
+            new Node('9', []),
+            new Node('10', [
+              new Node('11', [
+                new Node('12', []),
+                new Node('13', []),
+                await new Future.value(new Node('14', [])),
+              ]),
+            ]),
+          ]),
+        ])),
+        new Node('15', []),
+        await new Future.value(new Node('16', [])),
+      ]),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_29_test.dart b/tests/language_2/async_nested_29_test.dart
new file mode 100644
index 0000000..25671db
--- /dev/null
+++ b/tests/language_2/async_nested_29_test.dart
@@ -0,0 +1,55 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', []),
+      await new Future.value(new Node('4', [])),
+      new Node('5', [
+        new Node('6', []),
+        await new Future.value(new Node('7', [
+          new Node('8', [
+            await new Future.value(new Node('9', [])),
+            await new Future.value(new Node('10', [
+              new Node('11', [
+                new Node('12', [
+                  await new Future.value(new Node('13', [])),
+                ]),
+                new Node('14', []),
+                await new Future.value(new Node('15', [])),
+              ]),
+            ])),
+            await new Future.value(new Node('16', [])),
+          ]),
+        ])),
+      ]),
+    ])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_30_test.dart b/tests/language_2/async_nested_30_test.dart
new file mode 100644
index 0000000..97a958a
--- /dev/null
+++ b/tests/language_2/async_nested_30_test.dart
@@ -0,0 +1,54 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    new Node('2', [
+      new Node('3', []),
+      new Node('4', []),
+      new Node('5', [
+        await new Future.value(new Node('6', [
+          new Node('7', []),
+          new Node('8', [
+            await new Future.value(new Node('9', [])),
+            await new Future.value(new Node('10', [])),
+            await new Future.value(new Node('11', [])),
+          ]),
+          await new Future.value(new Node('12', [])),
+          new Node('13', []),
+        ])),
+        new Node('14', [
+          await new Future.value(new Node('15', [
+            new Node('16', []),
+          ])),
+        ]),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_31_test.dart b/tests/language_2/async_nested_31_test.dart
new file mode 100644
index 0000000..f07f42f
--- /dev/null
+++ b/tests/language_2/async_nested_31_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [
+      new Node('4', [
+        new Node('5', []),
+        new Node('6', []),
+        await new Future.value(new Node('7', [])),
+        await new Future.value(new Node('8', [
+          new Node('9', []),
+        ])),
+        new Node('10', [
+          new Node('11', [
+            new Node('12', []),
+          ]),
+        ]),
+      ]),
+    ])),
+    await new Future.value(new Node('13', [])),
+    await new Future.value(new Node('14', [])),
+    new Node('15', []),
+    await new Future.value(new Node('16', [])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_32_test.dart b/tests/language_2/async_nested_32_test.dart
new file mode 100644
index 0000000..0adec4f
--- /dev/null
+++ b/tests/language_2/async_nested_32_test.dart
@@ -0,0 +1,54 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    new Node('2', [
+      new Node('3', []),
+      new Node('4', []),
+      await new Future.value(new Node('5', [
+        await new Future.value(new Node('6', [
+          await new Future.value(new Node('7', [])),
+          new Node('8', [
+            new Node('9', []),
+            await new Future.value(new Node('10', [])),
+          ]),
+        ])),
+      ])),
+      await new Future.value(new Node('11', [])),
+      new Node('12', [
+        new Node('13', []),
+        await new Future.value(new Node('14', [
+          await new Future.value(new Node('15', [])),
+        ])),
+        new Node('16', []),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_33_test.dart b/tests/language_2/async_nested_33_test.dart
new file mode 100644
index 0000000..c8d92cc
--- /dev/null
+++ b/tests/language_2/async_nested_33_test.dart
@@ -0,0 +1,55 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    new Node('2', []),
+    new Node('3', [
+      await new Future.value(new Node('4', [])),
+      new Node('5', [
+        new Node('6', [
+          new Node('7', [
+            await new Future.value(new Node('8', [])),
+            await new Future.value(new Node('9', [
+              await new Future.value(new Node('10', [
+                new Node('11', []),
+              ])),
+              await new Future.value(new Node('12', [])),
+              await new Future.value(new Node('13', [
+                await new Future.value(new Node('14', [])),
+              ])),
+            ])),
+            await new Future.value(new Node('15', [])),
+            new Node('16', []),
+          ]),
+        ]),
+      ]),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_34_test.dart b/tests/language_2/async_nested_34_test.dart
new file mode 100644
index 0000000..9a22523
--- /dev/null
+++ b/tests/language_2/async_nested_34_test.dart
@@ -0,0 +1,54 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [
+      new Node('3', []),
+      new Node('4', []),
+      new Node('5', [
+        await new Future.value(new Node('6', [
+          new Node('7', [
+            new Node('8', []),
+            new Node('9', [
+              new Node('10', []),
+              await new Future.value(new Node('11', [])),
+            ]),
+          ]),
+          await new Future.value(new Node('12', [])),
+        ])),
+        new Node('13', [
+          await new Future.value(new Node('14', [])),
+          await new Future.value(new Node('15', [])),
+          new Node('16', []),
+        ]),
+      ]),
+    ])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_35_test.dart b/tests/language_2/async_nested_35_test.dart
new file mode 100644
index 0000000..8d8f91c
--- /dev/null
+++ b/tests/language_2/async_nested_35_test.dart
@@ -0,0 +1,54 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      await new Future.value(new Node('4', [])),
+      await new Future.value(new Node('5', [
+        new Node('6', []),
+        new Node('7', []),
+        await new Future.value(new Node('8', [])),
+        await new Future.value(new Node('9', [])),
+      ])),
+      new Node('10', [
+        new Node('11', [
+          new Node('12', [
+            new Node('13', []),
+          ]),
+        ]),
+        new Node('14', [
+          await new Future.value(new Node('15', [])),
+        ]),
+        new Node('16', []),
+      ]),
+    ])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_36_test.dart b/tests/language_2/async_nested_36_test.dart
new file mode 100644
index 0000000..7eb30ee
--- /dev/null
+++ b/tests/language_2/async_nested_36_test.dart
@@ -0,0 +1,52 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
+  Node node = await new Future.value(new Node('1', [
+    await new Future.value(new Node('2', [
+      await new Future.value(new Node('3', [])),
+      new Node('4', []),
+      await new Future.value(new Node('5', [
+        new Node('6', [
+          new Node('7', []),
+          await new Future.value(new Node('8', [])),
+        ]),
+        new Node('9', []),
+        await new Future.value(new Node('10', [])),
+      ])),
+      new Node('11', [
+        new Node('12', []),
+      ]),
+      new Node('13', [
+        await new Future.value(new Node('14', [])),
+      ]),
+    ])),
+    await new Future.value(new Node('15', [])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_37_test.dart b/tests/language_2/async_nested_37_test.dart
new file mode 100644
index 0000000..a98b5d8
--- /dev/null
+++ b/tests/language_2/async_nested_37_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.
+
+// This has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [])),
+    new Node('4', [
+      new Node('5', [
+        new Node('6', []),
+        new Node('7', []),
+      ]),
+    ]),
+    await new Future.value(new Node('8', [
+      await new Future.value(new Node('9', [])),
+      await new Future.value(new Node('10', [
+        new Node('11', []),
+        new Node('12', []),
+        await new Future.value(new Node('13', [])),
+      ])),
+    ])),
+    await new Future.value(new Node('14', [])),
+    new Node('15', [
+      new Node('16', []),
+    ]),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_38_test.dart b/tests/language_2/async_nested_38_test.dart
new file mode 100644
index 0000000..c7e4b2a
--- /dev/null
+++ b/tests/language_2/async_nested_38_test.dart
@@ -0,0 +1,52 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    new Node('3', [
+      new Node('4', []),
+    ]),
+    new Node('5', []),
+    new Node('6', []),
+    await new Future.value(new Node('7', [])),
+    await new Future.value(new Node('8', [
+      await new Future.value(new Node('9', [])),
+      new Node('10', [
+        new Node('11', []),
+        await new Future.value(new Node('12', [])),
+      ]),
+    ])),
+    new Node('13', [
+      new Node('14', []),
+    ]),
+    await new Future.value(new Node('15', [])),
+    await new Future.value(new Node('16', [])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_39_test.dart b/tests/language_2/async_nested_39_test.dart
new file mode 100644
index 0000000..8ee3931
--- /dev/null
+++ b/tests/language_2/async_nested_39_test.dart
@@ -0,0 +1,43 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', []),
+    await new Future.value(new Node('3', [
+      new Node('4', []),
+      new Node('5', []),
+      await new Future.value(new Node('6', [
+        new Node('7', []),
+      ])),
+    ])),
+    new Node('8', []),
+    await new Future.value(new Node('9', [])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_40_test.dart b/tests/language_2/async_nested_40_test.dart
new file mode 100644
index 0000000..a53913a
--- /dev/null
+++ b/tests/language_2/async_nested_40_test.dart
@@ -0,0 +1,44 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9";
+  Node node = await new Future.value(new Node('1', [
+    new Node('2', [
+      new Node('3', [
+        new Node('4', []),
+      ]),
+    ]),
+    await new Future.value(new Node('5', [
+      new Node('6', []),
+      new Node('7', []),
+      await new Future.value(new Node('8', [])),
+    ])),
+    await new Future.value(new Node('9', [])),
+  ]));
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/async_nested_41_test.dart b/tests/language_2/async_nested_41_test.dart
new file mode 100644
index 0000000..dddc115
--- /dev/null
+++ b/tests/language_2/async_nested_41_test.dart
@@ -0,0 +1,43 @@
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+  String expected = "1 2 3 4 5 6 7 8 9";
+  Node node = new Node('1', [
+    await new Future.value(new Node('2', [])),
+    await new Future.value(new Node('3', [
+      new Node('4', []),
+      await new Future.value(new Node('5', [
+        new Node('6', []),
+      ])),
+      await new Future.value(new Node('7', [])),
+      new Node('8', []),
+    ])),
+    await new Future.value(new Node('9', [])),
+  ]);
+  String actual = node.toSimpleString();
+  print(actual);
+  if (actual != expected) {
+    throw "Expected '$expected' but got '$actual'";
+  }
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {}
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
diff --git a/tests/language_2/cyclic_type2_test.dart b/tests/language_2/cyclic_type2_test.dart
index c90cf23..0b62f2f 100644
--- a/tests/language_2/cyclic_type2_test.dart
+++ b/tests/language_2/cyclic_type2_test.dart
@@ -19,9 +19,13 @@
 
 main() {
   var d = new Derived1<Derived1, Derived2>();
-  Expect.equals("Derived1<Derived1, Derived2>", d.u.toString());
   Expect.equals(
-      "Derived1<Derived2<Derived2, Derived1>, Derived2>", d.v.toString());
+      "Derived1<Derived1<dynamic, dynamic>, Derived2<dynamic, dynamic>>",
+      d.u.toString());
+  Expect.equals(
+      "Derived1<Derived2<Derived2<dynamic, dynamic>, "
+      "Derived1<dynamic, dynamic>>, Derived2<dynamic, dynamic>>",
+      d.v.toString());
   Expect.isTrue(d is Derived1<Derived1, Derived2>);
   Expect.isFalse(d is Derived1<Derived1, Derived1>);
   Expect.isTrue(d is Base<Derived1<Derived1, Derived2>,
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 530aaec..8c33ba2 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -1,829 +1,61 @@
 # 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.
+
 # Sections in this file should contain "$compiler == dart2analyzer".
 
 [ $compiler == dart2analyzer && $runtime == none && !$fasta ]
 error_stacktrace_test/00: MissingCompileTimeError
 vm/lazy_deopt_with_exception_test: CompileTimeError
 
-[ $compiler == dart2analyzer && $checked && !$fasta && !$strong ]
-abstract_beats_arguments_test: MissingCompileTimeError
-abstract_exact_selector_test/01: MissingCompileTimeError
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
-assign_static_type_test/01: MissingCompileTimeError
-assign_static_type_test/03: MissingCompileTimeError
-assign_static_type_test/04: MissingCompileTimeError
-assign_static_type_test/05: MissingCompileTimeError
-assign_static_type_test/06: MissingCompileTimeError
-assign_to_type_test/01: MissingCompileTimeError
-assign_to_type_test/02: MissingCompileTimeError
-assign_to_type_test/03: MissingCompileTimeError
-assign_to_type_test/04: MissingCompileTimeError
-assign_top_method_test: MissingCompileTimeError
-async_await_syntax_test/a10a: MissingCompileTimeError
-async_await_syntax_test/b10a: MissingCompileTimeError
-async_await_syntax_test/c10a: MissingCompileTimeError
-async_await_syntax_test/d08b: MissingCompileTimeError
-async_await_syntax_test/d10a: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
-async_return_types_test/nestedFuture: MissingCompileTimeError
-async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
-async_return_types_test/wrongReturnType: MissingCompileTimeError
-async_return_types_test/wrongTypeParameter: MissingCompileTimeError
-bad_named_parameters2_test/01: MissingCompileTimeError
-bad_named_parameters_test/01: MissingCompileTimeError
-bad_named_parameters_test/02: MissingCompileTimeError
-bad_named_parameters_test/03: MissingCompileTimeError
-bad_named_parameters_test/04: MissingCompileTimeError
-bad_named_parameters_test/05: MissingCompileTimeError
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/06: MissingCompileTimeError
-bit_operations_test/03: StaticWarning
-bit_operations_test/04: StaticWarning
-call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/02: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/03: MissingCompileTimeError
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
-call_nonexistent_constructor_test/01: MissingCompileTimeError
-call_nonexistent_constructor_test/02: MissingCompileTimeError
-call_nonexistent_static_test/01: MissingCompileTimeError
-call_nonexistent_static_test/02: MissingCompileTimeError
-call_nonexistent_static_test/03: MissingCompileTimeError
-call_nonexistent_static_test/04: MissingCompileTimeError
-call_nonexistent_static_test/05: MissingCompileTimeError
-call_nonexistent_static_test/06: MissingCompileTimeError
-call_nonexistent_static_test/07: MissingCompileTimeError
-call_nonexistent_static_test/08: MissingCompileTimeError
-call_nonexistent_static_test/09: MissingCompileTimeError
-call_nonexistent_static_test/10: MissingCompileTimeError
-call_through_getter_test/01: MissingCompileTimeError
-call_through_getter_test/02: MissingCompileTimeError
-call_type_literal_test/01: MissingCompileTimeError
-callable_test/00: MissingCompileTimeError
-callable_test/01: MissingCompileTimeError
-check_member_static_test/01: MissingCompileTimeError
-check_method_override_test/01: MissingCompileTimeError
-check_method_override_test/02: MissingCompileTimeError
-constructor_call_as_function_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/02: MissingCompileTimeError
-constructor_duplicate_final_test/03: MissingCompileTimeError
-constructor_named_arguments_test/01: MissingCompileTimeError
-covariant_subtyping_with_substitution_test: StaticWarning
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/13: MissingCompileTimeError
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-dynamic_field_test/01: MissingCompileTimeError
-dynamic_field_test/02: MissingCompileTimeError
-emit_const_fields_test: Pass
-empty_block_case_test: MissingCompileTimeError
-enum_private_test/02: MissingCompileTimeError
-external_test/25: MissingCompileTimeError
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory1_test/00: MissingCompileTimeError
-factory1_test/01: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
-factory2_test/none: MissingCompileTimeError
-factory3_test/none: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-factory5_test/00: MissingCompileTimeError
-factory6_test/00: MissingCompileTimeError
-factory_redirection_test/01: MissingCompileTimeError
-factory_redirection_test/02: MissingCompileTimeError
-factory_redirection_test/03: MissingCompileTimeError
-factory_redirection_test/05: MissingCompileTimeError
-factory_redirection_test/06: MissingCompileTimeError
-factory_redirection_test/08: MissingCompileTimeError
-factory_redirection_test/09: MissingCompileTimeError
-factory_redirection_test/10: MissingCompileTimeError
-factory_redirection_test/11: MissingCompileTimeError
-factory_redirection_test/12: MissingCompileTimeError
-factory_redirection_test/13: MissingCompileTimeError
-factory_redirection_test/14: MissingCompileTimeError
-factory_redirection_test/none: MissingCompileTimeError
-factory_return_type_checked_test/00: MissingCompileTimeError
-field_initialization_order_test/01: MissingCompileTimeError
-field_method4_test: MissingCompileTimeError
-field_override2_test: MissingCompileTimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
-field_override_test/02: MissingCompileTimeError
-field_override_test/none: MissingCompileTimeError
-field_type_check_test/01: MissingCompileTimeError
-final_attempt_reinitialization_test/01: MissingCompileTimeError
-final_attempt_reinitialization_test/02: MissingCompileTimeError
-final_for_in_variable_test: MissingCompileTimeError
-final_param_test: MissingCompileTimeError
-final_super_field_set_test: MissingCompileTimeError
-final_syntax_test/10: MissingCompileTimeError
-final_variable_assignment_test/01: MissingCompileTimeError
-final_variable_assignment_test/02: MissingCompileTimeError
-final_variable_assignment_test/03: MissingCompileTimeError
-final_variable_assignment_test/04: MissingCompileTimeError
-first_class_types_literals_test/03: MissingCompileTimeError
-first_class_types_literals_test/04: MissingCompileTimeError
-first_class_types_literals_test/05: MissingCompileTimeError
-first_class_types_literals_test/06: MissingCompileTimeError
-first_class_types_literals_test/07: MissingCompileTimeError
-first_class_types_literals_test/08: MissingCompileTimeError
-first_class_types_literals_test/09: MissingCompileTimeError
-first_class_types_literals_test/10: MissingCompileTimeError
-first_class_types_literals_test/11: MissingCompileTimeError
-first_class_types_literals_test/12: MissingCompileTimeError
-for_in3_test: MissingCompileTimeError
-for_in_side_effects_test/01: MissingCompileTimeError
-function_malformed_result_type_test/00: MissingCompileTimeError
-function_type_call_getter2_test/00: MissingCompileTimeError
-function_type_call_getter2_test/01: MissingCompileTimeError
-function_type_call_getter2_test/02: MissingCompileTimeError
-function_type_call_getter2_test/03: MissingCompileTimeError
-function_type_call_getter2_test/04: MissingCompileTimeError
-function_type_call_getter2_test/05: MissingCompileTimeError
-generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_dynamic_test/01: MissingCompileTimeError
-generic_methods_dynamic_test/03: MissingCompileTimeError
-generic_methods_overriding_test/03: MissingCompileTimeError
-generic_methods_overriding_test/06: StaticWarning
-generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_no_such_method_dispatcher_test: StaticWarning
-generic_tearoff_test: CompileTimeError
-getter_no_setter2_test/00: MissingCompileTimeError
-getter_no_setter2_test/01: MissingCompileTimeError
-getter_no_setter2_test/03: MissingCompileTimeError
-getter_no_setter_test/00: MissingCompileTimeError
-getter_no_setter_test/01: MissingCompileTimeError
-getter_no_setter_test/03: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
-getters_setters2_test/02: MissingCompileTimeError
-method_override2_test/*: MissingCompileTimeError
-method_override2_test/none: Pass
-method_override3_test/*: MissingCompileTimeError
-method_override3_test/none: Pass
-method_override4_test/*: MissingCompileTimeError
-method_override4_test/none: Pass
-method_override5_test/*: MissingCompileTimeError
-method_override5_test/none: Pass
-method_override6_test/*: MissingCompileTimeError
-method_override6_test/none: Pass
-method_override8_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/13: MissingCompileTimeError
-mixin_illegal_constructor_test/14: MissingCompileTimeError
-mixin_illegal_constructor_test/15: MissingCompileTimeError
-mixin_illegal_constructor_test/16: MissingCompileTimeError
-mixin_illegal_static_access_test/01: MissingCompileTimeError
-mixin_illegal_static_access_test/02: MissingCompileTimeError
-mixin_illegal_syntax_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/02: MissingCompileTimeError
-mixin_invalid_bound2_test/03: MissingCompileTimeError
-mixin_invalid_bound2_test/04: MissingCompileTimeError
-mixin_invalid_bound2_test/05: MissingCompileTimeError
-mixin_invalid_bound2_test/06: MissingCompileTimeError
-mixin_invalid_bound2_test/07: MissingCompileTimeError
-mixin_invalid_bound2_test/08: MissingCompileTimeError
-mixin_invalid_bound2_test/09: MissingCompileTimeError
-mixin_invalid_bound2_test/10: MissingCompileTimeError
-mixin_invalid_bound2_test/11: MissingCompileTimeError
-mixin_invalid_bound2_test/12: MissingCompileTimeError
-mixin_invalid_bound2_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/14: MissingCompileTimeError
-mixin_invalid_bound2_test/15: MissingCompileTimeError
-mixin_invalid_bound_test/02: MissingCompileTimeError
-mixin_invalid_bound_test/03: MissingCompileTimeError
-mixin_invalid_bound_test/04: MissingCompileTimeError
-mixin_invalid_bound_test/05: MissingCompileTimeError
-mixin_invalid_bound_test/06: MissingCompileTimeError
-mixin_invalid_bound_test/07: MissingCompileTimeError
-mixin_invalid_bound_test/08: MissingCompileTimeError
-mixin_invalid_bound_test/09: MissingCompileTimeError
-mixin_invalid_bound_test/10: MissingCompileTimeError
-mixin_of_mixin_test/01: MissingCompileTimeError
-mixin_of_mixin_test/02: MissingCompileTimeError
-mixin_of_mixin_test/03: MissingCompileTimeError
-mixin_of_mixin_test/04: MissingCompileTimeError
-mixin_of_mixin_test/05: MissingCompileTimeError
-mixin_of_mixin_test/06: MissingCompileTimeError
-mixin_super_2_test/01: MissingCompileTimeError
-mixin_super_2_test/03: MissingCompileTimeError
-mixin_super_bound_test/01: MissingCompileTimeError
-mixin_super_bound_test/02: MissingCompileTimeError
-mixin_supertype_subclass_test/02: MissingCompileTimeError
-mixin_supertype_subclass_test/05: MissingCompileTimeError
-mixin_type_parameters_errors_test/01: MissingCompileTimeError
-mixin_type_parameters_errors_test/02: MissingCompileTimeError
-mixin_type_parameters_errors_test/03: MissingCompileTimeError
-mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mixin_type_parameters_errors_test/05: MissingCompileTimeError
-mixin_with_two_implicit_constructors_test: MissingCompileTimeError
-multiline_newline_test/01: CompileTimeError
-multiline_newline_test/01r: CompileTimeError
-multiline_newline_test/02: CompileTimeError
-multiline_newline_test/02r: CompileTimeError
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-named_constructor_test/01: MissingCompileTimeError
-named_constructor_test/03: MissingCompileTimeError
-named_parameters2_test: MissingCompileTimeError
-named_parameters3_test: MissingCompileTimeError
-named_parameters4_test: MissingCompileTimeError
-named_parameters_aggregated_test/05: MissingCompileTimeError
-new_expression_type_args_test/00: MissingCompileTimeError
-new_expression_type_args_test/01: MissingCompileTimeError
-new_expression_type_args_test/02: MissingCompileTimeError
-new_prefix_test/01: MissingCompileTimeError
-no_such_constructor_test/01: MissingCompileTimeError
-no_such_method_dispatcher_test: Pass
-not_enough_positional_arguments_test/00: MissingCompileTimeError
-not_enough_positional_arguments_test/02: MissingCompileTimeError
-not_enough_positional_arguments_test/03: MissingCompileTimeError
-not_enough_positional_arguments_test/05: MissingCompileTimeError
-not_enough_positional_arguments_test/06: MissingCompileTimeError
-not_enough_positional_arguments_test/07: MissingCompileTimeError
-optional_named_parameters_test/01: MissingCompileTimeError
-optional_named_parameters_test/02: MissingCompileTimeError
-optional_named_parameters_test/03: MissingCompileTimeError
-optional_named_parameters_test/04: MissingCompileTimeError
-optional_named_parameters_test/05: MissingCompileTimeError
-optional_named_parameters_test/06: MissingCompileTimeError
-optional_named_parameters_test/07: MissingCompileTimeError
-optional_named_parameters_test/08: MissingCompileTimeError
-optional_named_parameters_test/09: MissingCompileTimeError
-override_field_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/*: Skip # Tests Dart 2 semantics
-override_inheritance_field_test/05: MissingCompileTimeError
-override_inheritance_field_test/07: MissingCompileTimeError
-override_inheritance_field_test/08: MissingCompileTimeError
-override_inheritance_field_test/09: MissingCompileTimeError
-override_inheritance_field_test/10: MissingCompileTimeError
-override_inheritance_field_test/11: MissingCompileTimeError
-override_inheritance_field_test/28: MissingCompileTimeError
-override_inheritance_field_test/30: MissingCompileTimeError
-override_inheritance_field_test/31: MissingCompileTimeError
-override_inheritance_field_test/32: MissingCompileTimeError
-override_inheritance_field_test/33: MissingCompileTimeError
-override_inheritance_field_test/33a: MissingCompileTimeError
-override_inheritance_field_test/34: MissingCompileTimeError
-override_inheritance_field_test/44: MissingCompileTimeError
-override_inheritance_field_test/47: MissingCompileTimeError
-override_inheritance_field_test/48: MissingCompileTimeError
-override_inheritance_field_test/53: MissingCompileTimeError
-override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/04: MissingCompileTimeError
-override_inheritance_generic_test/06: MissingCompileTimeError
-override_inheritance_generic_test/07: MissingCompileTimeError
-override_inheritance_generic_test/08: MissingCompileTimeError
-override_inheritance_generic_test/09: MissingCompileTimeError
-override_inheritance_generic_test/10: MissingCompileTimeError
-override_inheritance_method_test/04: MissingCompileTimeError
-override_inheritance_method_test/05: MissingCompileTimeError
-override_inheritance_method_test/06: MissingCompileTimeError
-override_inheritance_method_test/11: MissingCompileTimeError
-override_inheritance_method_test/12: MissingCompileTimeError
-override_inheritance_method_test/13: MissingCompileTimeError
-override_inheritance_method_test/14: MissingCompileTimeError
-override_inheritance_method_test/19: MissingCompileTimeError
-override_inheritance_method_test/20: MissingCompileTimeError
-override_inheritance_method_test/21: MissingCompileTimeError
-override_inheritance_method_test/27: MissingCompileTimeError
-override_inheritance_method_test/30: MissingCompileTimeError
-override_inheritance_method_test/31: MissingCompileTimeError
-override_inheritance_method_test/32: MissingCompileTimeError
-override_inheritance_method_test/33: MissingCompileTimeError
-override_inheritance_mixed_test/06: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
-override_inheritance_no_such_method_test/06: MissingCompileTimeError
-override_inheritance_no_such_method_test/07: MissingCompileTimeError
-override_inheritance_no_such_method_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/10: MissingCompileTimeError
-override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_method_with_field_test/02: MissingCompileTimeError
-parser_quirks_test: StaticWarning
-part2_test/01: MissingCompileTimeError
-static_field1_test/01: MissingCompileTimeError
-static_field1a_test/01: MissingCompileTimeError
-static_field3_test/01: MissingCompileTimeError
-static_field3_test/02: MissingCompileTimeError
-static_field3_test/03: MissingCompileTimeError
-static_field3_test/04: MissingCompileTimeError
-static_field_test/01: MissingCompileTimeError
-static_field_test/02: MissingCompileTimeError
-static_field_test/03: MissingCompileTimeError
-static_field_test/04: MissingCompileTimeError
-static_final_field2_test/01: MissingCompileTimeError
-static_getter_no_setter1_test/01: MissingCompileTimeError
-static_getter_no_setter2_test/01: MissingCompileTimeError
-static_getter_no_setter3_test/01: MissingCompileTimeError
-static_initializer_type_error_test: MissingCompileTimeError
-static_setter_get_test/01: MissingCompileTimeError
-string_test/01: MissingCompileTimeError
-string_unicode1_negative_test: CompileTimeError
-string_unicode2_negative_test: CompileTimeError
-string_unicode3_negative_test: CompileTimeError
-string_unicode4_negative_test: CompileTimeError
-super_bound_closure_test/01: MissingCompileTimeError
-super_operator_index_test/01: MissingCompileTimeError
-super_operator_index_test/02: MissingCompileTimeError
-super_operator_index_test/03: MissingCompileTimeError
-super_operator_index_test/04: MissingCompileTimeError
-super_operator_index_test/05: MissingCompileTimeError
-super_operator_index_test/06: MissingCompileTimeError
-super_operator_index_test/07: MissingCompileTimeError
-switch_case_warn_test/01: MissingCompileTimeError
-switch_case_warn_test/02: MissingCompileTimeError
-switch_case_warn_test/03: MissingCompileTimeError
-switch_case_warn_test/04: MissingCompileTimeError
-switch_case_warn_test/05: MissingCompileTimeError
-switch_case_warn_test/06: MissingCompileTimeError
-switch_case_warn_test/07: MissingCompileTimeError
-switch_case_warn_test/08: MissingCompileTimeError
-switch_case_warn_test/09: MissingCompileTimeError
-switch_case_warn_test/10: MissingCompileTimeError
-switch_case_warn_test/11: MissingCompileTimeError
-switch_case_warn_test/12: MissingCompileTimeError
-switch_case_warn_test/13: MissingCompileTimeError
-switch_case_warn_test/14: MissingCompileTimeError
-switch_case_warn_test/15: MissingCompileTimeError
-switch_case_warn_test/16: MissingCompileTimeError
-switch_case_warn_test/17: MissingCompileTimeError
-switch_fallthru_test/01: MissingCompileTimeError
-type_variable_identifier_expression_test: MissingCompileTimeError
-type_variable_static_context_test: MissingCompileTimeError
-unresolved_in_factory_test: MissingCompileTimeError
-
-[ $compiler == dart2analyzer && !$checked && !$fasta && !$strong ]
-abstract_beats_arguments_test: MissingCompileTimeError
-abstract_exact_selector_test/01: MissingCompileTimeError
-abstract_factory_constructor_test/00: MissingCompileTimeError
-abstract_getter_test/01: MissingCompileTimeError
-abstract_syntax_test/00: MissingCompileTimeError
-assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc03: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc04: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc05: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc06: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc07: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc08: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
-assign_static_type_test/01: MissingCompileTimeError
-assign_static_type_test/02: MissingCompileTimeError
-assign_static_type_test/03: MissingCompileTimeError
-assign_static_type_test/04: MissingCompileTimeError
-assign_static_type_test/05: MissingCompileTimeError
-assign_static_type_test/06: MissingCompileTimeError
-assign_to_type_test/01: MissingCompileTimeError
-assign_to_type_test/02: MissingCompileTimeError
-assign_to_type_test/03: MissingCompileTimeError
-assign_to_type_test/04: MissingCompileTimeError
-assign_top_method_test: MissingCompileTimeError
-async_await_syntax_test/a10a: MissingCompileTimeError
-async_await_syntax_test/b10a: MissingCompileTimeError
-async_await_syntax_test/c10a: MissingCompileTimeError
-async_await_syntax_test/d08b: MissingCompileTimeError
-async_await_syntax_test/d10a: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
-async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
-async_return_types_test/nestedFuture: MissingCompileTimeError
-async_return_types_test/tooManyTypeParameters: MissingCompileTimeError
-async_return_types_test/wrongReturnType: MissingCompileTimeError
-async_return_types_test/wrongTypeParameter: MissingCompileTimeError
-bad_named_parameters2_test/01: MissingCompileTimeError
-bad_named_parameters_test/01: MissingCompileTimeError
-bad_named_parameters_test/02: MissingCompileTimeError
-bad_named_parameters_test/03: MissingCompileTimeError
-bad_named_parameters_test/04: MissingCompileTimeError
-bad_named_parameters_test/05: MissingCompileTimeError
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/06: MissingCompileTimeError
-bit_operations_test/03: StaticWarning
-bit_operations_test/04: StaticWarning
-call_constructor_on_unresolvable_class_test/01: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/02: MissingCompileTimeError
-call_constructor_on_unresolvable_class_test/03: MissingCompileTimeError
-call_non_method_field_test/01: MissingCompileTimeError
-call_non_method_field_test/02: MissingCompileTimeError
-call_nonexistent_constructor_test/01: MissingCompileTimeError
-call_nonexistent_constructor_test/02: MissingCompileTimeError
-call_nonexistent_static_test/01: MissingCompileTimeError
-call_nonexistent_static_test/02: MissingCompileTimeError
-call_nonexistent_static_test/03: MissingCompileTimeError
-call_nonexistent_static_test/04: MissingCompileTimeError
-call_nonexistent_static_test/05: MissingCompileTimeError
-call_nonexistent_static_test/06: MissingCompileTimeError
-call_nonexistent_static_test/07: MissingCompileTimeError
-call_nonexistent_static_test/08: MissingCompileTimeError
-call_nonexistent_static_test/09: MissingCompileTimeError
-call_nonexistent_static_test/10: MissingCompileTimeError
-call_through_getter_test/01: MissingCompileTimeError
-call_through_getter_test/02: MissingCompileTimeError
-call_type_literal_test/01: MissingCompileTimeError
-callable_test/00: MissingCompileTimeError
-callable_test/01: MissingCompileTimeError
-check_member_static_test/01: MissingCompileTimeError
-check_method_override_test/01: MissingCompileTimeError
-check_method_override_test/02: MissingCompileTimeError
-const_cast1_test/02: MissingCompileTimeError
-const_constructor2_test/13: MissingCompileTimeError
-const_constructor2_test/14: MissingCompileTimeError
-const_constructor2_test/15: MissingCompileTimeError
-const_constructor2_test/16: MissingCompileTimeError
-const_constructor2_test/17: MissingCompileTimeError
-const_constructor2_test/18: MissingCompileTimeError
-const_constructor2_test/20: MissingCompileTimeError
-const_constructor2_test/22: MissingCompileTimeError
-const_constructor2_test/24: MissingCompileTimeError
-const_constructor3_test/02: MissingCompileTimeError
-const_constructor3_test/04: MissingCompileTimeError
-const_init2_test/02: MissingCompileTimeError
-constructor_call_as_function_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/02: MissingCompileTimeError
-constructor_named_arguments_test/01: MissingCompileTimeError
-covariant_subtyping_with_substitution_test: StaticWarning
-cyclic_type_variable_test/01: MissingCompileTimeError
-cyclic_type_variable_test/02: MissingCompileTimeError
-cyclic_type_variable_test/03: MissingCompileTimeError
-cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/13: MissingCompileTimeError
-default_factory2_test/01: MissingCompileTimeError
-default_factory_test/01: MissingCompileTimeError
-deferred_constraints_type_annotation_test/as_operation: MissingCompileTimeError
-deferred_constraints_type_annotation_test/catch_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/is_check: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_before_load: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/new_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic1: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic2: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic3: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_generic4: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_null: MissingCompileTimeError
-deferred_constraints_type_annotation_test/type_annotation_top_level: MissingCompileTimeError
-deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
-dynamic_field_test/01: MissingCompileTimeError
-dynamic_field_test/02: MissingCompileTimeError
-emit_const_fields_test: Pass
-empty_block_case_test: MissingCompileTimeError
-enum_private_test/02: MissingCompileTimeError
-external_test/25: MissingCompileTimeError
-f_bounded_quantification_test/01: MissingCompileTimeError
-f_bounded_quantification_test/02: MissingCompileTimeError
-factory1_test/00: MissingCompileTimeError
-factory1_test/01: MissingCompileTimeError
-factory2_test/03: MissingCompileTimeError
-factory2_test/none: MissingCompileTimeError
-factory3_test/none: MissingCompileTimeError
-factory4_test/00: MissingCompileTimeError
-factory5_test/00: MissingCompileTimeError
-factory6_test/00: MissingCompileTimeError
-factory_redirection_test/01: MissingCompileTimeError
-factory_redirection_test/02: MissingCompileTimeError
-factory_redirection_test/03: MissingCompileTimeError
-factory_redirection_test/05: MissingCompileTimeError
-factory_redirection_test/06: MissingCompileTimeError
-factory_redirection_test/08: MissingCompileTimeError
-factory_redirection_test/09: MissingCompileTimeError
-factory_redirection_test/10: MissingCompileTimeError
-factory_redirection_test/11: MissingCompileTimeError
-factory_redirection_test/12: MissingCompileTimeError
-factory_redirection_test/13: MissingCompileTimeError
-factory_redirection_test/14: MissingCompileTimeError
-factory_redirection_test/none: MissingCompileTimeError
-factory_return_type_checked_test/00: MissingCompileTimeError
-field_initialization_order_test/01: MissingCompileTimeError
-field_method4_test: MissingCompileTimeError
-field_override2_test: MissingCompileTimeError
-field_override_test/00: MissingCompileTimeError
-field_override_test/01: MissingCompileTimeError
-field_override_test/02: MissingCompileTimeError
-field_override_test/none: MissingCompileTimeError
-field_type_check_test/01: MissingCompileTimeError
-final_attempt_reinitialization_test/01: MissingCompileTimeError
-final_attempt_reinitialization_test/02: MissingCompileTimeError
-final_for_in_variable_test: MissingCompileTimeError
-final_param_test: MissingCompileTimeError
-final_super_field_set_test: MissingCompileTimeError
-final_syntax_test/10: MissingCompileTimeError
-final_variable_assignment_test/01: MissingCompileTimeError
-final_variable_assignment_test/02: MissingCompileTimeError
-final_variable_assignment_test/03: MissingCompileTimeError
-final_variable_assignment_test/04: MissingCompileTimeError
-first_class_types_literals_test/03: MissingCompileTimeError
-first_class_types_literals_test/04: MissingCompileTimeError
-first_class_types_literals_test/05: MissingCompileTimeError
-first_class_types_literals_test/06: MissingCompileTimeError
-first_class_types_literals_test/07: MissingCompileTimeError
-first_class_types_literals_test/08: MissingCompileTimeError
-first_class_types_literals_test/09: MissingCompileTimeError
-first_class_types_literals_test/10: MissingCompileTimeError
-first_class_types_literals_test/11: MissingCompileTimeError
-first_class_types_literals_test/12: MissingCompileTimeError
-for_in3_test: MissingCompileTimeError
-for_in_side_effects_test/01: MissingCompileTimeError
-function_malformed_result_type_test/00: MissingCompileTimeError
-function_type_call_getter2_test/00: MissingCompileTimeError
-function_type_call_getter2_test/01: MissingCompileTimeError
-function_type_call_getter2_test/02: MissingCompileTimeError
-function_type_call_getter2_test/03: MissingCompileTimeError
-function_type_call_getter2_test/04: MissingCompileTimeError
-function_type_call_getter2_test/05: MissingCompileTimeError
-generic_methods_bounds_test/01: MissingCompileTimeError
-generic_methods_dynamic_test/01: MissingCompileTimeError
-generic_methods_dynamic_test/03: MissingCompileTimeError
-generic_methods_overriding_test/01: MissingCompileTimeError
-generic_methods_overriding_test/03: MissingCompileTimeError
-generic_methods_overriding_test/06: StaticWarning
-generic_methods_recursive_bound_test/02: MissingCompileTimeError
-generic_no_such_method_dispatcher_test: StaticWarning
-generic_tearoff_test: CompileTimeError
-getter_no_setter2_test/00: MissingCompileTimeError
-getter_no_setter2_test/01: MissingCompileTimeError
-getter_no_setter2_test/03: MissingCompileTimeError
-getter_no_setter_test/00: MissingCompileTimeError
-getter_no_setter_test/01: MissingCompileTimeError
-getter_no_setter_test/03: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
-getters_setters2_test/02: MissingCompileTimeError
-identical_const_test/01: MissingCompileTimeError
-identical_const_test/02: MissingCompileTimeError
-identical_const_test/03: MissingCompileTimeError
-identical_const_test/04: MissingCompileTimeError
-if_null_assignment_behavior_test/03: MissingCompileTimeError
-if_null_assignment_behavior_test/13: MissingCompileTimeError
-if_null_assignment_behavior_test/15: MissingCompileTimeError
-if_null_assignment_static_test/02: MissingCompileTimeError
-if_null_assignment_static_test/04: MissingCompileTimeError
-if_null_assignment_static_test/06: MissingCompileTimeError
-if_null_assignment_static_test/07: MissingCompileTimeError
-if_null_assignment_static_test/09: MissingCompileTimeError
-if_null_assignment_static_test/11: MissingCompileTimeError
-if_null_assignment_static_test/13: MissingCompileTimeError
-if_null_assignment_static_test/14: MissingCompileTimeError
-if_null_assignment_static_test/16: MissingCompileTimeError
-if_null_assignment_static_test/18: MissingCompileTimeError
-if_null_assignment_static_test/20: MissingCompileTimeError
-if_null_assignment_static_test/21: MissingCompileTimeError
-if_null_assignment_static_test/23: MissingCompileTimeError
-if_null_assignment_static_test/25: MissingCompileTimeError
-if_null_assignment_static_test/27: MissingCompileTimeError
-if_null_assignment_static_test/28: MissingCompileTimeError
-if_null_assignment_static_test/30: MissingCompileTimeError
-if_null_assignment_static_test/32: MissingCompileTimeError
-if_null_assignment_static_test/34: MissingCompileTimeError
-if_null_assignment_static_test/35: MissingCompileTimeError
-if_null_assignment_static_test/37: MissingCompileTimeError
-if_null_assignment_static_test/39: MissingCompileTimeError
-if_null_assignment_static_test/41: MissingCompileTimeError
-if_null_assignment_static_test/42: MissingCompileTimeError
-if_null_precedence_test/06: MissingCompileTimeError
-if_null_precedence_test/07: MissingCompileTimeError
-is_not_class2_test/*: MissingCompileTimeError
-library_ambiguous_test/04: MissingCompileTimeError
-list_literal1_test/01: MissingCompileTimeError
-malformed2_test/00: MissingCompileTimeError
-map_literal1_test/01: MissingCompileTimeError
-method_override2_test/00: MissingCompileTimeError
-method_override2_test/01: MissingCompileTimeError
-method_override2_test/02: MissingCompileTimeError
-method_override2_test/03: MissingCompileTimeError
-method_override3_test/00: MissingCompileTimeError
-method_override3_test/01: MissingCompileTimeError
-method_override3_test/02: MissingCompileTimeError
-method_override4_test/01: MissingCompileTimeError
-method_override4_test/02: MissingCompileTimeError
-method_override4_test/03: MissingCompileTimeError
-method_override5_test/01: MissingCompileTimeError
-method_override5_test/02: MissingCompileTimeError
-method_override5_test/03: MissingCompileTimeError
-method_override6_test/01: MissingCompileTimeError
-method_override6_test/02: MissingCompileTimeError
-method_override6_test/03: MissingCompileTimeError
-method_override8_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/13: MissingCompileTimeError
-mixin_illegal_constructor_test/14: MissingCompileTimeError
-mixin_illegal_constructor_test/15: MissingCompileTimeError
-mixin_illegal_constructor_test/16: MissingCompileTimeError
-mixin_illegal_static_access_test/01: MissingCompileTimeError
-mixin_illegal_static_access_test/02: MissingCompileTimeError
-mixin_illegal_syntax_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/02: MissingCompileTimeError
-mixin_invalid_bound2_test/03: MissingCompileTimeError
-mixin_invalid_bound2_test/04: MissingCompileTimeError
-mixin_invalid_bound2_test/05: MissingCompileTimeError
-mixin_invalid_bound2_test/06: MissingCompileTimeError
-mixin_invalid_bound2_test/07: MissingCompileTimeError
-mixin_invalid_bound2_test/08: MissingCompileTimeError
-mixin_invalid_bound2_test/09: MissingCompileTimeError
-mixin_invalid_bound2_test/10: MissingCompileTimeError
-mixin_invalid_bound2_test/11: MissingCompileTimeError
-mixin_invalid_bound2_test/12: MissingCompileTimeError
-mixin_invalid_bound2_test/13: MissingCompileTimeError
-mixin_invalid_bound2_test/14: MissingCompileTimeError
-mixin_invalid_bound2_test/15: MissingCompileTimeError
-mixin_invalid_bound_test/02: MissingCompileTimeError
-mixin_invalid_bound_test/03: MissingCompileTimeError
-mixin_invalid_bound_test/04: MissingCompileTimeError
-mixin_invalid_bound_test/05: MissingCompileTimeError
-mixin_invalid_bound_test/06: MissingCompileTimeError
-mixin_invalid_bound_test/07: MissingCompileTimeError
-mixin_invalid_bound_test/08: MissingCompileTimeError
-mixin_invalid_bound_test/09: MissingCompileTimeError
-mixin_invalid_bound_test/10: MissingCompileTimeError
-mixin_of_mixin_test/01: MissingCompileTimeError
-mixin_of_mixin_test/02: MissingCompileTimeError
-mixin_of_mixin_test/03: MissingCompileTimeError
-mixin_of_mixin_test/04: MissingCompileTimeError
-mixin_of_mixin_test/05: MissingCompileTimeError
-mixin_of_mixin_test/06: MissingCompileTimeError
-mixin_super_2_test/01: MissingCompileTimeError
-mixin_super_2_test/03: MissingCompileTimeError
-mixin_super_bound_test/01: MissingCompileTimeError
-mixin_super_bound_test/02: MissingCompileTimeError
-mixin_supertype_subclass_test/02: MissingCompileTimeError
-mixin_supertype_subclass_test/05: MissingCompileTimeError
-mixin_type_parameters_errors_test/01: MissingCompileTimeError
-mixin_type_parameters_errors_test/02: MissingCompileTimeError
-mixin_type_parameters_errors_test/03: MissingCompileTimeError
-mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mixin_type_parameters_errors_test/05: MissingCompileTimeError
-mixin_with_two_implicit_constructors_test: MissingCompileTimeError
-multiline_newline_test/01: CompileTimeError
-multiline_newline_test/01r: CompileTimeError
-multiline_newline_test/02: CompileTimeError
-multiline_newline_test/02r: CompileTimeError
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-named_constructor_test/01: MissingCompileTimeError
-named_constructor_test/03: MissingCompileTimeError
-named_parameters2_test: MissingCompileTimeError
-named_parameters3_test: MissingCompileTimeError
-named_parameters4_test: MissingCompileTimeError
-named_parameters_aggregated_test/05: MissingCompileTimeError
-new_expression_type_args_test/00: MissingCompileTimeError
-new_expression_type_args_test/01: MissingCompileTimeError
-new_expression_type_args_test/02: MissingCompileTimeError
-new_prefix_test/01: MissingCompileTimeError
-no_such_constructor_test/01: MissingCompileTimeError
-not_enough_positional_arguments_test/00: MissingCompileTimeError
-not_enough_positional_arguments_test/02: MissingCompileTimeError
-not_enough_positional_arguments_test/03: MissingCompileTimeError
-not_enough_positional_arguments_test/05: MissingCompileTimeError
-not_enough_positional_arguments_test/06: MissingCompileTimeError
-not_enough_positional_arguments_test/07: MissingCompileTimeError
-optional_named_parameters_test/01: MissingCompileTimeError
-optional_named_parameters_test/02: MissingCompileTimeError
-optional_named_parameters_test/03: MissingCompileTimeError
-optional_named_parameters_test/04: MissingCompileTimeError
-optional_named_parameters_test/05: MissingCompileTimeError
-optional_named_parameters_test/06: MissingCompileTimeError
-optional_named_parameters_test/07: MissingCompileTimeError
-optional_named_parameters_test/08: MissingCompileTimeError
-optional_named_parameters_test/09: MissingCompileTimeError
-override_field_test/02: MissingCompileTimeError
-override_inheritance_abstract_test/*: Skip # Tests Dart 2 semantics
-override_inheritance_field_test/05: MissingCompileTimeError
-override_inheritance_field_test/07: MissingCompileTimeError
-override_inheritance_field_test/08: MissingCompileTimeError
-override_inheritance_field_test/09: MissingCompileTimeError
-override_inheritance_field_test/10: MissingCompileTimeError
-override_inheritance_field_test/11: MissingCompileTimeError
-override_inheritance_field_test/28: MissingCompileTimeError
-override_inheritance_field_test/30: MissingCompileTimeError
-override_inheritance_field_test/31: MissingCompileTimeError
-override_inheritance_field_test/32: MissingCompileTimeError
-override_inheritance_field_test/33: MissingCompileTimeError
-override_inheritance_field_test/33a: MissingCompileTimeError
-override_inheritance_field_test/34: MissingCompileTimeError
-override_inheritance_field_test/44: MissingCompileTimeError
-override_inheritance_field_test/47: MissingCompileTimeError
-override_inheritance_field_test/48: MissingCompileTimeError
-override_inheritance_field_test/53: MissingCompileTimeError
-override_inheritance_field_test/54: MissingCompileTimeError
-override_inheritance_generic_test/04: MissingCompileTimeError
-override_inheritance_generic_test/06: MissingCompileTimeError
-override_inheritance_generic_test/07: MissingCompileTimeError
-override_inheritance_generic_test/08: MissingCompileTimeError
-override_inheritance_generic_test/09: MissingCompileTimeError
-override_inheritance_generic_test/10: MissingCompileTimeError
-override_inheritance_method_test/04: MissingCompileTimeError
-override_inheritance_method_test/05: MissingCompileTimeError
-override_inheritance_method_test/06: MissingCompileTimeError
-override_inheritance_method_test/11: MissingCompileTimeError
-override_inheritance_method_test/12: MissingCompileTimeError
-override_inheritance_method_test/13: MissingCompileTimeError
-override_inheritance_method_test/14: MissingCompileTimeError
-override_inheritance_method_test/19: MissingCompileTimeError
-override_inheritance_method_test/20: MissingCompileTimeError
-override_inheritance_method_test/21: MissingCompileTimeError
-override_inheritance_method_test/27: MissingCompileTimeError
-override_inheritance_method_test/30: MissingCompileTimeError
-override_inheritance_method_test/31: MissingCompileTimeError
-override_inheritance_method_test/32: MissingCompileTimeError
-override_inheritance_method_test/33: MissingCompileTimeError
-override_inheritance_mixed_test/06: MissingCompileTimeError
-override_inheritance_mixed_test/07: MissingCompileTimeError
-override_inheritance_mixed_test/08: MissingCompileTimeError
-override_inheritance_mixed_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/01: MissingCompileTimeError
-override_inheritance_no_such_method_test/02: MissingCompileTimeError
-override_inheritance_no_such_method_test/06: MissingCompileTimeError
-override_inheritance_no_such_method_test/07: MissingCompileTimeError
-override_inheritance_no_such_method_test/09: MissingCompileTimeError
-override_inheritance_no_such_method_test/10: MissingCompileTimeError
-override_inheritance_no_such_method_test/12: MissingCompileTimeError
-override_method_with_field_test/02: MissingCompileTimeError
-parser_quirks_test: StaticWarning
-part2_test/01: MissingCompileTimeError
-static_field1_test/01: MissingCompileTimeError
-static_field1a_test/01: MissingCompileTimeError
-static_field3_test/01: MissingCompileTimeError
-static_field3_test/02: MissingCompileTimeError
-static_field3_test/03: MissingCompileTimeError
-static_field3_test/04: MissingCompileTimeError
-static_field_test/01: MissingCompileTimeError
-static_field_test/02: MissingCompileTimeError
-static_field_test/03: MissingCompileTimeError
-static_field_test/04: MissingCompileTimeError
-static_final_field2_test/01: MissingCompileTimeError
-static_getter_no_setter1_test/01: MissingCompileTimeError
-static_getter_no_setter2_test/01: MissingCompileTimeError
-static_getter_no_setter3_test/01: MissingCompileTimeError
-static_initializer_type_error_test: MissingCompileTimeError
-static_setter_get_test/01: MissingCompileTimeError
-string_test/01: MissingCompileTimeError
-string_unicode1_negative_test: CompileTimeError
-string_unicode2_negative_test: CompileTimeError
-string_unicode3_negative_test: CompileTimeError
-string_unicode4_negative_test: CompileTimeError
-super_bound_closure_test/01: MissingCompileTimeError
-super_operator_index_test/01: MissingCompileTimeError
-super_operator_index_test/02: MissingCompileTimeError
-super_operator_index_test/03: MissingCompileTimeError
-super_operator_index_test/04: MissingCompileTimeError
-super_operator_index_test/05: MissingCompileTimeError
-super_operator_index_test/06: MissingCompileTimeError
-super_operator_index_test/07: MissingCompileTimeError
-switch_case_warn_test/01: MissingCompileTimeError
-switch_case_warn_test/02: MissingCompileTimeError
-switch_case_warn_test/03: MissingCompileTimeError
-switch_case_warn_test/04: MissingCompileTimeError
-switch_case_warn_test/05: MissingCompileTimeError
-switch_case_warn_test/06: MissingCompileTimeError
-switch_case_warn_test/07: MissingCompileTimeError
-switch_case_warn_test/08: MissingCompileTimeError
-switch_case_warn_test/09: MissingCompileTimeError
-switch_case_warn_test/10: MissingCompileTimeError
-switch_case_warn_test/11: MissingCompileTimeError
-switch_case_warn_test/12: MissingCompileTimeError
-switch_case_warn_test/13: MissingCompileTimeError
-switch_case_warn_test/14: MissingCompileTimeError
-switch_case_warn_test/15: MissingCompileTimeError
-switch_case_warn_test/16: MissingCompileTimeError
-switch_case_warn_test/17: MissingCompileTimeError
-switch_fallthru_test/01: MissingCompileTimeError
-type_check_const_function_typedef2_test: MissingCompileTimeError
-type_parameter_test/05: MissingCompileTimeError
-type_variable_identifier_expression_test: MissingCompileTimeError
-type_variable_static_context_test: MissingCompileTimeError
-unresolved_in_factory_test: MissingCompileTimeError
+[ $compiler == dart2analyzer && $analyzer_use_fasta_parser ]
+assignable_expression_test/50: MissingCompileTimeError
+async_await_syntax_test/b00a: MissingCompileTimeError
+async_await_syntax_test/b00b: MissingCompileTimeError
+async_await_syntax_test/b00c: MissingCompileTimeError
+async_await_syntax_test/e4: MissingCompileTimeError
+async_await_syntax_test/e5: MissingCompileTimeError
+async_await_syntax_test/e6: MissingCompileTimeError
+constructor_with_type_parameters_test/05: MissingCompileTimeError
+constructor_with_type_parameters_test/09: MissingCompileTimeError
+constructor_with_type_parameters_test/11: MissingCompileTimeError
+constructor_with_type_parameters_test/15: MissingCompileTimeError
+constructor_with_type_parameters_test/17: MissingCompileTimeError
+external_test/30: MissingCompileTimeError
+external_test/31: MissingCompileTimeError
+factory_with_type_parameters_test/01: MissingCompileTimeError
+factory_with_type_parameters_test/02: MissingCompileTimeError
+factory_with_type_parameters_test/05: MissingCompileTimeError
+factory_with_type_parameters_test/06: MissingCompileTimeError
+generic_metadata_test/02: MissingCompileTimeError
+generic_metadata_test/03: MissingCompileTimeError
+illegal_initializer_test/01: MissingCompileTimeError
+illegal_initializer_test/03: MissingCompileTimeError
+multiline_newline_test/01: Pass
+multiline_newline_test/01r: Pass
+multiline_newline_test/02: Pass
+multiline_newline_test/02r: Pass
+multiline_newline_test/04: Pass
+multiline_newline_test/04r: Pass
+multiline_newline_test/05: Pass
+multiline_newline_test/05r: Pass
+regress_29349_test: Pass
+this_test/01: MissingCompileTimeError
+this_test/02: MissingCompileTimeError
+this_test/03: MissingCompileTimeError
+this_test/04: MissingCompileTimeError
+this_test/05: MissingCompileTimeError
+this_test/06: MissingCompileTimeError
+this_test/07: MissingCompileTimeError
+this_test/08: MissingCompileTimeError
+unsupported_operators_test/01: MissingCompileTimeError
+unsupported_operators_test/02: MissingCompileTimeError
+unsupported_operators_test/03: MissingCompileTimeError
+unsupported_operators_test/04: MissingCompileTimeError
+void_type_function_types_test/04: MissingCompileTimeError
+void_type_function_types_test/06: MissingCompileTimeError
+void_type_function_types_test/08: MissingCompileTimeError
+void_type_function_types_test/none: Pass
 
 [ $compiler == dart2analyzer && !$fasta ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue #30568
@@ -936,7 +168,6 @@
 regress_29349_test: CompileTimeError # Issue 29744
 regress_29405_test: CompileTimeError # Issue 29421
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
-reify_typevar_static_test/00: MissingCompileTimeError # Issue 21565
 script1_negative_test: CompileTimeError
 script2_negative_test: CompileTimeError
 setter_declaration2_negative_test: CompileTimeError
@@ -1110,13 +341,9 @@
 implicit_creation/implicit_new_prefix_constructor_generic_test: CompileTimeError
 implicit_creation/implicit_new_prefix_constructor_named_test: CompileTimeError
 implicit_creation/implicit_new_prefix_constructor_test: CompileTimeError
+reify_typevar_static_test/00: MissingCompileTimeError
 type_literal_prefix_call_test: CompileTimeError
 
-[ $compiler == dart2analyzer && !$fasta && !$preview_dart_2 && !$strong ]
-static_setter_conflicts_test/01: MissingCompileTimeError
-static_setter_conflicts_test/04: MissingCompileTimeError
-static_setter_conflicts_test/07: MissingCompileTimeError
-
 [ $compiler == dart2analyzer && !$fasta && $strong ]
 accessor_conflict_export2_test: CompileTimeError # Issue 25626
 accessor_conflict_export_test: CompileTimeError # Issue 25626
@@ -1185,7 +412,6 @@
 regress_22976_test/none: CompileTimeError
 regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError
-reify_typevar_static_test/00: MissingCompileTimeError # Issue 28823
 setter_override2_test/02: MissingCompileTimeError # Issue 14736
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
@@ -1210,563 +436,3 @@
 void_type_callbacks_test/00: MissingCompileTimeError # Issue 30177
 void_type_callbacks_test/01: MissingCompileTimeError # Issue 30177
 void_type_function_types_test/none: CompileTimeError # Issue 30177
-
-[ $compiler == dart2analyzer && !$fasta && !$strong ]
-accessor_conflict_export2_test: StaticWarning # Issue 25626
-accessor_conflict_export_test: CompileTimeError
-accessor_conflict_export_test: StaticWarning # Issue 25626
-accessor_conflict_import2_test: StaticWarning # Issue 25626
-accessor_conflict_import_prefixed2_test: StaticWarning # Issue 25626
-accessor_conflict_import_prefixed_test: StaticWarning # Issue 25626
-accessor_conflict_import_test: StaticWarning # Issue 25626
-additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
-additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
-additional_interface_adds_optional_args_supercall_test: MissingCompileTimeError
-additional_interface_adds_optional_args_test: StaticWarning
-argument_assignability_function_typed_test/01: MissingCompileTimeError
-argument_assignability_function_typed_test/02: MissingCompileTimeError
-assertion_initializer_const_function_test/01: MissingCompileTimeError
-async_congruence_local_test/01: MissingCompileTimeError
-async_congruence_local_test/02: MissingCompileTimeError
-async_congruence_method_test/01: MissingCompileTimeError
-async_congruence_unnamed_test/01: MissingCompileTimeError
-async_congruence_unnamed_test/02: MissingCompileTimeError
-black_listed_test/none: Fail # Issue 14228
-bug32305_test: MissingCompileTimeError
-built_in_identifier_type_annotation_test/abstract-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/as-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/as-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/covariant-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/deferred-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/deferred-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/export-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/export-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/external-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/factory-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/get-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/implements-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/implements-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/import-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/import-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/interface-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/interface-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/library-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/library-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/mixin-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/mixin-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/operator-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/operator-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/part-funret: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/part-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/set-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/static-list: MissingCompileTimeError # Issue 28813
-built_in_identifier_type_annotation_test/typedef-list: MissingCompileTimeError # Issue 28813
-call_method_implicit_invoke_local_test/05: MissingCompileTimeError
-call_method_implicit_tear_off_assignable_test: StaticWarning
-call_method_implicit_tear_off_implements_function_test/03: StaticWarning
-call_method_implicit_tear_off_test/03: StaticWarning
-call_method_must_not_be_field_test/01: MissingCompileTimeError # Issue 32264
-call_method_must_not_be_field_test/02: MissingCompileTimeError # Issue 32264
-call_method_must_not_be_getter_test/01: MissingCompileTimeError # Issue 32264
-call_method_must_not_be_getter_test/02: MissingCompileTimeError # Issue 32264
-call_method_override_test/01: MissingCompileTimeError
-call_method_override_test/02: MissingCompileTimeError
-call_type_literal_test: StaticWarning
-cast_test/04: MissingCompileTimeError
-cast_test/05: MissingCompileTimeError
-checked_null_test/01: MissingCompileTimeError
-checked_setter3_test/01: MissingCompileTimeError
-checked_setter3_test/02: MissingCompileTimeError
-checked_setter3_test/03: MissingCompileTimeError
-class_literal_static_test/none: StaticWarning
-class_literal_test/01: MissingCompileTimeError
-class_literal_test/02: MissingCompileTimeError
-class_literal_test/03: MissingCompileTimeError
-class_literal_test/04: MissingCompileTimeError
-class_literal_test/05: MissingCompileTimeError
-class_literal_test/06: MissingCompileTimeError
-class_literal_test/07: MissingCompileTimeError
-class_literal_test/08: MissingCompileTimeError
-class_literal_test/09: MissingCompileTimeError
-class_literal_test/10: MissingCompileTimeError
-class_literal_test/11: MissingCompileTimeError
-class_literal_test/12: MissingCompileTimeError
-class_literal_test/13: MissingCompileTimeError
-class_literal_test/14: MissingCompileTimeError
-class_literal_test/15: MissingCompileTimeError
-class_literal_test/16: MissingCompileTimeError
-class_literal_test/17: MissingCompileTimeError
-class_literal_test/18: MissingCompileTimeError
-class_literal_test/19: MissingCompileTimeError
-class_literal_test/20: MissingCompileTimeError
-class_literal_test/21: MissingCompileTimeError
-class_literal_test/22: MissingCompileTimeError
-class_literal_test/23: MissingCompileTimeError
-class_literal_test/24: MissingCompileTimeError
-class_literal_test/25: MissingCompileTimeError
-class_literal_test/none: StaticWarning
-closure_type_test: Pass
-compile_time_constant_o_test/01: MissingCompileTimeError
-compile_time_constant_o_test/02: MissingCompileTimeError
-conditional_method_invocation_test/05: MissingCompileTimeError
-conditional_method_invocation_test/06: MissingCompileTimeError
-conditional_method_invocation_test/07: MissingCompileTimeError
-conditional_method_invocation_test/08: MissingCompileTimeError
-conditional_method_invocation_test/12: MissingCompileTimeError
-conditional_method_invocation_test/13: MissingCompileTimeError
-conditional_method_invocation_test/18: MissingCompileTimeError
-conditional_method_invocation_test/19: MissingCompileTimeError
-conditional_property_access_test/04: MissingCompileTimeError
-conditional_property_access_test/05: MissingCompileTimeError
-conditional_property_access_test/06: MissingCompileTimeError
-conditional_property_access_test/10: MissingCompileTimeError
-conditional_property_access_test/11: MissingCompileTimeError
-conditional_property_access_test/16: MissingCompileTimeError
-conditional_property_access_test/17: MissingCompileTimeError
-conditional_property_assignment_test/04: MissingCompileTimeError
-conditional_property_assignment_test/05: MissingCompileTimeError
-conditional_property_assignment_test/06: MissingCompileTimeError
-conditional_property_assignment_test/10: MissingCompileTimeError
-conditional_property_assignment_test/11: MissingCompileTimeError
-conditional_property_assignment_test/12: MissingCompileTimeError
-conditional_property_assignment_test/13: MissingCompileTimeError
-conditional_property_assignment_test/27: MissingCompileTimeError
-conditional_property_assignment_test/28: MissingCompileTimeError
-conditional_property_assignment_test/32: MissingCompileTimeError
-conditional_property_assignment_test/33: MissingCompileTimeError
-conditional_property_assignment_test/34: MissingCompileTimeError
-conditional_property_assignment_test/35: MissingCompileTimeError
-conditional_property_increment_decrement_test/04: MissingCompileTimeError
-conditional_property_increment_decrement_test/08: MissingCompileTimeError
-conditional_property_increment_decrement_test/12: MissingCompileTimeError
-conditional_property_increment_decrement_test/16: MissingCompileTimeError
-conditional_property_increment_decrement_test/21: MissingCompileTimeError
-conditional_property_increment_decrement_test/22: MissingCompileTimeError
-conditional_property_increment_decrement_test/27: MissingCompileTimeError
-conditional_property_increment_decrement_test/28: MissingCompileTimeError
-conditional_property_increment_decrement_test/33: MissingCompileTimeError
-conditional_property_increment_decrement_test/34: MissingCompileTimeError
-conditional_property_increment_decrement_test/39: MissingCompileTimeError
-conditional_property_increment_decrement_test/40: MissingCompileTimeError
-conflicting_generic_interfaces_simple_test: MissingCompileTimeError
-const_constructor2_test/05: MissingCompileTimeError
-const_constructor2_test/06: MissingCompileTimeError
-const_dynamic_type_literal_test/02: MissingCompileTimeError
-const_error_multiply_initialized_test/02: MissingCompileTimeError
-const_error_multiply_initialized_test/04: MissingCompileTimeError
-const_types_test/01: MissingCompileTimeError
-const_types_test/02: MissingCompileTimeError
-const_types_test/03: MissingCompileTimeError
-const_types_test/04: MissingCompileTimeError
-const_types_test/05: MissingCompileTimeError
-const_types_test/06: MissingCompileTimeError
-const_types_test/13: MissingCompileTimeError
-const_types_test/34: MissingCompileTimeError
-const_types_test/35: MissingCompileTimeError
-const_types_test/39: MissingCompileTimeError
-const_types_test/40: MissingCompileTimeError
-constructor13_test/01: MissingCompileTimeError
-constructor13_test/02: MissingCompileTimeError
-constructor_call_as_function_test: StaticWarning
-constructor_call_wrong_argument_count_test/01: MissingCompileTimeError
-constructor_duplicate_final_test/03: MissingCompileTimeError
-constructor_with_type_parameters_test/09: MissingCompileTimeError
-constructor_with_type_parameters_test/15: MissingCompileTimeError
-create_unresolved_type_test/01: MissingCompileTimeError
-fuzzy_arrows_test/01: MissingCompileTimeError
-generic_constructor_mixin2_test/01: MissingCompileTimeError
-generic_constructor_mixin3_test/01: MissingCompileTimeError
-generic_constructor_mixin_test/01: MissingCompileTimeError
-generic_field_mixin6_test/01: MissingCompileTimeError
-generic_function_typedef2_test/04: MissingCompileTimeError
-generic_methods_overriding_test/01: MissingCompileTimeError
-generic_test/01: MissingCompileTimeError
-identical_const_test/01: MissingCompileTimeError
-identical_const_test/02: MissingCompileTimeError
-identical_const_test/03: MissingCompileTimeError
-identical_const_test/04: MissingCompileTimeError
-if_null_assignment_behavior_test/03: MissingCompileTimeError
-if_null_assignment_behavior_test/13: MissingCompileTimeError
-if_null_assignment_behavior_test/15: MissingCompileTimeError
-if_null_assignment_static_test/02: MissingCompileTimeError
-if_null_assignment_static_test/04: MissingCompileTimeError
-if_null_assignment_static_test/06: MissingCompileTimeError
-if_null_assignment_static_test/07: MissingCompileTimeError
-if_null_assignment_static_test/09: MissingCompileTimeError
-if_null_assignment_static_test/11: MissingCompileTimeError
-if_null_assignment_static_test/13: MissingCompileTimeError
-if_null_assignment_static_test/14: MissingCompileTimeError
-if_null_assignment_static_test/16: MissingCompileTimeError
-if_null_assignment_static_test/18: MissingCompileTimeError
-if_null_assignment_static_test/20: MissingCompileTimeError
-if_null_assignment_static_test/21: MissingCompileTimeError
-if_null_assignment_static_test/23: MissingCompileTimeError
-if_null_assignment_static_test/25: MissingCompileTimeError
-if_null_assignment_static_test/27: MissingCompileTimeError
-if_null_assignment_static_test/28: MissingCompileTimeError
-if_null_assignment_static_test/30: MissingCompileTimeError
-if_null_assignment_static_test/32: MissingCompileTimeError
-if_null_assignment_static_test/34: MissingCompileTimeError
-if_null_assignment_static_test/35: MissingCompileTimeError
-if_null_assignment_static_test/37: MissingCompileTimeError
-if_null_assignment_static_test/39: MissingCompileTimeError
-if_null_assignment_static_test/41: MissingCompileTimeError
-if_null_assignment_static_test/42: MissingCompileTimeError
-if_null_precedence_test/06: MissingCompileTimeError
-if_null_precedence_test/07: MissingCompileTimeError
-implicit_this_test/01: MissingCompileTimeError
-implicit_this_test/02: MissingCompileTimeError
-implicit_this_test/04: MissingCompileTimeError
-import_combinators2_test/00: MissingCompileTimeError
-import_self_test/01: MissingCompileTimeError
-inferrer_constructor5_test/01: MissingCompileTimeError
-initializing_formal_type_test: MissingCompileTimeError
-instantiate_type_variable_test/01: MissingCompileTimeError
-interceptor6_test: StaticWarning
-invalid_cast_test/01: MissingCompileTimeError
-invalid_cast_test/02: MissingCompileTimeError
-invalid_cast_test/03: MissingCompileTimeError
-invalid_cast_test/04: MissingCompileTimeError
-invalid_cast_test/07: MissingCompileTimeError
-invalid_cast_test/08: MissingCompileTimeError
-invalid_cast_test/09: MissingCompileTimeError
-invalid_cast_test/10: MissingCompileTimeError
-invalid_cast_test/11: MissingCompileTimeError
-invalid_override_in_mixin_test/01: MissingCompileTimeError
-invocation_mirror_test: StaticWarning
-issue13179_test: StaticWarning
-issue15606_test/none: StaticWarning # invalid use of void for dart 2, see also #32100
-issue31596_override_test/05: MissingCompileTimeError
-issue31596_override_test/06: MissingCompileTimeError
-issue31596_override_test/07: MissingCompileTimeError
-issue31596_override_test/08: MissingCompileTimeError
-issue31596_super_test/02: MissingCompileTimeError
-issue31596_super_test/04: MissingCompileTimeError
-issue32353_2_test: MissingCompileTimeError
-known_identifier_prefix_error_test/*: MissingCompileTimeError # Error only in strong mode.
-known_identifier_prefix_error_test/none: Pass
-least_upper_bound_expansive_test/01: MissingCompileTimeError
-least_upper_bound_expansive_test/02: MissingCompileTimeError
-least_upper_bound_expansive_test/03: MissingCompileTimeError
-least_upper_bound_expansive_test/04: MissingCompileTimeError
-least_upper_bound_expansive_test/05: MissingCompileTimeError
-least_upper_bound_expansive_test/06: MissingCompileTimeError
-least_upper_bound_expansive_test/07: MissingCompileTimeError
-least_upper_bound_expansive_test/08: MissingCompileTimeError
-least_upper_bound_expansive_test/09: MissingCompileTimeError
-least_upper_bound_expansive_test/10: MissingCompileTimeError
-least_upper_bound_expansive_test/11: MissingCompileTimeError
-least_upper_bound_expansive_test/12: MissingCompileTimeError
-least_upper_bound_test/03: MissingCompileTimeError
-least_upper_bound_test/04: MissingCompileTimeError
-least_upper_bound_test/10: MissingCompileTimeError
-least_upper_bound_test/19: MissingCompileTimeError
-least_upper_bound_test/20: MissingCompileTimeError
-least_upper_bound_test/23: MissingCompileTimeError
-least_upper_bound_test/24: MissingCompileTimeError
-least_upper_bound_test/25: StaticWarning
-least_upper_bound_test/26: StaticWarning
-least_upper_bound_test/29: MissingCompileTimeError
-least_upper_bound_test/30: MissingCompileTimeError
-least_upper_bound_test/31: StaticWarning
-least_upper_bound_test/32: MissingCompileTimeError
-library_ambiguous_test/00: MissingCompileTimeError
-library_ambiguous_test/01: MissingCompileTimeError
-library_ambiguous_test/02: MissingCompileTimeError
-library_ambiguous_test/03: MissingCompileTimeError
-library_ambiguous_test/04: MissingCompileTimeError
-list_literal4_test/00: MissingCompileTimeError
-list_literal4_test/01: MissingCompileTimeError
-list_literal4_test/03: MissingCompileTimeError
-list_literal4_test/04: MissingCompileTimeError
-list_literal4_test/05: MissingCompileTimeError
-list_literal_syntax_test/01: MissingCompileTimeError
-list_literal_syntax_test/02: MissingCompileTimeError
-list_literal_syntax_test/03: MissingCompileTimeError
-local_function2_test/01: MissingCompileTimeError
-local_function2_test/02: MissingCompileTimeError
-local_function3_test/01: MissingCompileTimeError
-local_function_test/01: MissingCompileTimeError
-local_function_test/02: MissingCompileTimeError
-local_function_test/03: MissingCompileTimeError
-local_function_test/04: MissingCompileTimeError
-logical_expression3_test: MissingCompileTimeError
-malbounded_instantiation_test/01: MissingCompileTimeError
-malbounded_instantiation_test/02: MissingCompileTimeError
-malbounded_instantiation_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/02: MissingCompileTimeError
-malbounded_redirecting_factory_test/03: MissingCompileTimeError
-malbounded_redirecting_factory_test/04: MissingCompileTimeError
-malbounded_redirecting_factory_test/05: MissingCompileTimeError
-malbounded_type_cast2_test: MissingCompileTimeError
-malbounded_type_cast_test/00: MissingCompileTimeError
-malbounded_type_cast_test/01: MissingCompileTimeError
-malbounded_type_cast_test/02: MissingCompileTimeError
-malbounded_type_cast_test/none: Pass
-malbounded_type_literal_test/00: MissingCompileTimeError
-malbounded_type_literal_test/none: Pass
-malbounded_type_test2_test/00: MissingCompileTimeError
-malbounded_type_test2_test/none: Pass
-malbounded_type_test_test/00: MissingCompileTimeError
-malbounded_type_test_test/01: MissingCompileTimeError
-malbounded_type_test_test/02: MissingCompileTimeError
-malformed2_test/01: MissingCompileTimeError
-malformed2_test/02: MissingCompileTimeError
-malformed2_test/03: MissingCompileTimeError
-malformed2_test/04: MissingCompileTimeError
-malformed2_test/05: MissingCompileTimeError
-malformed2_test/06: MissingCompileTimeError
-malformed2_test/07: MissingCompileTimeError
-malformed2_test/08: MissingCompileTimeError
-malformed2_test/09: MissingCompileTimeError
-malformed2_test/10: MissingCompileTimeError
-malformed2_test/11: MissingCompileTimeError
-malformed2_test/12: MissingCompileTimeError
-malformed2_test/13: MissingCompileTimeError
-malformed_bound_test/00: MissingCompileTimeError
-malformed_bound_test/01: MissingCompileTimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: MissingCompileTimeError
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_test/00: MissingCompileTimeError
-malformed_test/01: MissingCompileTimeError
-malformed_test/02: MissingCompileTimeError
-malformed_test/03: MissingCompileTimeError
-malformed_test/04: MissingCompileTimeError
-malformed_test/05: MissingCompileTimeError
-malformed_test/06: MissingCompileTimeError
-malformed_test/07: MissingCompileTimeError
-malformed_test/08: MissingCompileTimeError
-malformed_test/09: MissingCompileTimeError
-malformed_test/10: MissingCompileTimeError
-malformed_test/11: MissingCompileTimeError
-malformed_test/12: MissingCompileTimeError
-malformed_test/13: MissingCompileTimeError
-malformed_test/14: MissingCompileTimeError
-malformed_test/15: MissingCompileTimeError
-malformed_test/16: MissingCompileTimeError
-malformed_test/17: MissingCompileTimeError
-malformed_test/18: MissingCompileTimeError
-malformed_test/19: MissingCompileTimeError
-malformed_test/20: MissingCompileTimeError
-malformed_test/21: MissingCompileTimeError
-malformed_test/22: MissingCompileTimeError
-malformed_test/23: MissingCompileTimeError
-malformed_test/24: MissingCompileTimeError
-malformed_type_test: MissingCompileTimeError
-mixin_type_parameter_inference_error_test/01: MissingCompileTimeError
-mixin_type_parameter_inference_error_test/02: MissingCompileTimeError
-mixin_type_parameter_inference_error_test/03: MissingCompileTimeError
-mixin_type_parameter_inference_error_test/04: MissingCompileTimeError
-mixin_type_parameter_inference_previous_mixin_test/03: MissingCompileTimeError
-mixin_type_parameter_inference_previous_mixin_test/04: MissingCompileTimeError
-mixin_type_parameter_inference_test/04: MissingCompileTimeError
-mixin_type_parameter_inference_test/05: MissingCompileTimeError
-mixin_type_parameter_inference_test/06: MissingCompileTimeError
-mixin_type_parameter_inference_test/07: MissingCompileTimeError
-mixin_type_parameter_inference_test/11: MissingCompileTimeError
-mixin_type_parameter_inference_test/14: MissingCompileTimeError
-mixin_type_parameter_inference_test/15: MissingCompileTimeError
-multiple_interface_inheritance_test: StaticWarning # Issue 30552
-named_parameters_test/01: MissingCompileTimeError
-named_parameters_test/02: MissingCompileTimeError
-named_parameters_test/03: MissingCompileTimeError
-named_parameters_test/04: MissingCompileTimeError
-named_parameters_test/05: MissingCompileTimeError
-named_parameters_test/06: MissingCompileTimeError
-named_parameters_test/07: MissingCompileTimeError
-named_parameters_test/08: MissingCompileTimeError
-named_parameters_test/09: MissingCompileTimeError
-named_parameters_test/10: MissingCompileTimeError
-named_parameters_type_test/01: MissingCompileTimeError
-named_parameters_type_test/02: MissingCompileTimeError
-named_parameters_type_test/03: MissingCompileTimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_test/03: MissingCompileTimeError # Strong mode error
-nsm5_test: MissingCompileTimeError
-object_has_no_call_method_test/02: MissingCompileTimeError
-object_has_no_call_method_test/05: MissingCompileTimeError
-object_has_no_call_method_test/08: MissingCompileTimeError
-override_inheritance_no_such_method_test/05: MissingCompileTimeError
-partial_tearoff_instantiation_test/01: MissingCompileTimeError
-partial_tearoff_instantiation_test/03: MissingCompileTimeError
-partial_tearoff_instantiation_test/05: MissingCompileTimeError
-partial_tearoff_instantiation_test/06: MissingCompileTimeError
-partial_tearoff_instantiation_test/07: MissingCompileTimeError
-partial_tearoff_instantiation_test/08: MissingCompileTimeError
-positional_parameters_type_test/01: MissingCompileTimeError
-positional_parameters_type_test/02: MissingCompileTimeError
-prefix16_test/00: MissingCompileTimeError
-prefix16_test/01: MissingCompileTimeError
-prefix22_test/00: MissingCompileTimeError
-prefix23_test/00: MissingCompileTimeError
-prefix_import_collision_test/01: MissingCompileTimeError
-prefix_shadow_test/02: MissingCompileTimeError
-prefix_transitive_import_prefix_test/01: MissingCompileTimeError
-prefix_transitive_import_prefix_test/02: MissingCompileTimeError
-prefix_transitive_import_prefix_test/03: MissingCompileTimeError
-prefix_transitive_import_test/01: MissingCompileTimeError
-prefix_transitive_import_test/02: MissingCompileTimeError
-private_access_test/01: MissingCompileTimeError
-private_access_test/02: MissingCompileTimeError
-private_access_test/03: MissingCompileTimeError
-private_access_test/04: MissingCompileTimeError
-private_access_test/05: MissingCompileTimeError
-private_access_test/06: MissingCompileTimeError
-regress_12561_test: MissingCompileTimeError
-regress_13494_test: MissingCompileTimeError
-regress_17382_test: MissingCompileTimeError
-regress_19413_test: MissingCompileTimeError
-regress_19728_test: MissingCompileTimeError
-regress_21793_test/01: MissingCompileTimeError
-regress_21912_test/01: MissingCompileTimeError
-regress_21912_test/02: MissingCompileTimeError
-regress_22438_test: MissingCompileTimeError
-regress_22936_test: MissingCompileTimeError
-regress_23089_test: MissingCompileTimeError
-regress_26133_test: MissingCompileTimeError
-regress_27572_test: MissingCompileTimeError
-regress_29025_test: StaticWarning
-regress_29405_test: StaticWarning
-return_type_test: MissingCompileTimeError
-rewrite_implicit_this_test/01: MissingCompileTimeError
-setter4_test: MissingCompileTimeError
-setter_no_getter_call_test/01: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-string_interpolation_test/01: MissingCompileTimeError
-string_no_operator_test/01: MissingCompileTimeError
-string_no_operator_test/02: MissingCompileTimeError
-string_no_operator_test/03: MissingCompileTimeError
-string_no_operator_test/04: MissingCompileTimeError
-string_no_operator_test/05: MissingCompileTimeError
-string_no_operator_test/06: MissingCompileTimeError
-string_no_operator_test/07: MissingCompileTimeError
-string_no_operator_test/08: MissingCompileTimeError
-string_no_operator_test/09: MissingCompileTimeError
-string_no_operator_test/10: MissingCompileTimeError
-string_no_operator_test/11: MissingCompileTimeError
-string_no_operator_test/12: MissingCompileTimeError
-string_no_operator_test/13: MissingCompileTimeError
-string_no_operator_test/14: MissingCompileTimeError
-string_no_operator_test/15: MissingCompileTimeError
-string_no_operator_test/16: MissingCompileTimeError
-string_test/01: MissingCompileTimeError
-substring_test/01: MissingCompileTimeError
-super_assign_test/01: MissingCompileTimeError
-super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics, related to issue 33553.
-super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics, related to issue 33553.
-symbol_literal_test/01: MissingCompileTimeError
-sync_generator1_test/01: MissingCompileTimeError
-syntax_test/59: MissingCompileTimeError
-syntax_test/60: MissingCompileTimeError
-syntax_test/61: MissingCompileTimeError
-top_level_getter_no_setter1_test: MissingCompileTimeError
-top_level_getter_no_setter2_test: MissingCompileTimeError
-transitive_private_library_access_test: MissingCompileTimeError
-try_catch_on_syntax_test/07: MissingCompileTimeError
-try_catch_syntax_test/08: MissingCompileTimeError
-type_checks_in_factory_method_test/01: MissingCompileTimeError
-type_inference_accessor_ref_test/03: MissingCompileTimeError
-type_inference_accessor_ref_test/06: MissingCompileTimeError
-type_inference_circularity_test: MissingCompileTimeError
-type_literal_prefix_call_test: StaticWarning
-type_promotion_functions_test/01: MissingCompileTimeError
-type_promotion_functions_test/05: MissingCompileTimeError
-type_promotion_functions_test/06: MissingCompileTimeError
-type_promotion_functions_test/07: MissingCompileTimeError
-type_promotion_functions_test/08: MissingCompileTimeError
-type_promotion_functions_test/10: MissingCompileTimeError
-type_promotion_parameter_test/01: MissingCompileTimeError
-type_promotion_parameter_test/02: MissingCompileTimeError
-type_promotion_parameter_test/03: MissingCompileTimeError
-type_promotion_parameter_test/04: MissingCompileTimeError
-type_promotion_parameter_test/05: MissingCompileTimeError
-type_promotion_parameter_test/06: MissingCompileTimeError
-type_promotion_parameter_test/07: MissingCompileTimeError
-type_promotion_parameter_test/08: MissingCompileTimeError
-type_promotion_parameter_test/09: MissingCompileTimeError
-type_promotion_parameter_test/10: MissingCompileTimeError
-type_promotion_parameter_test/11: MissingCompileTimeError
-type_promotion_parameter_test/12: MissingCompileTimeError
-type_promotion_parameter_test/13: MissingCompileTimeError
-type_promotion_parameter_test/14: MissingCompileTimeError
-type_promotion_parameter_test/15: MissingCompileTimeError
-type_promotion_parameter_test/16: MissingCompileTimeError
-type_promotion_parameter_test/17: MissingCompileTimeError
-type_promotion_parameter_test/18: MissingCompileTimeError
-type_promotion_parameter_test/19: MissingCompileTimeError
-type_promotion_parameter_test/20: MissingCompileTimeError
-type_promotion_parameter_test/21: MissingCompileTimeError
-type_promotion_parameter_test/22: MissingCompileTimeError
-type_promotion_parameter_test/23: MissingCompileTimeError
-type_promotion_parameter_test/24: MissingCompileTimeError
-type_promotion_parameter_test/25: MissingCompileTimeError
-type_promotion_parameter_test/26: MissingCompileTimeError
-type_promotion_parameter_test/27: MissingCompileTimeError
-type_promotion_parameter_test/28: MissingCompileTimeError
-type_promotion_parameter_test/29: MissingCompileTimeError
-type_promotion_parameter_test/30: MissingCompileTimeError
-type_promotion_parameter_test/31: MissingCompileTimeError
-type_promotion_parameter_test/32: MissingCompileTimeError
-type_promotion_parameter_test/33: MissingCompileTimeError
-type_promotion_parameter_test/34: MissingCompileTimeError
-type_promotion_parameter_test/35: MissingCompileTimeError
-type_promotion_parameter_test/36: MissingCompileTimeError
-type_promotion_parameter_test/37: MissingCompileTimeError
-type_promotion_parameter_test/38: MissingCompileTimeError
-type_promotion_parameter_test/39: MissingCompileTimeError
-type_promotion_parameter_test/40: MissingCompileTimeError
-type_promotion_parameter_test/41: MissingCompileTimeError
-type_promotion_parameter_test/42: MissingCompileTimeError
-type_promotion_parameter_test/43: MissingCompileTimeError
-type_promotion_parameter_test/44: MissingCompileTimeError
-type_promotion_parameter_test/45: MissingCompileTimeError
-type_promotion_parameter_test/46: MissingCompileTimeError
-type_promotion_parameter_test/47: MissingCompileTimeError
-type_promotion_parameter_test/48: MissingCompileTimeError
-type_promotion_parameter_test/49: MissingCompileTimeError
-type_promotion_parameter_test/50: MissingCompileTimeError
-type_promotion_parameter_test/51: MissingCompileTimeError
-type_promotion_parameter_test/52: MissingCompileTimeError
-type_promotion_parameter_test/54: MissingCompileTimeError
-type_promotion_parameter_test/55: MissingCompileTimeError
-type_promotion_parameter_test/56: MissingCompileTimeError
-type_variable_bounds2_test: MissingCompileTimeError
-type_variable_bounds3_test/00: MissingCompileTimeError
-type_variable_bounds4_test/01: MissingCompileTimeError
-type_variable_bounds_test/00: MissingCompileTimeError
-type_variable_bounds_test/01: MissingCompileTimeError
-type_variable_bounds_test/02: MissingCompileTimeError
-type_variable_bounds_test/03: MissingCompileTimeError
-type_variable_bounds_test/04: MissingCompileTimeError
-type_variable_bounds_test/05: MissingCompileTimeError
-type_variable_bounds_test/06: MissingCompileTimeError
-type_variable_bounds_test/07: MissingCompileTimeError
-type_variable_bounds_test/08: MissingCompileTimeError
-type_variable_bounds_test/09: MissingCompileTimeError
-type_variable_bounds_test/10: MissingCompileTimeError
-type_variable_bounds_test/11: MissingCompileTimeError
-type_variable_conflict2_test/01: MissingCompileTimeError
-type_variable_conflict2_test/02: MissingCompileTimeError
-type_variable_conflict2_test/03: MissingCompileTimeError
-type_variable_conflict2_test/04: MissingCompileTimeError
-type_variable_conflict2_test/05: MissingCompileTimeError
-type_variable_conflict2_test/06: MissingCompileTimeError
-type_variable_conflict2_test/07: MissingCompileTimeError
-type_variable_conflict2_test/08: MissingCompileTimeError
-type_variable_conflict2_test/09: MissingCompileTimeError
-type_variable_conflict2_test/10: MissingCompileTimeError
-type_variable_scope2_test: MissingCompileTimeError
-type_variable_scope_test/00: MissingCompileTimeError
-type_variable_scope_test/01: MissingCompileTimeError
-type_variable_scope_test/02: MissingCompileTimeError
-type_variable_scope_test/03: MissingCompileTimeError
-type_variable_scope_test/04: MissingCompileTimeError
-type_variable_scope_test/05: MissingCompileTimeError
-typed_selector2_test: MissingCompileTimeError
-unbound_getter_test: MissingCompileTimeError
-unresolved_default_constructor_test/01: MissingCompileTimeError
-unresolved_top_level_method_test: MissingCompileTimeError
-unresolved_top_level_var_test: MissingCompileTimeError
-variable_shadow_class_test/01: MissingCompileTimeError
-vm/type_vm_test: StaticWarning
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 332c2ea..4a641cd 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -26,6 +26,9 @@
 [ $compiler == dart2js && $runtime == chrome && $system == macos ]
 await_future_test: Pass, Timeout # Issue 26735
 
+[ $compiler == dart2js && $runtime == chrome && $strong ]
+stacktrace_test: RuntimeError
+
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
 
@@ -37,11 +40,17 @@
 assertion_test: RuntimeError
 implicit_creation/implicit_new_constructor_generic_test: Pass
 
+[ $compiler == dart2js && $runtime == d8 && $strong ]
+stacktrace_test: RuntimeError
+
 [ $compiler == dart2js && $runtime == ff ]
 field_override_optimization_test: RuntimeError
 field_type_check2_test/01: MissingRuntimeError
 round_test: Pass, Fail, OK # Fixed in ff 35. Common JavaScript engine Math.round bug.
 
+[ $compiler == dart2js && $runtime == ff && $strong ]
+call_function_test: RuntimeError
+
 [ $compiler == dart2js && $runtime == jsshell ]
 async_call_test: RuntimeError # Timer interface not supported: Issue 7728.
 async_star_await_pauses_test: RuntimeError # Need triage
@@ -139,6 +148,9 @@
 field_type_check2_test/01: MissingRuntimeError
 round_test: Fail, OK # Common JavaScript engine Math.round bug.
 
+[ $compiler == dart2js && $runtime == safari && $strong ]
+stacktrace_test: RuntimeError
+
 [ $compiler == dart2js && $system == windows ]
 string_literals_test: Pass, RuntimeError # Failures on dart2js-win7-chrome-4-4-be and dart2js-win7-ie11ff-4-4-be
 
@@ -543,10 +555,7 @@
 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/01: RuntimeError # Issue 32784
 type_alias_equality_test/02: RuntimeError # Issue 32784
-type_alias_equality_test/03: RuntimeError # Issue 32784
-type_alias_equality_test/04: RuntimeError # Issue 32784
 
 [ $compiler == dart2js && $fasta && $host_checked && $strong ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
@@ -664,8 +673,6 @@
 setter4_test: MissingCompileTimeError
 sync_generator2_test/41: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
 sync_generator2_test/52: Crash # 'file:*/pkg/compiler/lib/src/kernel/element_map_impl.dart': Failed assertion: line 939 pos 18: 'asyncMarker == AsyncMarker.SYNC': is not true.
-syntax_test/21: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
-syntax_test/22: Crash # 'file:*/pkg/compiler/lib/src/kernel/env.dart': Failed assertion: line 322 pos 16: '!name.contains('#')': is not true.
 type_literal_prefix_call_test/00: MissingCompileTimeError
 type_promotion_logical_and_test/01: MissingCompileTimeError
 type_variable_bounds2_test: MissingCompileTimeError
@@ -932,6 +939,7 @@
 [ $compiler == dart2js && $minified ]
 cyclic_type2_test: RuntimeError # Issue 31054
 cyclic_type_test/0*: RuntimeError # Issue 31054
+f_bounded_quantification4_test: RuntimeError # Issue 31054
 f_bounded_quantification5_test: RuntimeError # Issue 31054
 generic_closure_test/01: RuntimeError # Uses runtimeType.toString()
 mixin_mixin2_test: RuntimeError # Issue 31054
@@ -982,10 +990,6 @@
 covariance_type_parameter_test/02: RuntimeError
 covariant_subtyping_test: Crash
 ct_const_test: RuntimeError
-cyclic_type_test/00: RuntimeError
-cyclic_type_test/02: RuntimeError
-cyclic_type_test/03: RuntimeError
-cyclic_type_test/04: RuntimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -1005,7 +1009,6 @@
 external_test/20: MissingRuntimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-f_bounded_quantification4_test: RuntimeError
 field_initialization_order_test/01: MissingCompileTimeError
 field_initialization_order_test/none: RuntimeError
 flatten_test/05: MissingRuntimeError
@@ -1095,7 +1098,6 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mixin_mixin6_test: RuntimeError
 mixin_of_mixin_test/none: CompileTimeError
 mixin_super_2_test/none: CompileTimeError
 mixin_super_constructor_named_test/01: MissingCompileTimeError
@@ -1162,7 +1164,6 @@
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
-stacktrace_test: RuntimeError # Issue 12698
 string_interpolation_and_buffer_test: RuntimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index bd43f56..015334b 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -153,7 +153,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?
-reify_typevar_static_test/00: MissingCompileTimeError # Issue 29920
 setter_override2_test/02: MissingCompileTimeError # Issue 14736
 stacktrace_test: RuntimeError # Issue 29920
 static_setter_conflicts_test/02: MissingCompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index af6e7d3..9bf1bcbc 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -169,7 +169,6 @@
 [ $compiler == dartkp ]
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
-constant_string_interpolation2_test: DartkCrash # Issue 33628
 covariant_subtyping_test: RuntimeError
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
diff --git a/tests/language_2/vm/regress_33794_test.dart b/tests/language_2/vm/regress_33794_test.dart
new file mode 100644
index 0000000..17940f3
--- /dev/null
+++ b/tests/language_2/vm/regress_33794_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.
+
+// Verify that sub-expressions with side-effects are handled correctly
+// in the presence of exceptions or deoptimization.
+
+import "package:expect/expect.dart";
+
+int var1 = -35;
+
+main() {
+  try {
+    var1 = (((~(var1)) ^ (++var1)) >> (++var1));
+  } catch (e) {
+    Expect.equals('Invalid argument(s): -33', e.toString());
+  } finally {
+    Expect.equals(-33, var1);
+  }
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 6ee2255..60cc04f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -132,6 +132,7 @@
 
 [ $runtime == ff ]
 convert/streamed_conversion_utf8_decode_test: Pass, Slow # Issue 12029, FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
+convert/utf85_test: SkipSlow
 mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589, FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
 
 [ $runtime == flutter ]
@@ -323,9 +324,6 @@
 async/catch_errors11_test: Pass, Timeout # Issue 22696
 async/timer_isActive_test: Fail, Pass, Timeout # Issue 22696
 
-[ $runtime == ff && $system == windows ]
-convert/utf85_test: Pass, Slow, Timeout
-
 [ $runtime != none && !$strong ]
 async/stream_first_where_test: RuntimeError
 async/stream_last_where_test: RuntimeError
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 7b0f031..29d88bc 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -74,7 +74,6 @@
 html/xhr_test/json: Fail # IE10 returns string, not JSON object
 
 [ $runtime == safari ]
-convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 html/audiobuffersourcenode_test/functional: RuntimeError
 html/canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
 html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
@@ -94,7 +93,6 @@
 html/input_element_week_test: RuntimeError
 html/media_stream_test: Pass, Fail
 html/mediasource_test: Pass, Fail # MediaSource only available on Safari 8 desktop, we can't express that.
-html/notification_test: Fail # Safari doesn't let us access the fields of the Notification to verify them.
 html/rtc_test: Fail
 html/shadow_dom_test: Fail
 html/speechrecognition_test: Fail
diff --git a/tests/lib_2/lib_2_analyzer.status b/tests/lib_2/lib_2_analyzer.status
index 346f32d..60034b9 100644
--- a/tests/lib_2/lib_2_analyzer.status
+++ b/tests/lib_2/lib_2_analyzer.status
@@ -20,9 +20,6 @@
 [ $compiler == dart2analyzer && !$preview_dart_2 ]
 mirrors/metadata_nested_constructor_call_test/none: CompileTimeError
 
-[ $compiler == dart2analyzer && !$preview_dart_2 && !$strong ]
-mirrors/metadata_allowed_values_test/16: MissingCompileTimeError
-
 [ $compiler == dart2analyzer && $strong ]
 mirrors/deferred_mirrors_metadata_test: StaticWarning # Issue 28969
 mirrors/deferred_type_test: CompileTimeError, OK # Deliberately refers to a deferred type in a declaration.
@@ -31,22 +28,3 @@
 mirrors/mirrors_nsm_test: CompileTimeError, OK
 mirrors/mirrors_nsm_test/dart2js: CompileTimeError, OK
 mirrors/repeated_private_anon_mixin_app_test: CompileTimeError, OK # Intentional library name conflict.
-
-[ $compiler == dart2analyzer && !$strong ]
-html/custom/element_upgrade_failure_test: MissingCompileTimeError
-mirrors/generic_bounded_by_type_parameter_test/02: MissingCompileTimeError
-mirrors/generic_bounded_test/01: MissingCompileTimeError
-mirrors/generic_bounded_test/02: MissingCompileTimeError
-mirrors/generic_interface_test/01: MissingCompileTimeError
-mirrors/generics_test/01: MissingCompileTimeError
-mirrors/metadata_allowed_values_test/16: MissingCompileTimeError
-mirrors/redirecting_factory_different_type_test/01: MissingCompileTimeError
-mirrors/reflect_class_test/01: MissingCompileTimeError
-mirrors/reflect_class_test/02: MissingCompileTimeError
-mirrors/reflected_type_classes_test/01: MissingCompileTimeError
-mirrors/reflected_type_classes_test/02: MissingCompileTimeError
-mirrors/reflected_type_classes_test/03: MissingCompileTimeError
-mirrors/reflected_type_test/01: MissingCompileTimeError
-mirrors/reflected_type_test/02: MissingCompileTimeError
-mirrors/reflected_type_test/03: MissingCompileTimeError
-mirrors/regress_16321_test/01: MissingCompileTimeError
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index c93bfb9..0ddba1c 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -61,7 +61,6 @@
 convert/streamed_conversion_json_utf8_decode_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
-html/element_classes_test: RuntimeError # Issue 30291
 html/element_types_keygen_test: RuntimeError # Issue 29055
 html/file_sample_test: Pass, RuntimeError
 html/fileapi_entry_test: Pass, RuntimeError
@@ -87,6 +86,10 @@
 html/no_linked_scripts_htmltest: Timeout, Pass # Issue 32262
 html/worker_test/functional: RuntimeError # Issue 32261
 
+[ $compiler == dart2js && $runtime == chrome && $strong ]
+html/fileapi_directory_reader_test: RuntimeError
+html/interactive_media_test: RuntimeError
+
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 html/audiobuffersourcenode_test/supported: Fail # TODO(dart2js-team): Please triage this failure.
 html/audiocontext_test/supported: RuntimeError # TODO(dart2js-team): Please triage this failure.
@@ -148,7 +151,6 @@
 html/element_add_test: RuntimeError
 html/element_animate_test: RuntimeError
 html/element_classes_svg_test: RuntimeError
-html/element_classes_test: RuntimeError
 html/element_constructor_1_test: RuntimeError
 html/element_dimensions_test: RuntimeError
 html/element_offset_test: RuntimeError
@@ -355,20 +357,21 @@
 convert/streamed_conversion_json_utf8_decode_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
+convert/utf85_test: Pass, Slow, Timeout
 html/custom/attribute_changed_callback_test: Skip # Times out
 html/custom/constructor_calls_created_synchronously_test: Pass, Timeout
 html/custom/created_callback_test: Skip # Times out
 html/custom/document_register_basic_test: Skip # Times out, or unittest times out
 html/dart_object_local_storage_test: Skip # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
 html/element_animate_test/timing_dict: RuntimeError # Issue 26730
-html/element_classes_test: RuntimeError # Issue 27535
 html/element_types_content_test: Pass, RuntimeError # Issues 28983, 29922
-html/element_types_keygen_test: RuntimeError # Issue 29922
 html/element_types_keygen_test: Fail
+html/element_types_keygen_test: RuntimeError # Issue 29922
 html/element_types_shadow_test: Pass, RuntimeError # Issues 28983, 29922
 html/file_sample_test: Skip # FileSystem not supported on FireFox.
 html/fileapi_supported_test: Skip # FileSystem not supported on FireFox.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on FireFox.
+html/fontface_test: Fail # Fontface not supported on ff
 html/history_test/history: Skip # Issue 22050
 html/input_element_datetime_test: Fail
 html/input_element_month_test: Fail
@@ -383,8 +386,9 @@
 html/text_event_test: Fail # Issue 17893
 html/webgl_1_test: Pass, Fail # Issue 8219
 
-[ $compiler == dart2js && $runtime == ff && $system == windows ]
-convert/utf85_test: Pass, Slow, Timeout
+[ $compiler == dart2js && $runtime == ff && $strong ]
+html/gamepad_test: RuntimeError
+html/interactive_media_test: RuntimeError
 
 [ $compiler == dart2js && $runtime == ie11 ]
 html/element_types_content_test: RuntimeError # Issue 29922
@@ -467,11 +471,28 @@
 html/element_types_shadow_test: RuntimeError # Issue 29922
 html/file_sample_test: Skip # FileSystem not supported on Safari.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on Safari
-html/fontface_loaded_test: RuntimeError # FontFace polyfill?
 html/js_mock_test: RuntimeError # Issue 32286
 html/storage_promise_test: RuntimeError # Not supported on Safari
 html/xhr_test: RuntimeError
 
+[ $compiler == dart2js && $runtime == safari && $strong ]
+html/canvasrenderingcontext2d_test/arc: Pass, RuntimeError
+html/canvasrenderingcontext2d_test/drawImage_canvas_element: Pass, RuntimeError
+html/canvasrenderingcontext2d_test/drawImage_image_element: Pass, RuntimeError
+html/canvasrenderingcontext2d_test/fillText: Pass, RuntimeError
+html/form_data_test/functional: RuntimeError
+html/notification_test: Pass, RuntimeError # Safari doesn't let us access the fields of the Notification to verify them.
+html/xhr_cross_origin_test/functional: RuntimeError
+
+[ $compiler == dart2js && $runtime == safari && !$strong ]
+convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
+html/fontface_loaded_test: RuntimeError # FontFace polyfill?
+html/fontface_test: Fail # FontFace polyfill?
+html/notification_test: Fail # Safari doesn't let us access the fields of the Notification to verify them.
+
+[ $compiler == dart2js && $runtime != safari && !$strong ]
+html/element_classes_test: RuntimeError
+
 [ $compiler == dart2js && $system == linux ]
 html/interactive_geolocation_test: Skip # Requires allowing geo location.
 
@@ -490,10 +511,7 @@
 html/custom/js_custom_test: Fail # Issue 14643
 
 [ $compiler == dart2js && $browser && $strong ]
-collection/list_test: RuntimeError
 html/element_classes_svg_test: RuntimeError
-html/fileapi_directory_reader_test: RuntimeError
-html/interactive_media_test: RuntimeError
 html/js_array_test: RuntimeError
 html/js_mock_test: RuntimeError
 html/typed_arrays_range_checks_test: RuntimeError
@@ -793,6 +811,13 @@
 [ $compiler == dart2js && !$fasta ]
 async/future_or_bad_type_test: MissingCompileTimeError
 
+[ $compiler == dart2js && $ie ]
+html/fontface_loaded_test: RuntimeError # FontFace polyfill?
+html/fontface_test: Fail # Fontface not supported on ie
+
+[ $compiler == dart2js && $ie && $strong ]
+html/interactive_media_test: RuntimeError
+
 [ $compiler == dart2js && $minified ]
 html/canvas_pixel_array_type_alias_test/types2_runtimeTypeName: Fail, OK # Issue 12605
 
@@ -804,6 +829,8 @@
 async/stream_controller_async_test: RuntimeError
 async/stream_distinct_test: RuntimeError
 async/stream_join_test: RuntimeError
+collection/list_test: RuntimeError
+html/element_classes_test: RuntimeError
 
 [ $compiler == dart2js && !$strong ]
 html/custom/element_upgrade_failure_test: MissingCompileTimeError
@@ -818,7 +845,3 @@
 [ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
 html/custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 html/custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
-html/fontface_test: Fail # Fontface not supported on these.
-
-[ $compiler == dart2js && ($runtime == safari || $ie) ]
-html/fontface_loaded_test: RuntimeError # FontFace polyfill?
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 6ea3848..4257d48 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -116,7 +116,6 @@
 mirrors/constructor_private_name_test: RuntimeError # Issue 33345 - Incorrect qualified symbol literal from kernel reader
 mirrors/constructors_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/dart2js_mirrors_test: RuntimeError # 31916
-mirrors/deferred_mirrors_metadata_test: RuntimeError, CompileTimeError # Deferred loading kernel issue 28335.
 mirrors/deferred_type_test: CompileTimeError, RuntimeError
 mirrors/empty_test: Crash, RuntimeError
 mirrors/enum_test: RuntimeError # Issue 31402 (Invocation arguments)
@@ -140,7 +139,6 @@
 mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 33098
 mirrors/library_imports_prefixed_test: RuntimeError # Issue 33098
 mirrors/library_imports_shown_test: RuntimeError # Issue 33098
-mirrors/library_metadata_test: RuntimeError
 mirrors/load_library_test: RuntimeError
 mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
 mirrors/metadata_scope_test/none: RuntimeError
@@ -161,8 +159,6 @@
 mirrors/native_class_test: SkipByDesign # Imports dart:html
 mirrors/operator_test: CompileTimeError # Issue 31402 (Invocation arguments)
 mirrors/other_declarations_location_test: RuntimeError # Issue 33325 (no source positions for type parameters).
-mirrors/parameter_annotation_mirror_test: RuntimeError
-mirrors/parameter_metadata_test: RuntimeError
 mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/private_symbol_test: RuntimeError # Issue 33326 - CFE/kernel invalid typedef substitution
 mirrors/private_types_test: RuntimeError # Issue 33326 - CFE/kernel invalid typedef substitution
diff --git a/tests/standalone_2/standalone_2_analyzer.status b/tests/standalone_2/standalone_2_analyzer.status
index 2740805..8bdeaea 100644
--- a/tests/standalone_2/standalone_2_analyzer.status
+++ b/tests/standalone_2/standalone_2_analyzer.status
@@ -37,10 +37,3 @@
 io/secure_socket_argument_test: CompileTimeError
 io/stdout_bad_argument_test: CompileTimeError
 package/package_isolate_test: CompileTimeError
-
-[ $compiler == dart2analyzer && !$strong ]
-io/directory_invalid_arguments_test: StaticWarning
-io/process_invalid_arguments_test: StaticWarning
-io/raw_secure_server_socket_argument_test: StaticWarning
-io/secure_socket_argument_test: StaticWarning
-io/stdout_bad_argument_test: StaticWarning
diff --git a/tools/VERSION b/tools/VERSION
index 90d93fdf..2af778a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 67
+PRERELEASE 68
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 6f1083b..71334db 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -22,6 +22,7 @@
       "runtime/tests/",
       "samples-dev/",
       "samples/",
+      "sdk/",
       "tests/angular/",
       "tests/co19/",
       "tests/compiler/",
@@ -47,6 +48,47 @@
       "xcodebuild/ReleaseIA32/dart-sdk/",
       "xcodebuild/ReleaseX64/dart-sdk/"
     ],
+    "dart2js_hostasserts": [
+      ".packages",
+      "out/ReleaseIA32/dart",
+      "out/ReleaseIA32/dart2js_platform.dill",
+      "out/ReleaseIA32/dart2js_platform_strong.dill",
+      "out/ReleaseX64/dart",
+      "out/ReleaseX64/dart2js_platform.dill",
+      "out/ReleaseX64/dart2js_platform_strong.dill",
+      "pkg/",
+      "runtime/tests/",
+      "samples-dev/",
+      "samples/",
+      "sdk/",
+      "tests/angular/",
+      "tests/co19/",
+      "tests/compiler/",
+      "tests/corelib/",
+      "tests/corelib_2/",
+      "tests/dart/",
+      "tests/html/",
+      "tests/isolate/",
+      "tests/kernel/",
+      "tests/language/",
+      "tests/language_2/",
+      "tests/lib/",
+      "tests/lib_2/",
+      "tests/light_unittest.dart",
+      "tests/search/",
+      "tests/standalone/",
+      "tests/standalone_2/",
+      "third_party/d8/",
+      "third_party/pkg/",
+      "third_party/pkg_tested/",
+      "tools/",
+      "xcodebuild/ReleaseIA32/dart",
+      "xcodebuild/ReleaseIA32/dart2js_platform.dill",
+      "xcodebuild/ReleaseIA32/dart2js_platform_strong.dill",
+      "xcodebuild/ReleaseX64/dart",
+      "xcodebuild/ReleaseX64/dart2js_platform.dill",
+      "xcodebuild/ReleaseX64/dart2js_platform_strong.dill"
+    ],
     "vm_debug": [
       "out/DebugIA32/",
       "out/DebugX64/",
@@ -125,15 +167,124 @@
       ".packages"
     ]
   },
+  "configurations": {
+    "vm-legacy-(linux|mac|win)-(debug|release)-(ia32|x64)": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "vm-legacy-checked-(linux|mac|win)-(debug|release)-(ia32|x64)": {
+      "options": {
+        "preview-dart-2": false,
+        "checked": true
+      }},
+    "vm-legacy-linux-debug-simarm": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "vm-legacy-checked-linux-debug-simarm": {
+      "options": {
+        "preview-dart-2": false,
+        "checked": true
+      }},
+    "vm-legacy-linux-release-(simarm|simarm64)": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "vm-legacy-checked-linux-release-(simarm|simarm64)": {
+      "options": {
+        "preview-dart-2": false,
+        "checked": true
+      }},
+    "vm-legacy-mac-(debug|release)-simdbc64": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "vm-legacy-checked-mac-(debug|release)-simdbc64": {
+      "options": {
+        "preview-dart-2": false,
+        "checked": true
+      }},
+    "vm-legacy-(linux|mac|win)-product-x64": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "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
+      }},
+    "dartk-legacy-linux-release-x64": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "dartkp-linux-release-(simarm|simarm64)": {
+      "options": {
+        "use-blobs": true
+    }},
+    "dartkp-win-release-x64": {
+      "options": {
+        "use-blobs": true
+    }},
+    "dartkp-linux-release-x64": { },
+    "dartkp-linux-debug-x64": {
+      "options": {
+        "vm-options": "no-enable-malloc-hooks"
+    }},
+    "dartk-(linux|mac)-(debug|release)-x64": { },
+    "dartk-win-release-x64": { },
+    "dartk-linux-(debug|release)-simdbc64": { },
+    "dartk-linux-release-(simarm|simarm64)": { },
+    "app_jit-legacy-linux-(debug|product|release)-x64": {
+      "options": {
+        "preview-dart-2": false
+      }},
+    "app_jitk-linux-(debug|product|release)-x64": { }
+  },
   "builder_configurations": [
     {
       "builders": [
+        "front-end-legacy-linux-release-x64"
+      ],
+      "meta": {
+        "description": "Runs the fasta legacy mode tests."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "create_sdk",
+            "dartdevc_test",
+            "kernel_platform_files",
+            "runtime_kernel"
+          ]
+        },
+        {
+          "name": "fasta legacy mode sdk tests",
+          "arguments": [
+            "--compiler=fasta",
+            "--no-preview-dart-2",
+            "--runtime=none"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": [
         "front-end-linux-release-x64",
         "front-end-mac-release-x64",
         "front-end-win-release-x64"
       ],
       "meta": {
-        "description": "Runs the front-end unit tests, fasta tests and fasta legacy mode tests."
+        "description": "Runs the front-end unit tests and fasta tests."
       },
       "steps": [
         {
@@ -166,6 +317,14 @@
           ]
         },
         {
+          "name": "fasta co19_2 tests",
+          "arguments": [
+            "--compiler=fasta",
+            "--runtime=none",
+            "co19_2"
+          ]
+        },
+        {
           "name": "fasta legacy mode sdk tests",
           "arguments": [
             "--compiler=fasta",
@@ -192,7 +351,10 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--builder-tag=swarming", "--no-preview-dart-2"]
+          "arguments": [
+            "-n=vm-legacy-${system}-product-x64",
+            "--builder-tag=swarming",
+            "--no-preview-dart-2"]
         }
       ]
     },
@@ -227,15 +389,18 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--builder-tag=swarming", "--no-preview-dart-2"]
+          "arguments": [
+            "-n=vm-legacy-${system}-${mode}-${arch}",
+            "--builder-tag=swarming",
+            "--no-preview-dart-2"]
         },
         {
           "name": "checked vm tests",
           "arguments": [
+            "-n=vm-legacy-checked-${system}-${mode}-${arch}",
             "--builder-tag=swarming",
             "--checked",
-            "--no-preview-dart-2"
-          ]
+            "--no-preview-dart-2"]
         }
       ]
     },
@@ -254,11 +419,19 @@
         },
         {
           "name": "vm ia32 tests",
-          "arguments": ["--arch=ia32", "--no-preview-dart-2", "vm"]
+          "arguments": [
+            "-n=vm-legacy-linux-debug-ia32",
+            "--arch=ia32",
+            "--no-preview-dart-2",
+            "vm"]
         },
         {
           "name": "vm x64 tests",
-          "arguments": ["--arch=x64", "--no-preview-dart-2", "vm"]
+          "arguments": [
+            "-n=vm-legacy-linux-debug-x64",
+            "--arch=x64",
+            "--no-preview-dart-2",
+            "vm"]
         }
       ]
     },
@@ -277,7 +450,10 @@
         },
         {
           "name": "vm legacy tests",
-          "arguments": ["--compiler=dartk", "--no-preview-dart-2"],
+          "arguments": [
+            "-n=dartk-legacy-linux-release-x64",
+            "--compiler=dartk",
+            "--no-preview-dart-2"],
           "fileset": "vm-kernel",
           "shards": 10
         }
@@ -302,11 +478,11 @@
           ]
         },
         {
-          "name": "strong vm tests",
+          "name": "vm tests",
           "arguments": [
+            "-n=dartkp-${system}-release-${arch}",
             "--compiler=dartkp",
             "--runtime=dart_precompiled",
-            "--strong",
             "--use-blobs"
           ],
           "fileset": "vm-kernel",
@@ -331,11 +507,11 @@
           ]
         },
         {
-          "name": "strong vm tests",
+          "name": "vm tests",
           "arguments": [
+            "-n=dartkp-linux-release-x64",
             "--compiler=dartkp",
-            "--runtime=dart_precompiled",
-            "--strong"
+            "--runtime=dart_precompiled"
           ],
           "fileset": "vm-kernel",
           "shards": 10
@@ -359,12 +535,12 @@
           ]
         },
         {
-          "name": "strong vm tests",
+          "name": "vm tests",
           "arguments": [
+            "-n=dartkp-linux-debug-x64",
             "--compiler=dartkp",
             "--runtime=dart_precompiled",
-            "--vm-options=--no-enable-malloc-hooks",
-            "--strong"
+            "--vm-options=--no-enable-malloc-hooks"
           ],
           "fileset": "vm-kernel",
           "shards": 10
@@ -391,7 +567,11 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--timeout=240", "--no-preview-dart-2"],
+          "arguments": [
+            "-n=vm-legacy-asan-linux-release-x64",
+            "--timeout=240",
+            "--no-preview-dart-2",
+            "--builder-tag=asan"],
           "environment": {
             "ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
             "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
@@ -399,7 +579,12 @@
         },
         {
           "name": "checked vm tests",
-          "arguments": ["--checked", "--no-preview-dart-2", "--timeout=240"],
+          "arguments": [
+            "-n=vm-legacy-checked-asan-linux-release-x64",
+            "--checked",
+            "--no-preview-dart-2",
+            "--timeout=240",
+            "--builder-tag=asan"],
           "environment": {
             "ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
             "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
@@ -429,8 +614,10 @@
           "arguments": ["runtime_kernel"]
         },
         {
-          "name": "strong vm tests",
-          "arguments": ["--compiler=dartk", "--strong"],
+          "name": "vm tests",
+          "arguments": [
+            "-n=dartk-${system}-${mode}-${arch}",
+            "--compiler=dartk"],
           "fileset": "vm-kernel",
           "shards": 10
         }
@@ -455,7 +642,10 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--compiler=app_jit", "--no-preview-dart-2"]
+          "arguments": [
+            "-n=app_jit-legacy-linux-${mode}-x64",
+            "--compiler=app_jit",
+            "--no-preview-dart-2"]
         }
       ]
     },
@@ -478,7 +668,9 @@
         },
         {
           "name": "vm tests",
-          "arguments": ["--compiler=app_jitk", "--strong"]
+          "arguments": [
+            "-n=app_jitk-linux-${mode}-x64",
+            "--compiler=app_jitk"]
         }
       ]
     },
@@ -836,10 +1028,37 @@
     },
     {
       "builders": [
-        "dart2js-hostchecked-linux-ia32-d8"
+        "dart2js-unit-linux-x64-release"
       ],
       "meta": {
-        "description": "This configuration is for the host-checked d8 builder group."
+        "description": "Runs the dart2js unit tests."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
+          "name": "dart2js unit tests",
+          "arguments": [
+            "--compiler=none",
+            "--runtime=vm",
+            "--timeout=120",
+            "--checked",
+            "--no-preview-dart-2",
+            "dart2js",
+            "pkg/compiler"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": [
+        "dart2js-strong-hostasserts-linux-ia32-d8"
+      ],
+      "meta": {
+        "description": "dart2js-d8 tests with assertions during compilation"
       },
       "steps": [
         {
@@ -852,20 +1071,18 @@
           "arguments": [
             "--compiler=dart2js",
             "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
+            "--host-checked"
           ],
-          "exclude_tests": ["observatory_ui", "co19"]
+          "exclude_tests": ["observatory_ui", "co19"],
+          "shards": 6,
+          "fileset": "dart2js_hostasserts"
         },
         {
           "name": "dart2js package tests",
           "arguments": [
             "--compiler=dart2js",
             "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
+            "--host-checked"
           ],
           "tests": ["pkg"]
         },
@@ -874,9 +1091,7 @@
           "arguments": [
             "--compiler=dart2js",
             "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
+            "--host-checked"
           ],
           "tests": ["observatory_ui"]
         },
@@ -885,100 +1100,15 @@
           "arguments": [
             "--compiler=dart2js",
             "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
+            "--host-checked"
           ],
           "tests": ["dart2js_extra","dart2js_native"]
-        },
-        {
-          "name": "dart2js co19 tests",
-          "arguments": [
-            "--compiler=dart2js",
-            "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["co19"]
-        },
-        {
-          "name": "dart2js checked tests",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2js",
-            "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
-          ],
-          "exclude_tests": ["observatory_ui", "co19"]
-        },
-        {
-          "name": "dart2js checked package tests",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2js",
-            "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["pkg"]
-        },
-        {
-          "name": "dart2js checked observatory-ui tests",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2js",
-            "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["observatory_ui"]
-        },
-        {
-          "name": "dart2js checked extra tests",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2js",
-            "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
-        },
-        {
-          "name": "dart2js checked co19 tests",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2js",
-            "--dart2js-batch",
-            "--host-checked",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["co19"]
-        },
-        {
-          "name": "dart2js checked unit tests",
-          "arguments": [
-            "--checked",
-            "--compiler=none",
-            "--no-preview-dart-2",
-            "--reset-browser-configuration",
-            "--runtime=vm"
-          ],
-          "tests": ["dart2js"]
         }
       ]
     },
     {
       "builders": [
         "dart2js-linux-x64-chrome",
-        "dart2js-linux-x64-drt",
         "dart2js-linux-x64-ff",
         "dart2js-mac-x64-chrome",
         "dart2js-mac-x64-safari",
@@ -988,7 +1118,7 @@
         "dart2js-win-x64-ie11"
       ],
       "meta": {
-        "description": "These builders run dart2js tests."
+        "description": "dart2js browser tests."
       },
       "steps": [
         {
@@ -1059,11 +1189,17 @@
     },
     {
       "builders": [
-        "dart2js-faststartup-linux-x64-chrome"
+        "dart2js-faststartup-linux-x64-chrome",
+        "dart2js-faststartup-linux-x64-ff",
+        "dart2js-faststartup-mac-x64-chrome",
+        "dart2js-faststartup-mac-x64-safari",
+        "dart2js-faststartup-win-x64-chrome",
+        "dart2js-faststartup-win-x64-edge",
+        "dart2js-faststartup-win-x64-ff",
+        "dart2js-faststartup-win-x64-ie11"
       ],
       "meta": {
-        "description":
-          "These builders run dart2js tests with the --fast-startup option."
+        "description": "dart2js browser tests using the fast-startup emitter."
       },
       "steps": [
         {
@@ -1138,9 +1274,141 @@
       ]
     },
     {
+      "builders": [
+        "dart2js-strong-linux-x64-chrome",
+        "dart2js-strong-linux-x64-ff",
+        "dart2js-strong-mac-x64-chrome",
+        "dart2js-strong-mac-x64-safari",
+        "dart2js-strong-win-x64-chrome",
+        "dart2js-strong-win-x64-edge",
+        "dart2js-strong-win-x64-ff",
+        "dart2js-strong-win-x64-ie11"
+      ],
+      "meta": {
+        "description": "dart2js browser tests for Dart 2.0."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
+          "name": "dart2js tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "exclude_tests": ["observatory_ui", "co19"],
+          "shards": 6,
+          "fileset": "dart2js"
+        },
+        {
+          "name": "dart2js package tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "tests": ["pkg"]
+        },
+        {
+          "name": "dart2js observatory-ui tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "tests": ["observatory_ui"]
+        },
+        {
+          "name": "dart2js extra tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "tests": ["dart2js_extra","dart2js_native"]
+        }
+      ]
+    },
+    {
+      "builders": [
+        "dart2js-strong-faststartup-linux-x64-chrome",
+        "dart2js-strong-faststartup-linux-x64-ff",
+        "dart2js-strong-faststartup-mac-x64-chrome",
+        "dart2js-strong-faststartup-mac-x64-safari",
+        "dart2js-strong-faststartup-win-x64-chrome",
+        "dart2js-strong-faststartup-win-x64-edge",
+        "dart2js-strong-faststartup-win-x64-ff",
+        "dart2js-strong-faststartup-win-x64-ie11"
+      ],
+      "meta": {
+        "description": "dart2js browser tests using the fast-startup emitter for Dart 2.0."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
+          "name": "dart2js fast-startup tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "exclude_tests": ["observatory_ui", "co19"],
+          "shards": 6,
+          "fileset": "dart2js"
+        },
+        {
+          "name": "dart2js fast-startup package tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "tests": ["pkg"]
+        },
+        {
+          "name": "dart2js fast-startup observatory-ui tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "tests": ["observatory_ui"]
+        },
+        {
+          "name": "dart2js fast-startup extra tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--reset-browser-configuration",
+            "--use-sdk"
+          ],
+          "tests": ["dart2js_extra","dart2js_native"]
+        }
+      ]
+    },
+    {
       "builders": ["dart2js-minified-linux-x64-d8"],
       "meta": {
-        "description": "This builder runs the dart2js tests in minified mode."
+        "description": "dart2js tests in minified mode."
       },
       "steps": [
         {
@@ -1243,7 +1511,7 @@
           "tests": ["dart2js_extra","dart2js_native"]
         },
         {
-          "name": "dart2js fast-startup pkg tests",
+          "name": "dart2js fast-startup package tests",
           "arguments": [
             "--compiler=dart2js",
             "--dart2js-batch",
@@ -1284,9 +1552,110 @@
       ]
     },
     {
+      "builders": ["dart2js-minified-strong-linux-x64-d8"],
+      "meta": {
+        "description": "dart2js tests for Dart 2.0."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
+          "name": "dart2js tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--minified",
+            "--use-sdk"
+          ],
+          "exclude_tests": ["observatory_ui", "co19"],
+          "shards": 6,
+          "fileset": "dart2js"
+        },
+        {
+          "name": "dart2js fast-startup tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--minified",
+            "--use-sdk"
+          ],
+          "exclude_tests": ["observatory_ui", "co19"],
+          "shards": 6,
+          "fileset": "dart2js"
+        },
+        {
+          "name": "dart2js package tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--minified",
+            "--use-sdk"
+          ],
+          "tests": ["pkg"]
+        },
+        {
+          "name": "dart2js observatory-ui tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--minified",
+            "--use-sdk"
+          ],
+          "tests": ["observatory_ui"]
+        },
+        {
+          "name": "dart2js extra tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--minified",
+            "--use-sdk"
+          ],
+          "tests": ["dart2js_extra","dart2js_native"]
+        },
+        {
+          "name": "dart2js fast-startup package tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--minified",
+            "--use-sdk"
+          ],
+          "tests": ["pkg"]
+        },
+        {
+          "name": "dart2js fast-startup observatory-ui tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--minified",
+            "--use-sdk"
+          ],
+          "tests": ["observatory_ui"]
+        },
+        {
+          "name": "dart2js fast-startup extra tests",
+          "arguments": [
+            "--compiler=dart2js",
+            "--dart2js-batch",
+            "--fast-startup",
+            "--minified",
+            "--use-sdk"
+          ],
+          "tests": ["dart2js_extra","dart2js_native"]
+        }
+      ]
+    },
+    {
       "builders": ["dart2js-csp-minified-linux-x64-chrome"],
       "meta": {
-        "description": "This builder runs the dart2js tests in csp and minified mode."
+        "description": "dart2js tests in csp and minified mode."
       },
       "steps": [
         {
@@ -1396,7 +1765,7 @@
           "tests": ["dart2js_extra","dart2js_native"]
         },
         {
-          "name": "dart2js fast-startup pkg tests",
+          "name": "dart2js fast-startup package tests",
           "arguments": [
             "--compiler=dart2js",
             "--csp",
@@ -1492,7 +1861,7 @@
         "analyzer-win-release"
       ],
       "meta": {
-        "description": "This configuration is used by the analyzer builders not running strong mode."
+        "description": "This configuration is used by the analyzer builders."
       },
       "steps": [
         {
@@ -1501,37 +1870,18 @@
           "arguments": ["create_sdk"]
         },
         {
-          "name": "analyze tests",
+          "name": "analyze tests enable-asserts",
           "arguments": [
             "--compiler=dart2analyzer",
-            "--no-preview-dart-2",
+            "--enable-asserts",
             "--use-sdk"
           ]
         },
         {
-          "name": "analyze pkg tests",
+          "name": "analyze pkg tests enable-asserts",
           "arguments": [
             "--compiler=dart2analyzer",
-            "--no-preview-dart-2",
-            "--use-sdk",
-            "pkg"
-          ]
-        },
-        {
-          "name": "analyze tests checked",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2analyzer",
-            "--no-preview-dart-2",
-            "--use-sdk"
-          ]
-        },
-        {
-          "name": "analyze pkg tests checked",
-          "arguments": [
-            "--checked",
-            "--compiler=dart2analyzer",
-            "--no-preview-dart-2",
+            "--enable-asserts",
             "--use-sdk",
             "pkg"
           ]
@@ -1539,9 +1889,8 @@
         {
           "name": "analyzer unit tests",
           "arguments": [
-            "--checked",
             "--compiler=none",
-            "--no-preview-dart-2",
+            "--enable-asserts",
             "--use-sdk",
             "pkg/analyzer"
           ]
@@ -1549,9 +1898,8 @@
         {
           "name": "analysis_server unit tests",
           "arguments": [
-            "--checked",
             "--compiler=none",
-            "--no-preview-dart-2",
+            "--enable-asserts",
             "--use-sdk",
             "pkg/analysis_server"
           ]
@@ -1559,9 +1907,8 @@
         {
           "name": "analyzer_cli unit tests",
           "arguments": [
-            "--checked",
             "--compiler=none",
-            "--no-preview-dart-2",
+            "--enable-asserts",
             "--use-sdk",
             "pkg/analyzer_cli"
           ]
@@ -1569,43 +1916,18 @@
         {
           "name": "analyzer_plugin unit tests",
           "arguments": [
-            "--checked",
             "--compiler=none",
-            "--no-preview-dart-2",
+            "--enable-asserts",
             "--use-sdk",
             "pkg/analyzer_plugin"
           ]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "analyzer-strong-linux-release",
-        "analyzer-strong-mac-release",
-        "analyzer-strong-win-release"
-      ],
-      "meta": {
-        "description": "This configuration is used by the analyzer builders running strong mode."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["create_sdk"]
         },
         {
-          "name": "analyze pkg tests",
+          "name": "analyze tests co19_2",
           "arguments": [
             "--compiler=dart2analyzer",
             "--use-sdk",
-            "pkg"
-          ]
-        },
-        {
-          "name": "analyze tests preview-dart2",
-          "arguments": [
-            "--compiler=dart2analyzer",
-            "--use-sdk"
+            "co19_2"
           ]
         }
       ]
@@ -1632,9 +1954,19 @@
           "arguments": ["--no-hints","pkg/analyzer"]
         },
         {
-          "name": "Analyze pkg/analyzer_plugin",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": ["--no-hints","pkg/analyzer_plugin"]
+          "name": "analyze tests",
+          "arguments": [
+            "--compiler=dart2analyzer",
+            "--use-sdk"
+          ]
+        },
+        {
+          "name": "analyze pkg tests",
+          "arguments": [
+            "--compiler=dart2analyzer",
+            "--use-sdk",
+            "pkg"
+          ]
         }
       ]
     },
@@ -1677,6 +2009,15 @@
           ]
         },
         {
+          "name": "run language2 tests",
+          "arguments": [
+            "--analyzer-use-fasta-parser",
+            "--compiler=dart2analyzer",
+            "--use-sdk",
+            "language_2"
+          ]
+        },
+        {
           "name": "run analyzer unit tests",
           "arguments": [
             "--builder-tag=analyzer_use_fasta",
diff --git a/tools/bots/try_test.dart b/tools/bots/try_test.dart
index 1365fb0..962568b 100644
--- a/tools/bots/try_test.dart
+++ b/tools/bots/try_test.dart
@@ -107,7 +107,7 @@
 int getIntegerStepInput(String information) {
   print("$information:");
   var input = stdin.readLineSync();
-  var value = int.parse(input, onError: (source) => null);
+  var value = int.tryParse(input);
   if (value == null) {
     print("Input could not be parsed as an integer.");
     return getIntegerStepInput(information);
diff --git a/tools/gardening/analysis_options.yaml b/tools/gardening/analysis_options.yaml
index 3acdae1..b5516058 100644
--- a/tools/gardening/analysis_options.yaml
+++ b/tools/gardening/analysis_options.yaml
@@ -3,8 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyzer:
-  strong-mode: true
   errors:
     # Allow having TODOs in the code
     todo: ignore
-    uses_dynamic_as_bottom: ignore
\ No newline at end of file
diff --git a/tools/gardening/lib/src/results/configuration_environment.dart b/tools/gardening/lib/src/results/configuration_environment.dart
index 667a772..53da74d 100644
--- a/tools/gardening/lib/src/results/configuration_environment.dart
+++ b/tools/gardening/lib/src/results/configuration_environment.dart
@@ -46,7 +46,7 @@
   }),
   "minified": new _Variable.bool((c) => c.minified),
   "mode": new _Variable((c) => c.mode, Mode.names),
-  "preview_dart_2": new _Variable.bool((c) => c.previewDart2),
+  "no_preview_dart_2": new _Variable.bool((c) => c.noPreviewDart2),
   "runtime": new _Variable(_runtimeName, Runtime.names),
   "spec_parser": new _Variable.bool((c) => c.compiler == Compiler.specParser),
   "strong": new _Variable.bool((c) => c.strong),
diff --git a/tools/gardening/lib/src/results/result_json_models.dart b/tools/gardening/lib/src/results/result_json_models.dart
index 287902d..954b1c52 100644
--- a/tools/gardening/lib/src/results/result_json_models.dart
+++ b/tools/gardening/lib/src/results/result_json_models.dart
@@ -28,7 +28,7 @@
   final bool enableAsserts;
   final bool hotReload;
   final bool hotReloadRollback;
-  final bool previewDart2;
+  final bool noPreviewDart2;
   final List<String> selectors;
 
   Configuration(
@@ -53,17 +53,18 @@
       this.enableAsserts,
       this.hotReload,
       this.hotReloadRollback,
-      this.previewDart2,
+      this.noPreviewDart2,
       this.selectors);
 
   static Configuration getFromJson(dynamic json) {
+    var isStrong = !(json["no_preview_dart_2"] ?? false);
     return new Configuration(
         json["mode"],
         json["arch"],
         json["compiler"],
         json["runtime"],
         json["checked"],
-        json["strong"],
+        isStrong,
         json["host_checked"],
         json["minified"],
         json["csp"],
@@ -79,7 +80,7 @@
         json["enable_asserts"] ?? false,
         json["hot_reload"] ?? false,
         json["hot_reload_rollback"] ?? false,
-        json["preview_dart_2"] ?? false,
+        !isStrong,
         json["selectors"].cast<String>() ?? <String>[]);
   }
 
@@ -107,7 +108,7 @@
       _boolToArg("enable-asserts", enableAsserts),
       _boolToArg("hot-reload", hotReload),
       _boolToArg("hot-reload-rollback", hotReloadRollback),
-      _boolToArg("preview-dart-2", previewDart2)
+      _boolToArg("no-preview-dart-2", noPreviewDart2)
     ].where((x) => x != null).toList();
     if (includeSelectors && selectors != null && selectors.length > 0) {
       args.addAll(selectors);
@@ -119,7 +120,7 @@
     return "$mode;$arch;$compiler;$runtime;$checked;$strong;$hostChecked;"
         "$minified;$csp;$fasta;$system;$vmOptions;$useSdk;$builderTag;$fastStartup;"
         "$dart2JsWithKernel;$dart2JsOldFrontend;$enableAsserts;$hotReload;"
-        "$hotReloadRollback;$previewDart2;$selectors";
+        "$hotReloadRollback;$noPreviewDart2;$selectors";
   }
 
   String _stringToArg(String name, String value) {
diff --git a/tools/infra/config/cq.cfg b/tools/infra/config/cq.cfg
index 54077f3..74b7c37 100644
--- a/tools/infra/config/cq.cfg
+++ b/tools/infra/config/cq.cfg
@@ -18,14 +18,14 @@
   try_job {
     buckets {
       name: "luci.dart.try"
+      builders { name: "analyzer-analysis-server-linux-try" }
       builders { name: "analyzer-linux-release-try" }
-      builders { name: "analyzer-strong-linux-release-try" }
       builders { name: "benchmark-linux-try" }
       builders { name: "dart-sdk-windows-try" }
-      builders { name: "dart2js-linux-d8-hostchecked-try" }
-      builders { name: "dart2js-linux-d8-kernel-minified-try" }
-      builders { name: "dart2js-linux-none-only-unittest-try" }
-      builders { name: "dart2js-linux-x64-chrome-try" }
+      builders { name: "dart2js-strong-linux-x64-chrome-try" }
+      builders { name: "dart2js-minified-strong-linux-x64-d8-try" }
+      builders { name: "dart2js-strong-hostasserts-linux-ia32-d8-try" }
+      builders { name: "dart2js-unit-linux-x64-release-try" }
       builders { name: "ddc-linux-release-chrome-try" }
       builders { name: "front-end-linux-release-x64-try" }
       builders { name: "pkg-linux-release-try" }
diff --git a/tools/make_version.py b/tools/make_version.py
index f1a15e0..634586a 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -96,7 +96,7 @@
     parser.add_option("--input",
         action="store",
         type="string",
-        help="input template file")
+        help="input template file.")
     parser.add_option("--no_git_hash",
         action="store_true",
         default=False,
@@ -111,10 +111,23 @@
         help="disable console output")
 
     (options, args) = parser.parse_args()
+
+    # If there is no input template, then write the bare version string to
+    # options.output. If there is no options.output, then write the version
+    # string to stdout.
+    if not options.input:
+      version_string = MakeVersionString(
+          options.quiet, options.no_git_hash, options.custom_for_pub)
+      if options.output:
+        open(options.output, 'w').write(version_string)
+      else:
+        print version_string
+      return 0
+
     if not options.output:
       sys.stderr.write('--output not specified\n')
       return -1
-    if not len(options.input):
+    if not options.input:
       sys.stderr.write('--input not specified\n')
       return -1
 
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
index 42028b7..6d9c9e5 100755
--- a/tools/observatory_tool.py
+++ b/tools/observatory_tool.py
@@ -4,17 +4,10 @@
 # BSD-style license that can be found in the LICENSE file.
 """Helper for building and deploying Observatory"""
 
-import argparse
 import os
-import platform
 import shutil
-import subprocess
 import sys
-import utils
 
-SCRIPT_DIR = os.path.dirname(sys.argv[0])
-DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
-DART2JS_PATH = os.path.join(DART_ROOT, 'pkg', 'compiler', 'bin', 'dart2js.dart')
 IGNORE_PATTERNS = shutil.ignore_patterns(
     '$sdk',
     '*.concat.js',
@@ -37,112 +30,6 @@
     'webcomponents-lite.js',
     'webcomponents.*')
 
-usage = """observatory_tool.py [options]"""
-
-def DisplayBootstrapWarning():
-  print """\
-
-WARNING: Your system cannot run the checked-in Dart SDK. Using the
-bootstrap Dart executable will make debug builds slow.
-Please see the Wiki for instructions on replacing the checked-in Dart SDK.
-
-https://github.com/dart-lang/sdk/wiki/The-checked-in-SDK-in-tools
-
-To use the dart_bootstrap binary please update the Build function
-in the tools/observatory_tool.py script.
-
-"""
-
-def DisplayFailureMessage():
-  print """\
-
-ERROR: Observatory failed to build. What should you do?
-
-1. Revert to a working revision of the Dart VM
-2. Contact zra@, rmacnak@, dart-vm-team@
-3. File a bug: https://github.com/dart-lang/sdk/issues/new
-
-"""
-
-# Run |command|. If its return code is 0, return 0 and swallow its output.
-# If its return code is non-zero, emit its output unless |always_silent| is
-# True, and return the return code.
-def RunCommand(command, always_silent=False):
-  try:
-    subprocess.check_output(command,
-                            stderr=subprocess.STDOUT)
-    return 0
-  except subprocess.CalledProcessError as e:
-    if not always_silent:
-      print ("Command failed: " + ' '.join(command) + "\n" +
-              "output: " + e.output)
-      DisplayFailureMessage()
-    return e.returncode
-
-def BuildArguments():
-  result = argparse.ArgumentParser(usage=usage)
-  result.add_argument("--dart-executable", help="dart executable", default=None)
-  result.add_argument("--dart2js-executable", help="dart2js executable",
-                      default=None)
-  result.add_argument("--directory", help="observatory root", default=None)
-  result.add_argument("--command", help="[build, deploy]", default=None)
-  result.add_argument("--silent", help="silence all output", default=None)
-  result.add_argument("--sdk", help="Use prebuilt sdk", default=None)
-  return result
-
-def ProcessOptions(options, args):
-  # Fix broken boolean parsing in argparse, where False ends up being True.
-  if (options.silent is not None) and (options.silent == "True"):
-    options.silent = True
-  elif (options.silent is None) or (options.silent == "False"):
-    options.silent = False
-  else:
-    print "--silent expects 'True' or 'False' argument."
-    return False
-
-  if (options.sdk is not None) and (options.sdk == "True"):
-    options.sdk = True
-  elif (options.sdk is None) or (options.sdk == "False"):
-    options.sdk = False
-  else:
-    print "--sdk expects 'True' or 'False' argument."
-    return False
-
-  # Required options.
-  if options.command is None or options.directory is None:
-    return False
-
-  # If a dart2js execuble was provided, try and use that.
-  # TODO(whesse): Drop the dart2js-executable option if it isn't used.
-  if options.dart2js_executable is not None:
-    try:
-      if 0 == RunCommand([options.dart2js_executable, '--version'],
-                         always_silent=True):
-        return True
-    except OSError as e:
-      pass
-  options.dart2js_executable = None
-
-  # Use the checked in dart2js executable.
-  if options.sdk and utils.CheckedInSdkCheckExecutable():
-    dart2js_binary = 'dart2js.bat' if utils.IsWindows() else 'dart2js'
-    options.dart2js_executable = os.path.join(utils.CheckedInSdkPath(),
-                                             'bin',
-                                             dart2js_binary)
-    try:
-      if 0 == RunCommand([options.dart2js_executable, '--version'],
-                         always_silent=True):
-        return True
-    except OSError as e:
-      pass
-  options.dart2js_executable = None
-
-  # We need a dart executable and will run from source
-  return (options.dart_executable is not None)
-
-def ChangeDirectory(directory):
-  os.chdir(directory);
-
 # - Copy over the filtered web directory
 # - Merge in the .js file
 # - Copy over the filtered dependency lib directories
@@ -167,62 +54,11 @@
   shutil.copytree(observatory_lib, os.path.join(packages_dir, 'observatory'),
                   ignore=IGNORE_PATTERNS)
 
-def Build(dart_executable,
-          dart2js_executable,
-          script_path,
-          output_path,
-          packages_path,
-          silent):
-  if dart2js_executable is not None:
-    command = [dart2js_executable]
-  else:
-    if not silent:
-      DisplayBootstrapWarning()
-    command = [dart_executable, DART2JS_PATH]
-  command += ['--no-preview-dart-2']
-  command += ['-DOBS_VER=' + utils.GetVersion(no_git_hash=True)]
-  command += [script_path, '-o', output_path, '--packages=%s' % packages_path]
-  # Add the defaults pub used
-  command += ['--minify']
-  if not silent:
-    print >> sys.stderr, 'Running command "%s"' % command
-  return RunCommand(command)
 
-def ExecuteCommand(options, args):
-  cmd = options.command
-  if (cmd == 'build'):
-    return Build(options.dart_executable,
-                 options.dart2js_executable,
-                 args[0],
-                 args[1],
-                 args[2],
-                 options.silent)
-  elif (cmd == 'deploy'):
-    Deploy(args[0], args[1], args[2], args[3], args[4])
-  else:
-    print >> sys.stderr, ('ERROR: command "%s" not supported') % (cmd)
-    return -1;
+def Main():
+  args = sys.argv[1:]
+  return Deploy(args[0], args[1], args[2], args[3], args[4])
 
-def main():
-  # Parse the options.
-  parser = BuildArguments()
-  (options, args) = parser.parse_known_args()
-  if not ProcessOptions(options, args):
-    parser.print_help()
-    return 1
-  # Calculate absolute paths before changing directory.
-  if (options.dart_executable != None):
-    options.dart_executable = os.path.abspath(options.dart_executable)
-  if (options.dart2js_executable != None):
-    options.dart2js_executable = os.path.abspath(options.dart2js_executable)
-  if len(args) == 1:
-    args[0] = os.path.abspath(args[0])
-  try:
-    # Pub must be run from the project's root directory.
-    ChangeDirectory(options.directory)
-    return ExecuteCommand(options, args)
-  except:
-    DisplayFailureMessage()
 
 if __name__ == '__main__':
-  sys.exit(main());
+  sys.exit(Main());
diff --git a/tools/print_version.py b/tools/print_version.py
deleted file mode 100755
index 13cbf75..0000000
--- a/tools/print_version.py
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-#
-# A script which will be invoked from gyp to print the current version of the
-# SDK.
-#
-# Usage: print_version
-#
-
-import sys
-import utils
-
-def Main():
-  version = utils.GetVersion()
-  if not version:
-    print 'Error: Couldn\'t determine version string.'
-    return 1
-  print version
-
-if __name__ == '__main__':
-  sys.exit(Main())
diff --git a/tools/test_generators/async_nested_test_generator.dart b/tools/test_generators/async_nested_test_generator.dart
new file mode 100644
index 0000000..2d09a39
--- /dev/null
+++ b/tools/test_generators/async_nested_test_generator.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.
+
+// See http://dartbug.com/33660 for details about what inspired this generator.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:math';
+
+Random random = new Random();
+int totalNodes = 0;
+Set<String> seen = new Set<String>();
+
+main(List<String> args) async {
+  int maxSize;
+  if (args.length > 0) maxSize = int.tryParse(args[0]);
+  maxSize ??= 5;
+
+  for (int i = 0; i < 2500; i++) {
+    stdout.write(".");
+    if (i % 75 == 74) stdout.write("\n");
+    totalNodes = 0;
+    Tree tree = fuzz(1 + random.nextInt(5), 1 + random.nextInt(8), maxSize);
+    String expected =
+        new List<String>.generate(totalNodes, (i) => "${i + 1}").join(" ");
+    String asyncProgram = printProgram(tree, true, false, true, '"$expected"');
+    if (seen.add(asyncProgram)) {
+      File asyncFile = new File('${maxSize}_${i}.dart')
+        ..writeAsStringSync(asyncProgram);
+
+      List<String> run = await executeAndGetStdOut(
+          Platform.executable, <String>[asyncFile.path]);
+      if (expected == run[0]) {
+        asyncFile.deleteSync();
+      } else {
+        print("\n${asyncFile.path} was not as expected!");
+        String name = "async_nested_${maxSize}_${i}_test.dart";
+        asyncFile.renameSync(name);
+        print(" -> Created $name");
+        print("    (you might want to run dartfmt -w $name).");
+      }
+    }
+  }
+  print(" done ");
+}
+
+Tree fuzz(int asyncLikely, int childrenLikely, int maxSize) {
+  // asyncLikely = 3;
+  // childrenLikely = 5;
+  totalNodes++;
+  Tree result = new Tree();
+  result.name = "$totalNodes";
+  result.async = random.nextInt(10) < asyncLikely;
+
+  while (random.nextInt(10) < childrenLikely) {
+    if (totalNodes >= maxSize) return result;
+    result.children
+        .add(fuzz(1 + random.nextInt(5), 1 + random.nextInt(8), maxSize));
+  }
+
+  return result;
+}
+
+String printProgram(Tree tree, bool emitAsync, bool emitPrintOnCreate,
+    bool printSimple, String expected) {
+  StringBuffer lines = new StringBuffer();
+  lines.write("""
+// 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 has been automatically generated by script
+// "async_nested_test_generator.dart".
+
+import 'dart:async';
+
+void main() async {
+""");
+
+  printNode(Tree node) {
+    if (node.async && emitAsync) {
+      lines.write("await new Future.value(");
+    }
+    lines.writeln("new Node('${node.name}', [");
+    for (Tree child in node.children) {
+      printNode(child);
+      lines.write(",");
+    }
+    lines.writeln("])");
+    if (node.async && emitAsync) {
+      lines.write(")");
+    }
+  }
+
+  if (expected != null) {
+    lines.writeln('String expected = $expected;');
+  }
+  lines.write("Node node = ");
+  printNode(tree);
+  lines.writeln(";");
+  if (printSimple) {
+    lines.writeln("String actual = node.toSimpleString();");
+  } else {
+    lines.writeln("String actual = node.toString();");
+  }
+  lines.writeln("print(actual);");
+
+  if (expected != null) {
+    lines.writeln(r"""if (actual != expected) {
+      throw "Expected '$expected' but got '$actual'";
+    }""");
+  }
+
+  lines.writeln(r"""
+}
+
+class Node {
+  final List<Node> nested;
+  final String name;
+
+  Node(this.name, [this.nested]) {
+""");
+  if (emitPrintOnCreate) {
+    lines.writeln(r'print("Creating $name");');
+  }
+
+  lines.write(r"""
+  }
+
+  String toString() => '<$name:[${nested?.join(', ')}]>';
+
+  toSimpleString() {
+    var tmp = nested?.map((child) => child.toSimpleString());
+    return '$name ${tmp?.join(' ')}'.trim();
+  }
+}
+""");
+
+  return lines.toString();
+}
+
+Future<List<String>> executeAndGetStdOut(
+    String executable, List<String> arguments) async {
+  var process = await Process.start(executable, arguments);
+  Future<List<String>> result = combine(
+      process.stdout
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .toList(),
+      process.stderr
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .toList());
+  int exitCode = await process.exitCode;
+  (await result).add("Exit code: $exitCode");
+
+  return result;
+}
+
+Future<List<String>> combine(
+    Future<List<String>> a, Future<List<String>> b) async {
+  List<String> aDone = await a;
+  List<String> bDone = await b;
+  List<String> result = new List.from(aDone);
+  result.addAll(bDone);
+  return result;
+}
+
+class Tree {
+  String name;
+  bool async = false;
+  List<Tree> children = <Tree>[];
+}
diff --git a/tools/testing/dart/android.dart b/tools/testing/dart/android.dart
index 7f9adcd..20e5fca 100644
--- a/tools/testing/dart/android.dart
+++ b/tools/testing/dart/android.dart
@@ -63,7 +63,7 @@
     if (timeout != null) {
       timer = new Timer(timeout, () {
         timedOut = true;
-        process.kill(ProcessSignal.SIGTERM);
+        process.kill(ProcessSignal.sigterm);
         timer = null;
       });
     }
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 2489eb3..3bfbc8f 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -142,7 +142,7 @@
   Future close() {
     _logEvent("Close called on browser");
     if (process != null) {
-      if (process.kill(ProcessSignal.SIGKILL)) {
+      if (process.kill(ProcessSignal.sigkill)) {
         _logEvent("Successfully sent kill signal to process.");
       } else {
         _logEvent("Sending kill signal failed.");
@@ -370,7 +370,7 @@
 
   Future<Null> _createLaunchHTML(String path, String url) async {
     var file = new File("$path/launch.html");
-    var randomFile = await file.open(mode: FileMode.WRITE);
+    var randomFile = await file.open(mode: FileMode.write);
     var content = '<script language="JavaScript">location = "$url"</script>';
     await randomFile.writeString(content);
     await randomFile.close();
@@ -713,7 +713,7 @@
 
   void _createPreferenceFile(String path) {
     var file = new File("$path/user.js");
-    var randomFile = file.openSync(mode: FileMode.WRITE);
+    var randomFile = file.openSync(mode: FileMode.write);
     randomFile.writeStringSync(enablePopUp);
     randomFile.writeStringSync(disableDefaultCheck);
     randomFile.writeStringSync(disableScriptTimeLimit);
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index c077166..439f46c 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -689,7 +689,7 @@
   ///
   /// Warning: this command removes temporary file and violates tracking of
   /// dependencies between commands, which may cause problems if multiple
-  /// almost identical configurations are tested simultaneosly.
+  /// almost identical configurations are tested simultaneously.
   Command computeRemoveKernelFileCommand(String tempDir, List arguments,
       Map<String, String> environmentOverrides) {
     String exec;
@@ -819,7 +819,7 @@
   /// tests by 60%.
   /// Warning: this command removes temporary file and violates tracking of
   /// dependencies between commands, which may cause problems if multiple
-  /// almost identical configurations are tested simultaneosly.
+  /// almost identical configurations are tested simultaneously.
   Command computeRemoveAssemblyCommand(String tempDir, List arguments,
       Map<String, String> environmentOverrides) {
     var exec = 'rm';
@@ -999,12 +999,8 @@
   CommandArtifact computeCompilationArtifact(String tempDir,
       List<String> arguments, Map<String, String> environmentOverrides) {
     arguments = arguments.toList();
-    if (_isChecked || previewDart2) {
-      arguments.add('--enable_type_checks');
-    }
     if (!previewDart2) {
-      arguments.add('--no-preview-dart-2');
-      arguments.add('--no-strong');
+      throw new ArgumentError('--no-preview-dart-2 not supported');
     }
     if (_configuration.useAnalyzerCfe) {
       arguments.add('--use-cfe');
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 6955cd1..34032e7 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -290,7 +290,7 @@
         if (data == 'close-with-error') {
           // Note: according to the web-sockets spec, a reason longer than 123
           // bytes will produce a SyntaxError on the client.
-          websocket.close(WebSocketStatus.UNSUPPORTED_DATA, 'X' * 124);
+          websocket.close(WebSocketStatus.unsupportedData, 'X' * 124);
         } else {
           websocket.close();
         }
@@ -442,14 +442,14 @@
           '"${request.uri.path}"');
     }
     var response = request.response;
-    response.statusCode = HttpStatus.NOT_FOUND;
+    response.statusCode = HttpStatus.notFound;
 
     // Send a nice HTML page detailing the error message.  Most browsers expect
     // this, for example, Chrome will simply display a blank page if you don't
     // provide any information.  A nice side effect of this is to work around
     // Firefox bug 1016313
     // (https://bugzilla.mozilla.org/show_bug.cgi?id=1016313).
-    response.headers.set(HttpHeaders.CONTENT_TYPE, 'text/html');
+    response.headers.set(HttpHeaders.contentTypeHeader, 'text/html');
     String escapedPath = const HtmlEscape().convert(request.uri.path);
     response.write("""
 <!DOCTYPE html>
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index c7dcc55..aa4b0bf 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -161,7 +161,9 @@
         hide: true),
     new _Option.bool('checked', 'Run tests in checked mode.'),
     new _Option.bool('strong', 'Deprecated, no-op.', hide: true),
-    new _Option.bool('host_checked', 'Run compiler in checked mode.',
+    // TODO(sigmund): rename flag once we migrate all dart2js bots to the test
+    // matrix.
+    new _Option.bool('host_checked', 'Run compiler with assertions enabled.',
         hide: true),
     new _Option.bool('minified', 'Enable minification in the compiler.',
         hide: true),
@@ -174,8 +176,8 @@
         'Only run tests that are not marked `Slow` or `Timeout`.'),
     new _Option.bool('enable_asserts',
         'Pass the --enable-asserts flag to dart2js or to the vm.'),
-    new _Option.bool(
-        'no_preview_dart_2', 'Pass the --no-preview-dart-2 flag to analyzer',
+    new _Option.bool('no_preview_dart_2',
+        'Enable legacy Dart 1 behavior for some runtimes and compilers.',
         hide: true),
     new _Option.bool('use_cfe', 'Pass the --use-cfe flag to analyzer',
         hide: true),
@@ -246,8 +248,7 @@
     new _Option('output_directory',
         'The name of the output directory for storing log files.',
         defaultsTo: "logs", hide: true),
-    new _Option.bool('noBatch', 'Do not run tests in batch mode.',
-        hide: true),
+    new _Option.bool('noBatch', 'Do not run tests in batch mode.', hide: true),
     new _Option.bool('dart2js_batch', 'Run dart2js tests in batch mode.',
         hide: true),
     new _Option.bool(
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart
index 6e05015..dc945ca 100644
--- a/tools/testing/dart/test_configurations.dart
+++ b/tools/testing/dart/test_configurations.dart
@@ -137,7 +137,7 @@
     } else if (configuration.runtime.isSafari) {
       // Safari does not allow us to run from a fresh profile, so we can only
       // use one browser. Additionally, you can not start two simulators
-      // for mobile safari simultainiously.
+      // for mobile safari simultaneously.
       maxBrowserProcesses = 1;
     } else if (configuration.runtime == Runtime.chrome &&
         Platform.operatingSystem == 'macos') {
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index b3d4c90..a5e099d 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -105,7 +105,7 @@
 
   void _appendToFlakyFile(String msg) {
     var file = new File(TestUtils.flakyFileName);
-    var fd = file.openSync(mode: FileMode.APPEND);
+    var fd = file.openSync(mode: FileMode.append);
     fd.writeStringSync(msg);
     fd.closeSync();
   }
@@ -184,7 +184,7 @@
     // if the current location is not used.
     if (_sink == null) {
       _sink = new File(TestUtils.testOutcomeFileName)
-          .openWrite(mode: FileMode.APPEND);
+          .openWrite(mode: FileMode.append);
     }
     _sink.write("${jsonEncode(record)}\n");
   }
@@ -224,7 +224,7 @@
         RandomAccessFile unexpectedCrashesFile;
         try {
           unexpectedCrashesFile =
-              new File('unexpected-crashes').openSync(mode: FileMode.APPEND);
+              new File('unexpected-crashes').openSync(mode: FileMode.append);
           unexpectedCrashesFile.writeStringSync(
               "${test.displayName},${pid},${archivedBinaries[binName]}\n");
         } catch (e) {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index c76168e..fd9fe1e 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -332,7 +332,7 @@
   }
   if (lines.length > startLine) {
     for (var i = startLine; i < lines.length; ++i) {
-      var pid = int.parse(lines[i], onError: (source) => null);
+      var pid = int.tryParse(lines[i]);
       if (pid != null) pids.add(pid);
     }
   } else {
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 5f738fb..d17dec7 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -722,7 +722,7 @@
       String pattern = regex.pattern;
       if (pattern.contains("/")) {
         String lastPart = pattern.substring(pattern.lastIndexOf("/") + 1);
-        if (int.parse(lastPart, onError: (_) => -1) >= 0 ||
+        if (int.tryParse(lastPart) != null ||
             lastPart.toLowerCase() == "none") {
           pattern = pattern.substring(0, pattern.lastIndexOf("/"));
         }
@@ -1298,11 +1298,6 @@
           filePath.directoryPath.segments().last.contains('html_common')) {
         args.add("--use-dart2js-libraries");
       }
-      if (configuration.noPreviewDart2) {
-        args.add("--no-preview-dart-2");
-      } else {
-        args.add("--preview-dart-2");
-      }
     }
 
     if (configuration.compiler == Compiler.dart2js) {
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index dfd530f..2ad3fca 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -39,7 +39,7 @@
    */
   static void init(Path path, {bool append: false}) {
     if (path != null) {
-      var mode = append ? FileMode.APPEND : FileMode.WRITE;
+      var mode = append ? FileMode.append : FileMode.write;
       _sink = new File(path.toNativePath()).openWrite(mode: mode);
     }
   }
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index 8eab081..d9f1cd0 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -41,6 +41,7 @@
   inputs = [
     "../../sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart",
     "$target_gen_dir/dart2js_files.stamp",
+    "../../tools/make_version.py",
     "../../tools/VERSION",
   ]
 
diff --git a/utils/compiler/create_snapshot_entry.dart b/utils/compiler/create_snapshot_entry.dart
index 2c6497b..dca5fd5 100644
--- a/utils/compiler/create_snapshot_entry.dart
+++ b/utils/compiler/create_snapshot_entry.dart
@@ -11,9 +11,9 @@
 
 Future<String> getVersion(var rootPath) {
   var suffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
-  var printVersionScript = rootPath.resolve("tools/print_version.py");
+  var printVersionScript = rootPath.resolve("tools/make_version.py");
   return Process
-      .run("python$suffix", [printVersionScript.toFilePath()]).then((result) {
+      .run("python$suffix", [printVersionScript.toFilePath(), "--quiet"]).then((result) {
     if (result.exitCode != 0) {
       throw "Could not generate version";
     }