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