diff --git a/.packages b/.packages
index 5e2e043..e09d3e7 100644
--- a/.packages
+++ b/.packages
@@ -35,7 +35,6 @@
 dartdoc:third_party/pkg/dartdoc/lib
 dev_compiler:pkg/dev_compiler/lib
 expect:pkg/expect/lib
-fasta:pkg/fasta/lib
 fixnum:third_party/pkg/fixnum/lib
 front_end:pkg/front_end/lib
 func:third_party/pkg/func/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8c27cf3..723a2e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+## 2.0.0-dev.65.0
+
+### Tool Changes
+
+#### dartfmt
+
+  * Add `--fix` to remove unneeded `new` and `const` keywords, and change `:`
+    to `=` before named parameter default values.
+  * Change formatting rules around static methods to uniformly format code with
+    and without `new` and `const`.
+
+#### Pub
+
+  * Pub no longer supports running with `DART_VM_OPTIONS=--no-preview-dart2`.
+
 ## 2.0.0-dev.64.1
 
 ### Language
diff --git a/DEPS b/DEPS
index c1107d7..e7712ec 100644
--- a/DEPS
+++ b/DEPS
@@ -61,7 +61,7 @@
   "cli_util_tag" : "0.1.2+1",
   "collection_tag": "1.14.10",
   "convert_tag": "2.0.1",
-  "crypto_tag" : "2.0.2+1",
+  "crypto_tag" : "2.0.5",
   "csslib_tag" : "0.14.1",
   "dart2js_info_tag" : "0.5.6+4",
 
@@ -77,9 +77,9 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.0.14",  # Please see the note above before updating.
+  "dart_style_tag": "1.1.0",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.20.0",
+  "dartdoc_tag" : "v0.20.1",
   "fixnum_tag": "0.10.5",
   "func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "1.1.5",
@@ -102,7 +102,7 @@
   "mockito_tag": "d39ac507483b9891165e422ec98d9fb480037c8b",
   "mustache4dart_tag" : "v2.1.2",
   "oauth2_tag": "1.1.0",
-  "observatory_pub_packages_rev": "d3a3aebefbd35aa30fe7bbc2889b772b398f7d7f",
+  "observatory_pub_packages_rev": "caf0aecfb15077fc7a34d48e9df13606c793fddf",
   "package_config_tag": "1.0.3",
   "package_resolver_tag": "1.0.2+1",
   "path_tag": "1.5.1",
@@ -110,9 +110,9 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.4",
   "protobuf_tag": "0.7.1",
-  "pub_rev": "c84ffa0265fe746824aa6f382cb6c41abc406d42",
+  "pub_rev": "2258022cb7fd6ec43900d3b88012efb268020019",
   "pub_semver_tag": "1.4.1",
-  "quiver_tag": "5aaa3f58c48608af5b027444d561270b53f15dbf",
+  "quiver_tag": "0.29.0",
   "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
   "root_certificates_rev": "16ef64be64c7dfdff2b9f4b910726e635ccc519e",
   "shelf_static_rev": "v0.2.7",
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
index 77a0130..91f5e293 100644
--- a/build/dart/dart_action.gni
+++ b/build/dart/dart_action.gni
@@ -144,6 +144,11 @@
           "--packages=" + rebase_path(invoker.packages),
         ]
       }
+      if (defined(invoker.dfe)) {
+        args += [
+          "--dfe=" + rebase_path(invoker.dfe),
+        ]
+      }
       if (defined(invoker.script)) {
         args += [ rebase_path(invoker.script) ]
       }
@@ -219,9 +224,12 @@
     forward_variables_from(invoker, "*")
     if (_is_fuchsia) {
       binary = prebuilt_dart
+      dfe = "$prebuilt_dart_sdk/bin/snapshots/kernel-service.dart.snapshot"
     } else {
       binary =
           "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix"
+      dfe =
+          "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/snapshots/kernel-service.dart.snapshot"
     }
     target = "$_dart_root/runtime/bin:dart_bootstrap"
   }
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 9ab7861..bad2ba0 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -3989,10 +3989,12 @@
   .
 
 {\bf stringContentTDQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \texttt{"""}}' $|$ `\$');
+  `$\backslash$' \~{}( NEWLINE );
   stringInterpolation
   .
 
 {\bf stringContentTSQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \code{'}\code{'}\code{'}}' $|$ `\$');
+  `$\backslash$' \~{}( NEWLINE );
   stringInterpolation
   .
 
@@ -5697,12 +5699,15 @@
 \end{grammar}
 
 \LMHash{}
-Evaluation of a cascaded method invocation expression $e$ of the form \code{$e$..\metavar{suffix}} proceeds as follows:
+Evaluation of a cascaded method invocation expression $c$ of the form \code{$e$..\metavar{suffix}} proceeds as follows:
 
 Evaluate $e$ to an object $o$.
 Let $t$ be a fresh variable bound to $o$.
 Evaluate \code{$t$.\metavar{suffix}} to an object.
-Then $e$ evaluates to $o$.
+Then $c$ evaluates to $o$.
+
+\LMHash{}
+The static type of $c$ is the static type of $e$.
 
 \rationale{
 With the introduction of null-aware conditional assignable expressions (\ref{assignableExpressions}), it would make sense to extend cascades with a null-aware conditional form as well.
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index f7974b4..ad440e8 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -107,19 +107,11 @@
 
   @override
   @failingTest
-  test_detect_simple_error() {
-    return super.test_detect_simple_error();
-  }
-
-  @override
-  @failingTest
   test_super_mixins_disabled() {
-    // Disabling super mixins is not supported in the new FE.
     return super.test_super_mixins_disabled();
   }
 
   @override
-  @failingTest
   test_super_mixins_enabled() {
     return super.test_super_mixins_enabled();
   }
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index 981e904..a4912ac 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -40,10 +40,4 @@
 class GetErrorsTest_UseCFE extends GetErrorsTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_getErrors() {
-    return super.test_getErrors();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 7a10b8a..655fa65 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -145,16 +145,4 @@
     extends AnalysisGetImportedElementsIntegrationTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_getImportedElements_none() {
-    return super.test_getImportedElements_none();
-  }
-
-  @failingTest
-  @override
-  test_getImportedElements_some() {
-    return super.test_getImportedElements_some();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index 96995ae..667c92e 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -79,6 +79,6 @@
   @override
   @failingTest
   test_navigation_no_result() {
-    fail('This test crashes with CFE');
+    fail('Test fails with CFE');
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index ae9649d..d217042 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -87,22 +87,4 @@
 class LintIntegrationTest_UseCFE extends LintIntegrationTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_no_lints_when_not_specified() {
-    return super.test_no_lints_when_not_specified();
-  }
-
-  @override
-  @failingTest
-  test_simple_lint_newOptionsFile() {
-    return super.test_simple_lint_newOptionsFile();
-  }
-
-  @override
-  @failingTest
-  test_simple_lint_oldOptionsFile() {
-    return super.test_simple_lint_oldOptionsFile();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index eeda63a..5174ef4 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -71,10 +71,4 @@
 class OccurrencesTest_UseCFE extends OccurrencesTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_occurrences() {
-    return super.test_occurrences();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index 6192813..5a4a07f 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -75,10 +75,4 @@
 class OutlineTest_UseCFE extends OutlineTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_outline() {
-    return super.test_outline();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 2cfb696..eebfc59 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -127,9 +127,6 @@
   @override
   bool get useCFE => true;
 
-  @failingTest
   @override
-  test_overrides() {
-    return super.test_overrides();
-  }
+  test_overrides() => super.test_overrides();
 }
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 08c2d8d..5cca2f0 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -83,10 +83,4 @@
 class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_package_root() {
-    return super.test_package_root();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 0cb0424..ac80f32 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -59,6 +59,6 @@
   @failingTest
   @override
   test_reanalyze_concurrent() {
-    fail('This test crashes under the CFE');
+    fail('Test fails with CFE');
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 27a4c81..44e1830 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -48,6 +48,6 @@
   @failingTest
   @override
   test_reanalyze() {
-    fail('This test crashes under the CFE');
+    fail('Test fails with CFE');
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index dfbbe69..f9ebcb0 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -36,10 +36,4 @@
 class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_options() {
-    return super.test_options();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index bbd07a0..1a0920e 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -50,6 +50,6 @@
   @failingTest
   @override
   test_options() {
-    fail('This test crashes under the CFE');
+    fail('Test fails with CFE');
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 64aeb6d..439f5aa 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -38,6 +38,6 @@
   @failingTest
   @override
   test_options() {
-    fail('This test crashes under the CFE');
+    fail('Test fails with CFE');
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index c1fcead..02dcd05 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -36,10 +36,4 @@
 class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_subscriptions() {
-    return super.test_subscriptions();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index 42ef868..e1bf7d7 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -60,7 +60,7 @@
   @override
   @failingTest
   test_updateContent_list() {
-    // TODO(devoncarew): Class '_CompileTimeError' not found in library 'dart:core'.
+    // TODO(devoncarew): at character offset 2550: Bad state: Data already stored for offset -1.
     return super.test_updateContent_list();
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index 2c084a5..8174832 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -110,16 +110,4 @@
 class UpdateContentTest_UseCFE extends UpdateContentTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_updateContent() {
-    return super.test_updateContent();
-  }
-
-  @failingTest
-  @override
-  test_updateContent_multipleAdds() {
-    return super.test_updateContent_multipleAdds();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index b5087a9..75dad25 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -121,22 +121,4 @@
 class GetSuggestionsTest_UseCFE extends GetSuggestionsTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_getSuggestions() {
-    return super.test_getSuggestions();
-  }
-
-  @override
-  @failingTest
-  test_getSuggestions_onlyOverlay() {
-    return super.test_getSuggestions_onlyOverlay();
-  }
-
-  @override
-  @failingTest
-  test_getSuggestions_onlyOverlay_noWait() {
-    return super.test_getSuggestions_onlyOverlay_noWait();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 260ab07..0d359f6 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -41,10 +41,4 @@
 class GetAvailableRefactoringsTest_UseCFE extends GetAvailableRefactoringsTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_has_refactorings() {
-    return super.test_has_refactorings();
-  }
 }
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 6fd7413..c0e52b7 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -70,10 +70,4 @@
   @override
   @failingTest
   Future test_has_fixes() => super.test_has_fixes();
-
-  @failingTest
-  @override
-  test_no_fixes() {
-    fail('Test crashes with CFE');
-  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 7d7faba..8e34a3b 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -56,10 +56,4 @@
 class GetPostfixCompletionTest_UseCFE extends GetPostfixCompletionTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_postfix_completion() {
-    return super.test_postfix_completion();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index e565a1e..da142fc 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -144,22 +144,4 @@
     extends AnalysisGetImportElementsIntegrationTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_importElements_definingUnit() {
-    return super.test_importElements_definingUnit();
-  }
-
-  @failingTest
-  @override
-  test_importElements_noEdits() {
-    return super.test_importElements_noEdits();
-  }
-
-  @failingTest
-  @override
-  test_importElements_part() {
-    return super.test_importElements_part();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index 4dbf569..32f59cb 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -46,10 +46,4 @@
     extends IsPostfixCompletionApplicableTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_is_postfix_completion_applicable() {
-    return super.test_is_postfix_completion_applicable();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index a9009c7..3caf5f80 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -46,10 +46,4 @@
     extends ListPostfixCompletionTemplatesTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_list_postfix_completion_templates() {
-    fail('Test crashes with CFE');
-  }
 }
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index a30d913..4d519e9 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -80,22 +80,4 @@
 class OrganizeDirectivesTest_UseCFE extends OrganizeDirectivesTest {
   @override
   bool get useCFE => true;
-
-  @failingTest
-  @override
-  test_organize_directives() {
-    return super.test_organize_directives();
-  }
-
-  @failingTest
-  @override
-  test_organize_directives_no_changes() {
-    return super.test_organize_directives_no_changes();
-  }
-
-  @failingTest
-  @override
-  test_organize_directives_with_errors() {
-    return super.test_organize_directives_with_errors();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 07904fd..3cf0e19 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -47,10 +47,4 @@
 class DeleteContextTest_UseCFE extends DeleteContextTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_delete() {
-    fail('Test crashes with CFE');
-  }
 }
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index d0c886c..9990a23 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -44,10 +44,4 @@
 class MapUriTest_UseCFE extends MapUriTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_mapUri() {
-    fail('Test crashes with CFE');
-  }
 }
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index 234fd49..823ac4d 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -43,10 +43,4 @@
 class GetKytheEntriesTest_UseCFE extends GetKytheEntriesTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_getKytheEntries() {
-    return super.test_getKytheEntries();
-  }
 }
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 4f1cdd7..f5cf5a6 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -79,12 +79,5 @@
 
   @override
   @failingTest
-  test_badTarget() {
-    fail('Test times out with CFE.');
-  }
-
-  @override
-  @failingTest
-  // TODO(devoncarew): 'NoSuchMethodError: The getter 'source' was called on null'
-  Future test_findReferences() => new Future.error('failing test');
+  Future test_findReferences() => fail('Test fails with CFE');
 }
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index bdab78a..38f0c67 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -55,10 +55,4 @@
 class FindMemberDeclarationsTest_UseCFE extends FindMemberDeclarationsTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_findMemberDeclarations() {
-    fail('Test times out with CFE.');
-  }
 }
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index 231aa4f..dab8eaa 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -54,10 +54,4 @@
 class StatusTest_UseCFE extends StatusTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_status() {
-    fail('This test crashes CFE');
-  }
 }
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index a34bf60..ac71287 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -6,7 +6,7 @@
  * Defines the AST model. The AST (Abstract Syntax Tree) model describes the
  * syntactic (as opposed to semantic) structure of Dart code. The semantic
  * structure of the code is modeled by the
- * [element model](../element/element.dart).
+ * [element model](../dart_element_element/dart_element_element-library.html).
  *
  * An AST consists of nodes (instances of a subclass of [AstNode]). The nodes
  * are organized in a tree structure in which the children of a node are the
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 8af9b7d..60afc67 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -5,11 +5,13 @@
 /**
  * Defines the element model. The element model describes the semantic (as
  * opposed to syntactic) structure of Dart code. The syntactic structure of the
- * code is modeled by the [AST structure](../ast/ast.dart).
+ * code is modeled by the [AST
+ * structure](../analyzer.dart.ast.ast/analyzer.dart.ast.ast-library.html).
  *
  * The element model consists of two closely related kinds of objects: elements
  * (instances of a subclass of [Element]) and types. This library defines the
- * elements, the types are defined in [type.dart](type.dart).
+ * elements, the types are defined in
+ * [type.dart](../dart_element_type/dart_element_type-library.html).
  *
  * Generally speaking, an element represents something that is declared in the
  * code, such as a class, method, or variable. Elements are organized in a tree
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 64c8606..7467480 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -4,9 +4,10 @@
 
 /**
  * Defines the type model. The type model is part of the
- * [element model](element.dart) in that most types are defined by Dart code
- * (the types `dynamic` and `void` being the notable exceptions). All types are
- * represented by an instance of a subclass of [DartType].
+ * [element model](../dart_element_element/dart_element_element-library.html)
+ * in that most types are defined by Dart code (the types `dynamic` and `void`
+ * being the notable exceptions). All types are represented by an instance of a
+ * subclass of [DartType].
  *
  * Other than `dynamic` and `void`, all of the types define either the interface
  * defined by a class (an instance of [InterfaceType]) or the type of a function
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index a47d7a0..1557389 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -129,6 +129,8 @@
   CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
   CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
   CompileTimeErrorCode.GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED,
+  CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
+  CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
   CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME,
   CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index a1845c1..03f505c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -61,13 +61,13 @@
 /// The wrapper around FrontEnd compiler that can be used incrementally.
 ///
 /// When the client needs the kernel, resolution information, and errors for
-/// a library, it should call [compile].  The compiler will compile the library
+/// a library, it should call [getResolution].  The compiler will compile the library
 /// and the transitive closure of its dependencies.  The results are cached,
 /// so the next invocation for a dependency will be served from the cache.
 ///
 /// If a file is changed, [invalidate] should be invoked.  This will invalidate
 /// the file, its library, and the transitive closure of dependencies.  So, the
-/// next invocation of [compile] will recompile libraries required for the
+/// next invocation of [getResolution] will recompile libraries required for the
 /// requested library.
 class FrontEndCompiler {
   static const MSG_PENDING_COMPILE =
@@ -88,10 +88,6 @@
   /// The listener / recorder for compilation errors produced by the compiler.
   final _ErrorListener _errorListener;
 
-  /// Each key is the absolute URI of a library.
-  /// Each value is the compilation result of the key library.
-  final Map<Uri, LibraryCompilationResult> _results = {};
-
   /// The [Component] with currently valid libraries. When a file is invalidated,
   /// we remove the file, its library, and everything affected from [_component].
   Component _component = new Component();
@@ -108,7 +104,7 @@
   /// Each value is the file system URI of the library that sources the part.
   final Map<Uri, Uri> _partToLibrary = {};
 
-  /// Whether [compile] is executing.
+  /// Whether [getResolution] is executing.
   bool _isCompileExecuting = false;
 
   factory FrontEndCompiler(
@@ -179,38 +175,124 @@
       : _logger = _options.logger,
         _fileSystem = _options.fileSystem;
 
-  /// Compile the library with the given absolute [uri], and everything it
-  /// depends on. Return the result of the requested library compilation.
+  /// Return the outline of the library with the given absolute [uri], and
+  /// everything it depends on.
   ///
-  /// If there is the cached result for the library (compiled directly, or as
-  /// a result of compilation of another library), it will be returned quickly.
+  /// If there is the cached outline for the library (computed directly, or as
+  /// a result of computing the outline of another library), it will be
+  /// returned quickly.
   ///
   /// Throw [StateError] if another compilation is pending.
-  Future<LibraryCompilationResult> compile(Uri uri) {
+  Future<LibraryOutlineResult> getOutline(Uri uri) {
     if (_isCompileExecuting) {
       throw new StateError(MSG_PENDING_COMPILE);
     }
     _isCompileExecuting = true;
 
-    {
-      LibraryCompilationResult result = _results[uri];
-      if (result != null) {
-        _isCompileExecuting = false;
-        return new Future.value(result);
-      }
+    // TODO(scheglov) Do we need a map?
+    if (_component.root.hasChild('$uri')) {
+      _isCompileExecuting = false;
+      // TODO(scheglov) Can we keep the same instance?
+      var types = new TypeEnvironment(
+          new CoreTypes(_component), new ClassHierarchy(_component));
+      var result = new LibraryOutlineResult(_component, types);
+      return new Future.value(result);
     }
 
-    return _runWithFrontEndContext('Compile', () async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
+    return _runWithFrontEndContext('Compute outline', () async {
       try {
         var dillTarget =
             new DillTarget(_options.ticker, uriTranslator, _options.target);
 
         // Append all libraries what we still have in the current component.
         await _logger.runAsync('Load dill libraries', () async {
-          // TODO(brianwilkerson) Determine whether this await is necessary.
-          await null;
+          dillTarget.loader.appendLibraries(_component);
+          await dillTarget.buildOutlines();
+        });
+
+        // Create the target for computing the outline of the library.
+        var kernelTarget = new KernelTarget(
+            _fileSystem, true, dillTarget, uriTranslator,
+            metadataCollector: new AnalyzerMetadataCollector());
+        kernelTarget.read(uri);
+
+        // Compute new outlines.
+        var newComponent = await _logger.runAsync('Compile', () async {
+          return await kernelTarget.buildOutlines(nameRoot: _component.root);
+        });
+
+        // Add new libraries to the current component.
+        if (newComponent != null) {
+          // When a file is used in a `part` directive of a library, but does
+          // not have a `part of` itself, we get this file both as a part,
+          // and as a library. This causes an exception later in resolution.
+          var partFileUris = new Set<Uri>();
+          for (var library in newComponent.libraries) {
+            var libraryFileUri = library.fileUri;
+            for (var part in library.parts) {
+              var partFileUri = libraryFileUri.resolve(part.partUri);
+              if (partFileUri != libraryFileUri) {
+                partFileUris.add(partFileUri);
+              }
+            }
+          }
+          // Do add new libraries.
+          for (var library in newComponent.libraries) {
+            if (!partFileUris.contains(library.fileUri)) {
+              Uri uri = library.importUri;
+              if (!_component.root.hasChild('$uri')) {
+                _component.root.getChildFromUri(uri).bindTo(library.reference);
+                library.computeCanonicalNames();
+                _component.libraries.add(library);
+              }
+            }
+          }
+        }
+
+        _logger.run('Compute dependencies', _computeDependencies);
+
+        // TODO(scheglov) Can we keep the same instance?
+        var types = new TypeEnvironment(
+            new CoreTypes(_component), new ClassHierarchy(_component));
+        return new LibraryOutlineResult(_component, types);
+      } finally {
+        _isCompileExecuting = false;
+      }
+    });
+  }
+
+  /// Compute resolution for the library with the given absolute [uri] and
+  /// all its parts.
+  ///
+  /// Throw [StateError] if another compilation is pending.
+  Future<LibraryCompilationResult> getResolution(Uri uri) {
+    if (_isCompileExecuting) {
+      throw new StateError(MSG_PENDING_COMPILE);
+    }
+    _isCompileExecuting = true;
+
+    return _runWithFrontEndContext('Compile', () async {
+      try {
+        // Remove the requested library outline from the component.
+        Library libraryOutline;
+        for (var library in _component.libraries) {
+          if (library.importUri == uri) {
+            libraryOutline = library;
+            _component.libraries.remove(library);
+            _component.root.removeChild('$uri');
+            break;
+          }
+        }
+        if (libraryOutline == null) {
+          throw new StateError('Expected to find $uri in the component.');
+        }
+        libraryOutline.canonicalName.getChild('IntWrapper');
+
+        var dillTarget =
+            new DillTarget(_options.ticker, uriTranslator, _options.target);
+
+        // Append all libraries what we still have in the current component.
+        await _logger.runAsync('Load dill libraries', () async {
           dillTarget.loader.appendLibraries(_component);
           await dillTarget.buildOutlines();
         });
@@ -220,54 +302,54 @@
             uriTranslator, new AnalyzerMetadataCollector());
         kernelTarget.read(uri);
 
-        // Compile the entry point into the new component.
-        _component = await _logger.runAsync('Compile', () async {
-          // TODO(brianwilkerson) Determine whether this await is necessary.
-          await null;
+        // Resolve the requested library.
+        Component newComponent = await _logger.runAsync('Compile', () async {
           await kernelTarget.buildOutlines(nameRoot: _component.root);
-          return await kernelTarget.buildComponent() ?? _component;
+          return await kernelTarget.buildComponent();
         });
 
-        // TODO(scheglov) Only for new libraries?
-        _component.computeCanonicalNames();
+        // Put the library outline back into the current component.
+        _component.root.adoptChild(libraryOutline.canonicalName);
+        _component.libraries.add(libraryOutline);
 
-        _logger.run('Compute dependencies', _computeDependencies);
+        // Compute canonical names for the resolved library.
+        for (var library in newComponent.libraries) {
+          if (library.importUri == uri) {
+            library.reference.canonicalName = _component.root.getChild('$uri');
+            library.computeCanonicalNames();
+            break;
+          }
+        }
 
         // TODO(scheglov) Can we keep the same instance?
         var types = new TypeEnvironment(
             new CoreTypes(_component), new ClassHierarchy(_component));
 
-        // Add results for new libraries.
-        for (var library in _component.libraries) {
-          if (!_results.containsKey(library.importUri)) {
-            Map<Uri, List<CollectedResolution>> libraryResolutions =
-                kernelTarget.resolutions[library.fileUri];
+        Uri libraryFileUri = libraryOutline.fileUri;
+        var libraryResolutions = kernelTarget.resolutions[libraryFileUri];
+        if (libraryResolutions == null) {
+          throw new StateError('Expected to find $uri in resolutions.');
+        }
+        // TODO(scheglov) Check that we have exactly one resolution?
+        var files = <Uri, FileCompilationResult>{};
 
-            var files = <Uri, FileCompilationResult>{};
-
-            void addFileResult(Uri fileUri) {
-              if (libraryResolutions != null) {
-                files[fileUri] = new FileCompilationResult(
-                    fileUri,
-                    libraryResolutions[fileUri] ?? [],
-                    _errorListener.fileUriToErrors[fileUri] ?? []);
-              }
-            }
-
-            addFileResult(library.fileUri);
-            for (var part in library.parts) {
-              addFileResult(library.fileUri.resolve(part.partUri));
-            }
-
-            var libraryResult = new LibraryCompilationResult(
-                _component, types, library.importUri, library, files);
-            _results[library.importUri] = libraryResult;
+        void addFileResult(Uri fileUri) {
+          if (libraryResolutions != null) {
+            files[fileUri] = new FileCompilationResult(
+                fileUri,
+                libraryResolutions[fileUri] ?? [],
+                _errorListener.fileUriToErrors[fileUri] ?? []);
           }
         }
+
+        addFileResult(libraryFileUri);
+        for (var part in libraryOutline.parts) {
+          addFileResult(libraryFileUri.resolve(part.partUri));
+        }
         _errorListener.fileUriToErrors.clear();
 
-        // The result must have been computed.
-        return _results[uri];
+        return new LibraryCompilationResult(
+            _component, types, libraryOutline.importUri, libraryOutline, files);
       } finally {
         _isCompileExecuting = false;
       }
@@ -276,7 +358,7 @@
 
   /// Invalidate the file with the given file [uri], its library and the
   /// transitive the of libraries that use it.  The next time when any of these
-  /// libraries is be requested in [compile], it will be recompiled again.
+  /// libraries is be requested in [getResolution], it will be recompiled again.
   void invalidate(Uri uri) {
     void invalidateLibrary(Uri libraryUri) {
       Library library = _uriToLibrary.remove(libraryUri);
@@ -286,7 +368,6 @@
       _component.libraries.remove(library);
       _component.root.removeChild('${library.importUri}');
       _component.uriToSource.remove(libraryUri);
-      _results.remove(library.importUri);
 
       // Recursively invalidate dependencies.
       Set<Uri> directDependencies =
@@ -363,6 +444,20 @@
       this.component, this.types, this.uri, this.kernel, this.files);
 }
 
+/// The outline result for a single library.
+class LibraryOutlineResult {
+  /// The full current [Component]. It has all libraries that are required by
+  /// this library, but might also have other libraries, that are not required.
+  ///
+  /// The object is mutable, and is changed when files are invalidated.
+  final Component component;
+
+  /// The [TypeEnvironment] for the [component].
+  final TypeEnvironment types;
+
+  LibraryOutlineResult(this.component, this.types);
+}
+
 /// The [DietListener] that record resolution information.
 class _AnalyzerDietListener extends DietListener {
   final Map<Uri, List<CollectedResolution>> _resolutions;
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
index 868599ed..4a9b2c5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
@@ -84,15 +84,14 @@
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
       Uri targetUri = targetLibrary.uri;
-      LibraryCompilationResult compilationResult =
-          await compiler.compile(targetUri);
+      LibraryOutlineResult outlineResult = await compiler.getOutline(targetUri);
 
       // Remember Kernel libraries produced by the compiler.
       // There might be more libraries than we actually need.
       // This is probably OK, because we consume them lazily.
       var libraryMap = <String, kernel.Library>{};
       var libraryExistMap = <String, bool>{};
-      for (var library in compilationResult.component.libraries) {
+      for (var library in outlineResult.component.libraries) {
         String uriStr = library.importUri.toString();
         libraryMap[uriStr] = library;
         FileState file = fsState.getFileForUri(library.importUri);
@@ -116,8 +115,8 @@
       analysisContext.contentCache = new _ContentCacheWrapper(fsState);
 
       // Create the resynthesizer bound to the analysis context.
-      var resynthesizer = new KernelResynthesizer(analysisContext,
-          compilationResult.types, libraryMap, libraryExistMap);
+      var resynthesizer = new KernelResynthesizer(
+          analysisContext, outlineResult.types, libraryMap, libraryExistMap);
 
       return new KernelContext._(analysisContext, resynthesizer);
     });
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index c58b12b..709f366 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -182,11 +182,7 @@
   }
 
   Future<Map<FileState, UnitAnalysisResult>> _analyze2() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     return await _logger.runAsync('Analyze', () async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
       Map<FileState, CompilationUnit> units = {};
 
       // Parse all files.
@@ -209,7 +205,7 @@
         _resolveDirectives(units);
 
         var libraryResult = await _logger.runAsync('Compile library', () {
-          return _frontEndCompiler.compile(_library.uri);
+          return _frontEndCompiler.getResolution(_library.uri);
         });
 
         _logger.run('Apply resolution', () {
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index e017334..b5417e9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -387,7 +387,7 @@
         if (index != null) {
           for (AnalysisDriverSubtype subtype in index.subtypes) {
             if (subtype.supertypes.contains(id)) {
-              FileState library = file.isPart ? file.library : file;
+              FileState library = file.library ?? file;
               results.add(new SubtypeResult(
                   library.uriStr,
                   library.uriStr + ';' + file.uriStr + ';' + subtype.name,
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 457bb8e..f643697 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6747,13 +6747,12 @@
     if (int.parse(lexeme.substring(index, index + 1)) < 9) {
       return true;
     }
-    int bound;
+    int bound = 223372036854775808;
     if (isNegative) {
-      bound = 223372036854775808;
+      return int.parse(lexeme.substring(index + 1)) <= bound;
     } else {
-      bound = 223372036854775807;
+      return int.parse(lexeme.substring(index + 1)) < bound;
     }
-    return int.parse(lexeme.substring(index + 1)) <= bound;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 4be6d72..5d1bada 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -2400,6 +2400,28 @@
           correction: "Try using a type that is or is a subclass of '{1}'.");
 
   /**
+   * It is a compile-time error if a generic function type is used as a bound
+   * for a formal type parameter of a class or a function.
+   */
+  static const CompileTimeErrorCode GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND =
+      const CompileTimeErrorCode('GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND',
+          'Generic function types may not be used as type parameter bounds',
+          correction: 'Try making the free variable in the function type part'
+              ' of the larger declaration signature');
+
+  /**
+   * It is a compile-time error if a generic function type is used as an actual
+   * type argument.
+   */
+  static const CompileTimeErrorCode GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT =
+      const CompileTimeErrorCode(
+          'GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT',
+          "Generic function has type parameters '<{0}>', so it may not be used"
+          ' as a type argument',
+          correction: "Try removing the type parameters '<{0}>', or using"
+              " 'dynamic' as the type argument here instead of a function.");
+
+  /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via
    * another typedef, is a compile time error.
    */
diff --git a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
deleted file mode 100644
index c007f79..0000000
--- a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
+++ /dev/null
@@ -1,580 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/ast_factory.dart';
-import 'package:analyzer/src/fasta/ast_building_factory.dart';
-import 'package:front_end/src/fasta/kernel/expression_generator.dart' as fasta;
-import 'package:front_end/src/fasta/kernel/expression_generator_helper.dart';
-import 'package:front_end/src/fasta/kernel/forest.dart' as fasta;
-import 'package:front_end/src/scanner/token.dart';
-import 'package:kernel/ast.dart' as kernel
-    show DartType, Initializer, Member, Name, Procedure;
-
-class AnalyzerDeferredAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.DeferredAccessGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final fasta.PrefixBuilder builder;
-  final fasta.Generator<Expression, Statement, Arguments> generator;
-
-  AnalyzerDeferredAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.builder,
-      this.generator)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() => generator.buildSimpleRead();
-}
-
-class AnalyzerDelayedAssignmentGenerator extends AnalyzerExpressionGenerator
-    with fasta.DelayedAssignment<Expression, Statement, Arguments> {
-  final Token token;
-  final fasta.Generator<Expression, Statement, Arguments> generator;
-  final String assignmentOperator;
-  final Expression value;
-
-  AnalyzerDelayedAssignmentGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.generator,
-      this.assignmentOperator,
-      this.value)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() => astFactory.assignmentExpression(
-      generator.buildSimpleRead(), token, value);
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
-}
-
-class AnalyzerDelayedPostfixIncrementGenerator
-    extends AnalyzerExpressionGenerator
-    with fasta.DelayedPostfixIncrement<Expression, Statement, Arguments> {
-  final Token token;
-  final fasta.Generator<Expression, Statement, Arguments> generator;
-  final kernel.Name binaryOperator;
-  final kernel.Procedure interfaceTarget;
-
-  AnalyzerDelayedPostfixIncrementGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.generator,
-      this.binaryOperator,
-      this.interfaceTarget)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() =>
-      astFactory.postfixExpression(generator.buildSimpleRead(), token);
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
-}
-
-abstract class AnalyzerExpressionGenerator
-    implements fasta.Generator<Expression, Statement, Arguments> {
-  final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
-
-  final AstFactory astFactory;
-
-  AnalyzerExpressionGenerator(this.helper, this.astFactory);
-
-  fasta.Forest<Expression, Statement, Token, Arguments> get forest =>
-      helper.forest;
-
-  @override
-// TODO: implement isInitializer
-  bool get isInitializer => throw new UnimplementedError();
-
-  @override
-// TODO: implement isThisPropertyAccess
-  bool get isThisPropertyAccess => throw new UnimplementedError();
-
-  @override
-// TODO: implement plainNameForRead
-  String get plainNameForRead => throw new UnimplementedError();
-
-  @override
-// TODO: implement plainNameForWrite
-  String get plainNameForWrite => throw new UnimplementedError();
-
-  @override
-// TODO: implement uri
-  Uri get uri => throw new UnimplementedError();
-
-  @override
-  Expression buildAssignment(Expression value, {bool voidContext}) {
-    // TODO(brianwilkerson) Figure out how to get the token for the operator.
-    return astFactory.assignmentExpression(buildSimpleRead(), null, value);
-  }
-
-  @override
-  Expression buildCompoundAssignment(
-      kernel.Name binaryOperator, Expression value,
-      {int offset,
-      bool voidContext,
-      kernel.Procedure interfaceTarget,
-      bool isPreIncDec}) {
-    // TODO(brianwilkerson) Figure out how to get the token for the operator.
-    return astFactory.assignmentExpression(buildSimpleRead(), null, value);
-  }
-
-  @override
-  kernel.Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    // TODO: implement buildFieldInitializer
-    throw new UnimplementedError();
-  }
-
-  /// For most accessors, the AST structure will be the same whether the result
-  /// is being used for access or modification.
-  Expression buildForEffect() => buildSimpleRead();
-
-  @override
-  Expression buildNullAwareAssignment(
-      Expression value, kernel.DartType type, int offset,
-      {bool voidContext}) {
-    // TODO(brianwilkerson) Figure out how to get the token for the operator.
-    // TODO(brianwilkerson) Capture the type information?
-    return astFactory.assignmentExpression(buildSimpleRead(), null, value);
-  }
-
-  @override
-  Expression buildPostfixIncrement(kernel.Name binaryOperator,
-      {int offset, bool voidContext, kernel.Procedure interfaceTarget}) {
-    // TODO(brianwilkerson) Figure out how to get the token for the operator.
-    return astFactory.postfixExpression(buildSimpleRead(), null);
-  }
-
-  @override
-  Expression buildPrefixIncrement(kernel.Name binaryOperator,
-      {int offset, bool voidContext, kernel.Procedure interfaceTarget}) {
-    // TODO(brianwilkerson) Figure out how to get the token for the operator.
-    return astFactory.prefixExpression(null, buildSimpleRead());
-  }
-
-  @override
-  buildPropertyAccess(fasta.IncompleteSendGenerator send, int operatorOffset,
-      bool isNullAware) {
-    // TODO: implement buildPropertyAccess
-//    return astFactory.propertyAccess(buildSimpleRead(), null, null);
-    throw new UnimplementedError();
-  }
-
-  @override
-  buildThrowNoSuchMethodError(Expression receiver, Arguments arguments,
-      {bool isSuper,
-      bool isGetter,
-      bool isSetter,
-      bool isStatic,
-      String name,
-      int offset,
-      /*LocatedMessage*/ argMessage}) {
-    // TODO: implement buildThrowNoSuchMethodError
-    throw new UnimplementedError();
-  }
-
-  @override
-  kernel.DartType buildTypeWithBuiltArguments(List<kernel.DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    // TODO: implement buildTypeWithBuiltArguments
-    throw new UnimplementedError();
-  }
-
-  @override
-  doInvocation(int offset, Arguments arguments) {
-    // TODO: implement doInvocation
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression makeInvalidRead() {
-    // TODO: implement makeInvalidRead
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression makeInvalidWrite(Expression value) {
-    // TODO: implement makeInvalidWrite
-    throw new UnimplementedError();
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    // TODO: implement printOn
-    throw new UnimplementedError();
-  }
-
-  @override
-  T storeOffset<T>(T node, int offset) {
-    // TODO: implement storeOffset
-    throw new UnimplementedError();
-  }
-}
-
-class AnalyzerIndexedAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.IndexedAccessGenerator<Expression, Statement, Arguments> {
-  /// The expression computing the object on which the index operation will be
-  /// invoked.
-  final Expression target;
-
-  /// The left bracket.
-  final Token leftBracket;
-
-  /// The expression computing the argument for the index operation.
-  final Expression index;
-
-  /// The right bracket.
-  final Token rightBracket;
-
-  /// Initialize a newly created generator to have the given helper.
-  AnalyzerIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.target,
-      this.leftBracket,
-      this.index,
-      this.rightBracket)
-      : super(helper, astFactory);
-
-  @override
-  Token get token => leftBracket;
-
-  @override
-  Expression buildSimpleRead() => astFactory.indexExpressionForTarget(
-      target, leftBracket, index, rightBracket);
-}
-
-class AnalyzerLargeIntAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.LargeIntAccessGenerator<Expression, Statement, Arguments> {
-  final Token token;
-
-  AnalyzerLargeIntAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() => astFactory.integerLiteral(token, null);
-}
-
-class AnalyzerLoadLibraryGenerator extends AnalyzerExpressionGenerator
-    with fasta.LoadLibraryGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final fasta.LoadLibraryBuilder builder;
-
-  AnalyzerLoadLibraryGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.builder)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() {
-    // TODO: implement buildSimpleRead
-    throw new UnimplementedError();
-  }
-}
-
-class AnalyzerNullAwarePropertyAccessGenerator
-    extends AnalyzerExpressionGenerator
-    with
-        fasta.NullAwarePropertyAccessGenerator<Expression, Statement,
-            Arguments> {
-  final Expression target;
-  final Token operator;
-  final SimpleIdentifier propertyName;
-
-  AnalyzerNullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.target,
-      this.operator,
-      this.propertyName)
-      : super(helper, astFactory);
-
-  @override
-  Token get token => operator;
-
-  @override
-  Expression buildSimpleRead() =>
-      astFactory.propertyAccess(target, operator, propertyName);
-}
-
-class AnalyzerPropertyAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.PropertyAccessGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final Expression receiver;
-  final kernel.Name name;
-  final kernel.Member getter;
-  final kernel.Member setter;
-
-  AnalyzerPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.receiver,
-      this.name,
-      this.getter,
-      this.setter)
-      : super(helper, astFactory);
-
-  @override
-  // TODO(brianwilkerson) Figure out how to get the property name token (or node).
-  Expression buildSimpleRead() =>
-      astFactory.propertyAccess(receiver, token, null);
-}
-
-class AnalyzerReadOnlyAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.ReadOnlyAccessGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final Expression expression;
-  final String plainNameForRead;
-
-  AnalyzerReadOnlyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.expression,
-      this.plainNameForRead)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() {
-    // TODO: implement buildSimpleRead
-    throw new UnimplementedError();
-  }
-}
-
-class AnalyzerStaticAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.StaticAccessGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final kernel.Member getter;
-  final kernel.Member setter;
-
-  AnalyzerStaticAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.getter,
-      this.setter)
-      : super(helper, astFactory);
-
-  @override
-  kernel.Member get readTarget {
-    // TODO: implement readTarget
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression buildSimpleRead() {
-    // TODO: implement buildSimpleRead
-    throw new UnimplementedError();
-  }
-}
-
-class AnalyzerSuperIndexedAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.SuperIndexedAccessGenerator<Expression, Statement, Arguments> {
-  /// The expression computing the object on which the index operation will be
-  /// invoked.
-  final Expression target;
-
-  /// The left bracket.
-  final Token leftBracket;
-
-  /// The expression computing the argument for the index operation.
-  final Expression index;
-
-  /// The right bracket.
-  final Token rightBracket;
-
-  /// Initialize a newly created generator to have the given helper.
-  AnalyzerSuperIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.target,
-      this.leftBracket,
-      this.index,
-      this.rightBracket)
-      : super(helper, astFactory);
-
-  @override
-  Token get token => leftBracket;
-
-  @override
-  Expression buildSimpleRead() => astFactory.indexExpressionForTarget(
-      target, leftBracket, index, rightBracket);
-}
-
-class AnalyzerSuperPropertyAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.SuperPropertyAccessGenerator<Expression, Statement, Arguments> {
-  /// The `super` keyword.
-  Token superKeyword;
-
-  /// The `.` or `?.` operator.
-  Token operator;
-
-  /// The name of the property being accessed,
-  SimpleIdentifier propertyName;
-
-  AnalyzerSuperPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.superKeyword,
-      this.operator,
-      this.propertyName)
-      : super(helper, astFactory);
-
-  @override
-  Token get token => operator;
-
-  @override
-  Expression buildSimpleRead() => astFactory.propertyAccess(
-      astFactory.superExpression(superKeyword), operator, propertyName);
-}
-
-class AnalyzerThisIndexedAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.ThisIndexedAccessGenerator<Expression, Statement, Arguments> {
-  /// The expression computing the object on which the index operation will be
-  /// invoked.
-  final Expression target;
-
-  /// The left bracket.
-  final Token leftBracket;
-
-  /// The expression computing the argument for the index operation.
-  final Expression index;
-
-  /// The right bracket.
-  final Token rightBracket;
-
-  /// Initialize a newly created generator to have the given helper.
-  AnalyzerThisIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.target,
-      this.leftBracket,
-      this.index,
-      this.rightBracket)
-      : super(helper, astFactory);
-
-  @override
-  Token get token => leftBracket;
-
-  @override
-  Expression buildSimpleRead() => astFactory.indexExpressionForTarget(
-      target, leftBracket, index, rightBracket);
-}
-
-class AnalyzerThisPropertyAccessGenerator extends AnalyzerExpressionGenerator
-    with fasta.ThisPropertyAccessGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final kernel.Name name;
-  final kernel.Member getter;
-  final kernel.Member setter;
-
-  AnalyzerThisPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.name,
-      this.getter,
-      this.setter)
-      : super(helper, astFactory);
-
-  @override
-  // TODO(brianwilkerson) Figure out how to get the token (or node) for `this`.
-  // TODO(brianwilkerson) Figure out how to get the property name token (or node).
-  Expression buildSimpleRead() => astFactory.propertyAccess(null, token, null);
-}
-
-class AnalyzerTypeUseGenerator extends AnalyzerExpressionGenerator
-    with fasta.TypeUseGenerator<Expression, Statement, Arguments> {
-  final Token token;
-  final fasta.PrefixBuilder prefix;
-  final int declarationReferenceOffset;
-  final fasta.TypeDeclarationBuilder declaration;
-  final String plainNameForRead;
-
-  AnalyzerTypeUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.token,
-      this.prefix,
-      this.declarationReferenceOffset,
-      this.declaration,
-      this.plainNameForRead)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() {
-    // TODO: implement buildSimpleRead
-    throw new UnimplementedError();
-  }
-}
-
-class AnalyzerUnlinkedNameGenerator extends AnalyzerExpressionGenerator
-    with fasta.UnlinkedGenerator<Expression, Statement, Arguments> {
-  @override
-  final Token token;
-
-  @override
-  final fasta.UnlinkedDeclaration declaration;
-
-  AnalyzerUnlinkedNameGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      AstFactory astFactory,
-      this.token,
-      this.declaration)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() => astFactory.simpleIdentifier(token);
-}
-
-class AnalyzerUnresolvedNameGenerator extends AnalyzerExpressionGenerator
-    with
-        fasta.ErroneousExpressionGenerator<Expression, Statement, Arguments>,
-        fasta.UnresolvedNameGenerator<Expression, Statement, Arguments> {
-  @override
-  final Token token;
-
-  @override
-  final kernel.Name name;
-
-  AnalyzerUnresolvedNameGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      AstFactory astFactory,
-      this.token,
-      this.name)
-      : super(helper, astFactory);
-
-  @override
-  Expression buildSimpleRead() => astFactory.simpleIdentifier(token);
-}
-
-class AnalyzerVariableUseGenerator extends AnalyzerExpressionGenerator
-    with fasta.VariableUseGenerator<Expression, Statement, Arguments> {
-  final Token nameToken;
-
-  AnalyzerVariableUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      AstFactory astFactory,
-      this.nameToken)
-      : super(helper, astFactory);
-
-  @override
-  Token get token => nameToken;
-
-  @override
-  Expression buildSimpleRead() => astFactory.simpleIdentifier(nameToken);
-}
diff --git a/pkg/analyzer/lib/src/fasta/ast_body_builder.dart b/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
deleted file mode 100644
index f79a164..0000000
--- a/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart' show Expression, Statement;
-import 'package:analyzer/src/fasta/ast_building_factory.dart'
-    show Arguments, AstBuildingForest;
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
-import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
-    show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;
-import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'
-    show TypeInferrer;
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-export 'package:front_end/src/fasta/kernel/unlinked_scope.dart'
-    show UnlinkedScope;
-
-class AstBodyBuilder extends BodyBuilder<Expression, Statement, Arguments> {
-  @override
-  final AstBuildingForest forest;
-
-  AstBodyBuilder(
-      KernelLibraryBuilder library,
-      ModifierBuilder member,
-      Scope scope,
-      Scope formalParameterScope,
-      ClassHierarchy hierarchy,
-      CoreTypes coreTypes,
-      KernelClassBuilder classBuilder,
-      bool isInstanceMember,
-      Uri uri,
-      TypeInferrer typeInferrer,
-      TypeProvider typeProvider)
-      : forest = new AstBuildingForest(typeProvider),
-        super(library, member, scope, formalParameterScope, hierarchy,
-            coreTypes, classBuilder, isInstanceMember, uri, typeInferrer);
-
-  @override
-  void enterThenForTypePromotion(Expression condition) {
-    // Do nothing.
-  }
-
-  @override
-  void logEvent(String name) {
-    throw "Parser event '$name' not implemented";
-  }
-}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 54f5982..097764a 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -2166,35 +2166,44 @@
   }
 
   @override
-  void beginTypeVariable(Token name) {
+  void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
+    SimpleIdentifier name = pop();
+    List<Annotation> metadata = pop();
+
+    Comment comment = _findComment(metadata, name.beginToken);
+    push(ast.typeParameter(comment, metadata, name, null, null));
   }
 
   @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
-    // TODO(paulberry): set up scopes properly to resolve parameters and type
-    // variables.  Note that this is tricky due to the handling of initializers
-    // in constructors, so the logic should be shared with BodyBuilder as much
-    // as possible.
+  void handleTypeVariablesDefined(Token token, int count) {
+    debugEvent("handleTypeVariablesDefined");
+    assert(count > 0);
+    push(popTypedList(count, new List<TypeParameter>(count)));
+  }
+
+  @override
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    debugEvent("TypeVariable");
     assert(extendsOrSuper == null ||
         optional('extends', extendsOrSuper) ||
         optional('super', extendsOrSuper));
-    debugEvent("TypeVariable");
-
     TypeAnnotation bound = pop();
-    SimpleIdentifier name = pop();
-    List<Annotation> metadata = pop();
-    Comment comment = _findComment(metadata, name.beginToken);
-    push(ast.typeParameter(comment, metadata, name, extendsOrSuper, bound));
+
+    // Peek to leave type parameters on top of stack.
+    List<TypeParameter> typeParameters = peek();
+    typeParameters[index]
+      ..extendsKeyword = extendsOrSuper
+      ..bound = bound;
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
+  void endTypeVariables(Token beginToken, Token endToken) {
     assert(optional('<', beginToken));
     assert(optional('>', endToken));
     debugEvent("TypeVariables");
 
-    List<TypeParameter> typeParameters = popTypedList(count);
+    List<TypeParameter> typeParameters = pop();
     push(ast.typeParameterList(beginToken, typeParameters, endToken));
   }
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
deleted file mode 100644
index 436b733..0000000
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ /dev/null
@@ -1,690 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart' hide Identifier;
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/ast/ast_factory.dart';
-import 'package:analyzer/src/fasta/analyzer_expression_generator.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart' show LabelTarget;
-import 'package:front_end/src/fasta/kernel/forest.dart';
-import 'package:kernel/ast.dart' as kernel;
-
-/// A data holder used to conform to the [Forest] API.
-class Arguments {
-  List<TypeAnnotation> typeArguments = <TypeAnnotation>[];
-  List<Expression> positionalArguments = <Expression>[];
-  List<Expression> namedArguments = <Expression>[];
-}
-
-/// An implementation of a [Forest] that can be used to build an AST structure.
-class AstBuildingForest
-    implements Forest<Expression, Statement, Token, Arguments> {
-  /// The type provider used to resolve the types of literal nodes, or `null` if
-  /// type resolution is not being performed.
-  final TypeProvider _typeProvider;
-
-  /// The factory used to create AST nodes.
-  AstFactoryImpl astFactory = new AstFactoryImpl();
-
-  /// Initialize a newly created AST-building forest.
-  AstBuildingForest(this._typeProvider);
-
-  @override
-  Arguments arguments(List<Expression> positional, Token location,
-      {covariant List types, covariant List named}) {
-    Arguments arguments = new Arguments();
-    if (types != null) {
-      arguments.typeArguments = types.cast<TypeAnnotation>();
-    }
-    arguments.positionalArguments = positional.cast<Expression>();
-    if (named != null) {
-      arguments.namedArguments = named.cast<Expression>();
-    }
-    return arguments;
-  }
-
-  @override
-  Arguments argumentsEmpty(Token location) => new Arguments();
-
-  @override
-  List argumentsNamed(Arguments arguments) => arguments.namedArguments;
-
-  @override
-  List<Expression> argumentsPositional(Arguments arguments) =>
-      arguments.positionalArguments;
-
-  @override
-  void argumentsSetTypeArguments(Arguments arguments, covariant List types) {
-    arguments.typeArguments = types.cast<TypeAnnotation>();
-  }
-
-  @override
-  List argumentsTypeArguments(Arguments arguments) => arguments.typeArguments;
-
-  @override
-  Expression asExpression(Expression expression, type, Token location) =>
-      astFactory.asExpression(expression, location, type);
-
-  @override
-  Expression asLiteralString(Expression value) => value;
-
-  @override
-  ConstructorInitializer assertInitializer(
-          Token assertKeyword,
-          Token leftParenthesis,
-          Expression condition,
-          Token comma,
-          Expression message) =>
-      astFactory.assertInitializer(assertKeyword, leftParenthesis, condition,
-          comma, message, leftParenthesis.endGroup);
-
-  @override
-  Statement assertStatement(
-          Token assertKeyword,
-          Token leftParenthesis,
-          Expression condition,
-          Token comma,
-          Expression message,
-          Token semicolon) =>
-      astFactory.assertStatement(assertKeyword, leftParenthesis, condition,
-          comma, message, leftParenthesis.endGroup, semicolon);
-
-  @override
-  Expression awaitExpression(Expression operand, Token awaitKeyword) =>
-      astFactory.awaitExpression(awaitKeyword, operand);
-
-  @override
-  Block block(Token openBrace, List<Statement> statements, Token closeBrace) =>
-      astFactory.block(openBrace, statements, closeBrace);
-
-  @override
-  Statement breakStatement(
-          Token breakKeyword, Identifier label, Token semicolon) =>
-      astFactory.breakStatement(
-          breakKeyword,
-          label == null ? null : astFactory.simpleIdentifier(label.token),
-          semicolon);
-
-  @override
-  kernel.Arguments castArguments(Arguments arguments) {
-    // TODO(brianwilkerson) Implement this or remove it from the API.
-    throw new UnimplementedError();
-  }
-
-  @override
-  CatchClause catchClause(
-      Token onKeyword,
-      TypeAnnotation exceptionType,
-      Token catchKeyword,
-      SimpleIdentifier exceptionParameter,
-      SimpleIdentifier stackTraceParameter,
-      TypeAnnotation stackTraceType,
-      Statement body) {
-    // TODO(brianwilkerson) The following is not reliable in the presence of
-    // recovery. Consider passing the required tokens from the Parser to the
-    // BodyBuilder to here.
-    Token leftParenthesis;
-    if (catchKeyword != null) {
-      leftParenthesis = catchKeyword.next;
-    }
-    Token comma;
-    if (stackTraceParameter != null) {
-      comma = exceptionParameter.endToken.next;
-    }
-    Token rightParenthesis;
-    if (catchKeyword != null) {
-      if (stackTraceParameter != null) {
-        rightParenthesis = stackTraceParameter.endToken.next;
-      } else if (comma != null) {
-        rightParenthesis = comma.next;
-      } else {
-        rightParenthesis = exceptionParameter.endToken.next;
-      }
-    }
-    return astFactory.catchClause(
-        onKeyword,
-        exceptionType,
-        catchKeyword,
-        leftParenthesis,
-        exceptionParameter,
-        comma,
-        stackTraceParameter,
-        rightParenthesis,
-        body);
-  }
-
-  @override
-  Expression checkLibraryIsLoaded(dependency) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression conditionalExpression(Expression condition, Token question,
-          Expression thenExpression, Token colon, Expression elseExpression) =>
-      astFactory.conditionalExpression(
-          condition, question, thenExpression, colon, elseExpression);
-
-  @override
-  Statement continueStatement(
-          Token continueKeyword, Identifier label, Token semicolon) =>
-      astFactory.continueStatement(
-          continueKeyword,
-          label == null ? null : astFactory.simpleIdentifier(label.token),
-          semicolon);
-
-  @override
-  Generator<Expression, Statement, Arguments> deferredAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      PrefixBuilder builder,
-      Generator<Expression, Statement, Arguments> generator) {
-    return new AnalyzerDeferredAccessGenerator(
-        helper, astFactory, token, builder, generator);
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> delayedAssignment(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Generator<Expression, Statement, Arguments> generator,
-      Expression value,
-      String assignmentOperator) {
-    return new AnalyzerDelayedAssignmentGenerator(
-        helper, astFactory, token, generator, assignmentOperator, value);
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> delayedPostfixIncrement(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Generator<Expression, Statement, Arguments> generator,
-      kernel.Name binaryOperator,
-      kernel.Procedure interfaceTarget) {
-    return new AnalyzerDelayedPostfixIncrementGenerator(
-        helper, astFactory, token, generator, binaryOperator, interfaceTarget);
-  }
-
-  @override
-  Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
-          ParenthesizedExpression condition, Token semicolon) =>
-      astFactory.doStatement(
-          doKeyword,
-          body,
-          whileKeyword,
-          condition.leftParenthesis,
-          condition.expression,
-          condition.rightParenthesis,
-          semicolon);
-
-  @override
-  Statement emptyStatement(Token semicolon) =>
-      astFactory.emptyStatement(semicolon);
-
-  @override
-  Statement expressionStatement(Expression expression, Token semicolon) =>
-      astFactory.expressionStatement(expression, semicolon);
-
-  @override
-  Statement forStatement(
-          Token forKeyword,
-          Token leftParenthesis,
-          covariant variableList,
-          covariant initialization,
-          Token leftSeparator,
-          Expression condition,
-          Statement conditionStatement,
-          List<Expression> updaters,
-          Token rightParenthesis,
-          Statement body) =>
-      astFactory.forStatement(
-          forKeyword,
-          leftParenthesis,
-          variableList,
-          initialization,
-          leftSeparator,
-          condition,
-          getSemicolon(conditionStatement),
-          updaters,
-          rightParenthesis,
-          body);
-
-  @override
-  Expression getExpressionFromExpressionStatement(Statement statement) =>
-      (statement as ExpressionStatement).expression;
-
-  String getLabelName(Label label) => label.label.name;
-
-  @override
-  int getLabelOffset(Label label) => label.offset;
-
-  /// Return the semicolon at the end of the given [statement], or `null` if the
-  /// statement is not terminated by a semicolon.
-  Token getSemicolon(Statement statement) {
-    if (statement is ExpressionStatement) {
-      return statement.semicolon;
-    }
-    if (statement is EmptyStatement) {
-      return statement.semicolon;
-    }
-    return null;
-  }
-
-  @override
-  kernel.DartType getTypeAt(TypeArgumentList typeArguments, int index) {
-    return null; // typeArguments.arguments[index].type.kernelType;
-  }
-
-  @override
-  int getTypeCount(TypeArgumentList typeArguments) =>
-      typeArguments.arguments.length;
-
-  @override
-  String getVariableDeclarationName(VariableDeclaration declaration) {
-    return declaration.name.name;
-  }
-
-  @override
-  Statement ifStatement(
-          Token ifKeyword,
-          ParenthesizedExpression condition,
-          Statement thenStatement,
-          Token elseKeyword,
-          Statement elseStatement) =>
-      astFactory.ifStatement(
-          ifKeyword,
-          condition.leftParenthesis,
-          condition.expression,
-          condition.rightParenthesis,
-          thenStatement,
-          elseKeyword,
-          elseStatement);
-
-  @override
-  Generator<Expression, Statement, Arguments> indexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression receiver,
-      Expression index,
-      kernel.Procedure getter,
-      kernel.Procedure setter) {
-    return new AnalyzerIndexedAccessGenerator(
-        helper, astFactory, receiver, token, index, token.endGroup);
-  }
-
-  @override
-  bool isBlock(Object node) => node is Block;
-
-  @override
-  bool isEmptyStatement(Statement statement) => statement is EmptyStatement;
-
-  @override
-  bool isErroneousNode(Object node) => false /* ??? */;
-
-  @override
-  Expression isExpression(Expression expression, Token isOperator,
-          Token notOperator, Object type) =>
-      astFactory.isExpression(expression, isOperator, notOperator, type);
-
-  @override
-  bool isExpressionStatement(Statement statement) =>
-      statement is ExpressionStatement;
-
-  @override
-  bool isLabel(covariant node) => node is Label;
-
-  @override
-  bool isThisExpression(Object node) => node is ThisExpression;
-
-  @override
-  bool isVariablesDeclaration(Object node) =>
-      node is VariableDeclarationStatement && node.variables != 1;
-
-  @override
-  Label label(Token identifier, Token colon) => astFactory.label(
-      astFactory.simpleIdentifier(identifier, isDeclaration: true), colon);
-
-  @override
-  Statement labeledStatement(
-          LabelTarget<Statement> target, Statement statement) =>
-      astFactory.labeledStatement(target.labels.cast<Label>(), statement);
-
-  @override
-  Generator<Expression, Statement, Arguments> largeIntAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token) {
-    return new AnalyzerLargeIntAccessGenerator(helper, astFactory, token);
-  }
-
-  @override
-  Expression literalBool(bool value, Token location) =>
-      astFactory.booleanLiteral(location, value)
-        ..staticType = _typeProvider?.boolType;
-
-  @override
-  Expression literalDouble(double value, Token location) =>
-      astFactory.doubleLiteral(location, value)
-        ..staticType = _typeProvider?.doubleType;
-
-  @override
-  Expression literalInt(int value, Token location) =>
-      astFactory.integerLiteral(location, value)
-        ..staticType = _typeProvider?.intType;
-
-  @override
-  Expression literalList(
-          Token constKeyword,
-          bool isConst,
-          Object typeArgument,
-          Object typeArguments,
-          Token leftBracket,
-          List<Expression> expressions,
-          Token rightBracket) =>
-      astFactory.listLiteral(
-          constKeyword, typeArguments, leftBracket, expressions, rightBracket);
-
-  @override
-  Expression literalMap(
-          Token constKeyword,
-          bool isConst,
-          covariant keyType,
-          covariant valueType,
-          Object typeArguments,
-          Token leftBracket,
-          covariant List entries,
-          Token rightBracket) =>
-      astFactory.mapLiteral(
-          constKeyword, typeArguments, leftBracket, entries, rightBracket);
-
-  @override
-  Expression literalNull(Token location) =>
-      astFactory.nullLiteral(location)..staticType = _typeProvider?.nullType;
-
-  @override
-  Expression literalString(String value, Token location) =>
-      astFactory.simpleStringLiteral(location, value)
-        ..staticType = _typeProvider?.stringType;
-
-  @override
-  Expression literalSymbolMultiple(
-          String value, Token hash, List<Identifier> components) =>
-      astFactory.symbolLiteral(
-          hash, components.map((identifier) => identifier.token).toList())
-        ..staticType = _typeProvider?.symbolType;
-
-  @override
-  Expression literalSymbolSingluar(String value, Token hash, Object component) {
-    Token token;
-    if (component is Identifier) {
-      token = component.token;
-    } else if (component is Operator) {
-      token = component.token;
-    } else {
-      throw new ArgumentError(
-          'Unexpected class of component: ${component.runtimeType}');
-    }
-    return astFactory.symbolLiteral(hash, <Token>[token])
-      ..staticType = _typeProvider?.symbolType;
-  }
-
-  @override
-  Expression literalType(covariant type, Token location) {
-    // TODO(brianwilkerson) Capture the type information.
-    return astFactory.simpleIdentifier(location)
-      ..staticType = _typeProvider?.typeType;
-  }
-
-  @override
-  Expression loadLibrary(dependency) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> loadLibraryGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      LoadLibraryBuilder builder) {
-    return new AnalyzerLoadLibraryGenerator(helper, astFactory, token, builder);
-  }
-
-  @override
-  Expression logicalExpression(
-          Expression leftOperand, Token operator, Expression rightOperand) =>
-      astFactory.binaryExpression(leftOperand, operator, rightOperand);
-
-  @override
-  Object mapEntry(Expression key, Token colon, Expression value) =>
-      astFactory.mapLiteralEntry(key, colon, value);
-
-  @override
-  List mapEntryList(int length) => new List<MapLiteralEntry>(length);
-
-  @override
-  Expression notExpression(Expression operand, Token operator) =>
-      astFactory.prefixExpression(operator, operand)
-        ..staticType = _typeProvider?.boolType;
-
-  @override
-  Generator<Expression, Statement, Arguments> nullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression receiverExpression,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter,
-      kernel.DartType type) {
-    return new AnalyzerNullAwarePropertyAccessGenerator(
-        helper, astFactory, receiverExpression, token, null /*name*/);
-  }
-
-  @override
-  Object parenthesizedCondition(Token leftParenthesis, Expression expression,
-          Token rightParenthesis) =>
-      astFactory.parenthesizedExpression(
-          leftParenthesis, expression, rightParenthesis);
-
-  @override
-  Generator<Expression, Statement, Arguments> propertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression receiver,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter) {
-    return new AnalyzerPropertyAccessGenerator(
-        helper, astFactory, token, receiver, name, getter, setter);
-  }
-
-  @override
-  int readOffset(AstNode node) => node.offset;
-
-  @override
-  Generator<Expression, Statement, Arguments> readOnlyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression expression,
-      String plainNameForRead) {
-    return new AnalyzerReadOnlyAccessGenerator(
-        helper, astFactory, token, expression, plainNameForRead);
-  }
-
-  @override
-  void resolveBreak(Statement target, BreakStatement user) {
-    user.target = target;
-  }
-
-  @override
-  void resolveContinue(Statement target, ContinueStatement user) {
-    user.target = target;
-  }
-
-  @override
-  void resolveContinueInSwitch(SwitchStatement target, ContinueStatement user) {
-    user.target = target;
-  }
-
-  @override
-  Statement rethrowStatement(Token rethrowKeyword, Token semicolon) =>
-      astFactory.expressionStatement(
-          astFactory.rethrowExpression(rethrowKeyword), semicolon);
-
-  @override
-  Statement returnStatement(
-          Token returnKeyword, Expression expression, Token semicolon) =>
-      astFactory.returnStatement(returnKeyword, expression, semicolon);
-
-  @override
-  void setParameterType(FormalParameter parameter, TypeAnnotation type) {
-    parameter.identifier.staticType = type.type;
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> staticAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      kernel.Member getter,
-      kernel.Member setter) {
-    return new AnalyzerStaticAccessGenerator(
-        helper, astFactory, token, getter, setter);
-  }
-
-  @override
-  Expression stringConcatenationExpression(
-          List<Expression> strings, Token location) =>
-      astFactory.adjacentStrings(strings.cast<StringLiteral>());
-
-  @override
-  Generator<Expression, Statement, Arguments> superIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression index,
-      kernel.Member getter,
-      kernel.Member setter) {
-    // TODO(brianwilkerson) Figure out how to get the token for `super`.
-    return new AnalyzerIndexedAccessGenerator(
-        helper, astFactory, null, token, index, token.endGroup);
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> superPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter) {
-    // TODO(brianwilkerson) Figure out how to get the token for the name.
-    return new AnalyzerSuperPropertyAccessGenerator(
-        helper, astFactory, null, null, null /*name*/);
-  }
-
-  @override
-  Statement syntheticLabeledStatement(Statement statement) => statement;
-
-  @override
-  Expression thisExpression(Token thisKeyword) =>
-      astFactory.thisExpression(thisKeyword);
-
-  @override
-  Generator<Expression, Statement, Arguments> thisIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression index,
-      kernel.Procedure getter,
-      kernel.Procedure setter) {
-    // TODO(brianwilkerson) Figure out how to get the token for `this`.
-    return new AnalyzerIndexedAccessGenerator(
-        helper, astFactory, null, token, index, token.endGroup);
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> thisPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token location,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter) {
-    // TODO(brianwilkerson) Figure out how to get the token for the name.
-    return new AnalyzerThisPropertyAccessGenerator(
-        helper, astFactory, location, name, getter, setter);
-  }
-
-  @override
-  Expression throwExpression(Token throwKeyword, Expression expression) =>
-      astFactory.throwExpression(throwKeyword, expression);
-
-  @override
-  Statement tryStatement(
-          Token tryKeyword,
-          Statement body,
-          List<CatchClause> catchClauses,
-          Token finallyKeyword,
-          Statement finallyBlock) =>
-      astFactory.tryStatement(
-          tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
-
-  @override
-  Generator<Expression, Statement, Arguments> typeUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      PrefixBuilder prefix,
-      int declarationReferenceOffset,
-      TypeDeclarationBuilder declaration,
-      String plainNameForRead) {
-    return new AnalyzerTypeUseGenerator(helper, astFactory, token, prefix,
-        declarationReferenceOffset, declaration, plainNameForRead);
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> unlinkedGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      UnlinkedDeclaration declaration) {
-    return new AnalyzerUnlinkedNameGenerator(
-        helper, astFactory, token, declaration);
-  }
-
-  @override
-  Generator<Expression, Statement, Arguments> unresolvedNameGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      kernel.Name name) {
-    return new AnalyzerUnresolvedNameGenerator(helper, astFactory, token, name);
-  }
-
-  @override
-  VariableDeclarationStatement variablesDeclaration(
-      List<VariableDeclaration> declarations, Uri uri) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
-  }
-
-  @override
-  NodeList<VariableDeclaration> variablesDeclarationExtractDeclarations(
-          VariableDeclarationStatement variablesDeclaration) =>
-      variablesDeclaration.variables.variables;
-
-  @override
-  Generator<Expression, Statement, Arguments> variableUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      VariableDeclarationStatement variable,
-      kernel.DartType promotedType) {
-    return new AnalyzerVariableUseGenerator(helper, astFactory, token);
-  }
-
-  Statement whileStatement(Token whileKeyword,
-          ParenthesizedExpression condition, Statement body) =>
-      astFactory.whileStatement(whileKeyword, condition.leftParenthesis,
-          condition.expression, condition.rightParenthesis, body);
-
-  @override
-  Statement wrapVariables(Statement statement) => statement;
-
-  @override
-  Statement yieldStatement(Token yieldKeyword, Token star,
-          Expression expression, Token semicolon) =>
-      astFactory.yieldStatement(yieldKeyword, star, expression, semicolon);
-}
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 5aa09cd..9d1b45c 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -280,7 +280,7 @@
     _typeContext.enterLocalFunction(element);
 
     functionExpression.body?.accept(this);
-    _storeFunctionType(_get(node).inferredType, element);
+    _storeFunctionType(_get(node.name).inferredType, element);
 
     // Associate the elements with the nodes.
     if (element != null) {
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 3713e55..e0b2de8 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -3,8 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/fasta/resolution_applier.dart';
+import 'package:front_end/src/fasta/kernel/factory.dart';
 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
+import 'package:front_end/src/scanner/token.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
@@ -39,7 +41,10 @@
 
 /// Type inference listener that records inferred types for later use by
 /// [ResolutionApplier].
-class ResolutionStorer extends _ResolutionStorer<int, int, Node, int> {
+class ResolutionStorer extends _ResolutionStorer<int, int, Node, int>
+    implements
+        TypeInferenceListener<int, int, Node, int>,
+        Factory<void, void, void, void> {
   ResolutionStorer(Map<int, ResolutionData<DartType, int, Node, int>> data)
       : super(data);
 }
@@ -48,9 +53,7 @@
 /// accidentally peeking into kernel internals.
 ///
 /// TODO(paulberry): when the time is right, fuse this with [ResolutionStorer].
-class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
-    implements
-        TypeInferenceListener<Location, Declaration, Reference, PrefixInfo> {
+class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo> {
   final Map<Location,
       ResolutionData<DartType, Declaration, Reference, PrefixInfo>> _data;
 
@@ -92,35 +95,56 @@
     _data.remove(location) == null;
   }
 
-  @override
   void asExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType) {
+      ExpressionJudgment judgment,
+      Location location,
+      void expression,
+      Token asOperator,
+      void literalType,
+      DartType inferredType) {
     _store(location, literalType: inferredType, inferredType: inferredType);
   }
 
-  @override
-  void assertInitializer(InitializerJudgment judgment, Location location) {}
+  void assertInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis) {}
 
-  @override
-  void assertStatement(StatementJudgment judgment, Location location) {}
+  void assertStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis,
+      Token semicolon) {}
 
-  @override
   void awaitExpression(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+          Token awaitKeyword, void expression, DartType inferredType) =>
       genericExpression("awaitExpression", location, inferredType);
 
-  @override
-  void block(StatementJudgment judgment, Location location) {}
+  void block(StatementJudgment judgment, Location location, Token leftBracket,
+      List<void> statements, Token rightBracket) {}
 
-  @override
   void boolLiteral(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+          Token literal, bool value, DartType inferredType) =>
       genericExpression("boolLiteral", location, inferredType);
 
-  @override
-  void breakStatement(StatementJudgment judgment, Location location) {}
+  void breakStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token breakKeyword,
+      void label,
+      Token semicolon,
+      covariant Object labelBinder) {}
 
-  @override
   void cascadeExpression(
       ExpressionJudgment judgment, Location location, DartType inferredType) {
     // Overridden so that the type of the expression will not be recorded. We
@@ -129,32 +153,47 @@
     // correctly apply the type even if we recorded it.
   }
 
-  @override
   void catchStatement(
       Catch judgment,
       Location location,
+      Token onKeyword,
+      void type,
+      Token catchKeyword,
+      Token leftParenthesis,
+      Token exceptionParameter,
+      Token comma,
+      Token stackTraceParameter,
+      Token rightParenthesis,
+      void body,
       DartType guardType,
-      Location exceptionLocation,
+      covariant VariableDeclarationBinder exceptionBinder,
       DartType exceptionType,
-      Location stackTraceLocation,
+      covariant VariableDeclarationBinder stackTraceBinder,
       DartType stackTraceType) {
     _store(location, literalType: guardType);
 
-    if (exceptionLocation != null) {
-      _store(exceptionLocation, literalType: exceptionType);
+    if (exceptionBinder != null) {
+      _store(exceptionBinder.fileOffset as Location,
+          literalType: exceptionType);
     }
 
-    if (stackTraceLocation != null) {
-      _store(stackTraceLocation, literalType: stackTraceType);
+    if (stackTraceBinder != null) {
+      _store(stackTraceBinder.fileOffset as Location,
+          literalType: stackTraceType);
     }
   }
 
-  @override
-  void conditionalExpression(ExpressionJudgment judgment, Location location,
+  void conditionalExpression(
+          ExpressionJudgment judgment,
+          Location location,
+          void condition,
+          Token question,
+          void thenExpression,
+          Token colon,
+          void elseExpression,
           DartType inferredType) =>
       genericExpression("conditionalExpression", location, inferredType);
 
-  @override
   void constructorInvocation(ExpressionJudgment judgment, Location location,
       Reference expressionTarget, DartType inferredType) {
     // A class reference may have already been stored at this location by
@@ -164,43 +203,79 @@
     _store(location, inferredType: inferredType, reference: expressionTarget);
   }
 
-  @override
-  void continueSwitchStatement(StatementJudgment judgment, Location location) {}
+  void continueStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant Object labelBinder) {}
 
-  @override
+  void continueSwitchStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant Object labelBinder) {}
+
   void deferredCheck(ExpressionJudgment judgment, Location location,
           DartType inferredType) =>
       genericExpression("deferredCheck", location, inferredType);
 
-  @override
-  void doStatement(StatementJudgment judgment, Location location) {}
+  void doStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token doKeyword,
+      void body,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      Token semicolon) {}
 
-  @override
   void doubleLiteral(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+          Token literal, double value, DartType inferredType) =>
       genericExpression("doubleLiteral", location, inferredType);
 
-  @override
-  void expressionStatement(StatementJudgment judgment, Location location) {}
+  void emptyStatement(Token semicolon) {}
 
-  @override
-  void fieldInitializer(InitializerJudgment judgment, Location location,
+  void expressionStatement(StatementJudgment judgment, Location location,
+      void expression, Token semicolon) {}
+
+  void fieldInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token thisKeyword,
+      Token period,
+      Token fieldName,
+      Token equals,
+      void expression,
       Reference initializerField) {
     _store(location, reference: initializerField);
   }
 
-  @override
   void forInStatement(
       StatementJudgment judgment,
       Location location,
-      Location variableLocation,
-      DartType variableType,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      Object loopVariable,
+      Token identifier,
+      Token inKeyword,
+      void iterator,
+      Token rightParenthesis,
+      void body,
+      covariant VariableDeclarationBinder loopVariableBinder,
+      DartType loopVariableType,
       Location writeLocation,
       DartType writeType,
       Declaration writeVariable,
       Reference writeTarget) {
-    if (variableLocation != null) {
-      _store(variableLocation, inferredType: variableType);
+    if (loopVariableBinder != null) {
+      _store(loopVariableBinder.fileOffset as Location,
+          inferredType: loopVariableType);
     } else {
       if (writeVariable != null) {
         _store(writeLocation,
@@ -214,16 +289,30 @@
     }
   }
 
-  @override
-  void forStatement(StatementJudgment judgment, Location location) {}
+  void forStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token forKeyword,
+      Token leftParenthesis,
+      void variableDeclarationList,
+      void initialization,
+      Token leftSeparator,
+      void condition,
+      Token rightSeparator,
+      void updaters,
+      Token rightParenthesis,
+      void body) {}
 
-  @override
-  void functionDeclaration(StatementJudgment judgment, Location location,
-      FunctionType inferredType) {
-    _store(location, inferredType: inferredType);
+  void functionDeclaration(
+      covariant VariableDeclarationBinder binder, FunctionType inferredType) {
+    _store(binder.fileOffset as Location, inferredType: inferredType);
   }
 
-  @override
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return new VariableDeclarationBinder(fileOffset);
+  }
+
   void functionExpression(ExpressionJudgment judgment, Location location,
           DartType inferredType) =>
       genericExpression("functionExpression", location, inferredType);
@@ -233,76 +322,114 @@
     _store(location, inferredType: inferredType);
   }
 
-  @override
-  void ifNull(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+  void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
+          Token operator, void rightOperand, DartType inferredType) =>
       genericExpression('ifNull', location, inferredType);
 
-  @override
-  void ifStatement(StatementJudgment judgment, Location location) {}
+  void ifStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token ifKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void thenStatement,
+      Token elseKeyword,
+      void elseStatement) {}
 
-  @override
-  void intLiteral(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+  void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
+          num value, DartType inferredType) =>
       genericExpression("intLiteral", location, inferredType);
 
-  @override
   void invalidInitializer(InitializerJudgment judgment, Location location) {}
 
-  @override
-  void labeledStatement(StatementJudgment judgment, Location location) {}
+  void labeledStatement(List<Object> labels, void statement) {}
 
-  @override
-  void listLiteral(ExpressionJudgment judgment, Location location,
+  void statementLabel(covariant void binder, Token label, Token colon) {}
+
+  void binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {}
+
+  void listLiteral(
+          ExpressionJudgment judgment,
+          Location location,
+          Token constKeyword,
+          Object typeArguments,
+          Token leftBracket,
+          void elements,
+          Token rightBracket,
           DartType inferredType) =>
       genericExpression("listLiteral", location, inferredType);
 
-  @override
-  void logicalExpression(ExpressionJudgment judgment, Location location,
+  void logicalExpression(
+          ExpressionJudgment judgment,
+          Location location,
+          void leftOperand,
+          Token operator,
+          void rightOperand,
           DartType inferredType) =>
       genericExpression("logicalExpression", location, inferredType);
 
-  @override
-  void mapLiteral(ExpressionJudgment judgment, Location location,
-          DartType typeContext) =>
-      genericExpression("mapLiteral", location, typeContext);
-
-  @override
-  void namedFunctionExpression(ExpressionJudgment judgment, Location location,
+  void mapLiteral(
+          ExpressionJudgment judgment,
+          Location location,
+          Token constKeyword,
+          Object typeArguments,
+          Token leftBracket,
+          List<Object> entries,
+          Token rightBracket,
           DartType inferredType) =>
-      genericExpression("namedFunctionExpression", location, inferredType);
+      genericExpression("mapLiteral", location, inferredType);
 
-  @override
-  void not(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+  void mapLiteralEntry(
+      Object judgment, int fileOffset, void key, Token separator, void value) {
+    // TODO(brianwilkerson) Implement this.
+  }
+
+  void namedFunctionExpression(ExpressionJudgment judgment,
+          covariant VariableDeclarationBinder binder, DartType inferredType) =>
+      genericExpression("namedFunctionExpression",
+          binder.fileOffset as Location, inferredType);
+
+  void not(ExpressionJudgment judgment, Location location, Token operator,
+          void operand, DartType inferredType) =>
       genericExpression("not", location, inferredType);
 
-  @override
   void nullLiteral(ExpressionJudgment judgment, Location location,
-      bool isSynthetic, DartType inferredType) {
+      Token literal, bool isSynthetic, DartType inferredType) {
     if (isSynthetic) return null;
     genericExpression("nullLiteral", location, inferredType);
   }
 
-  @override
   void indexAssign(ExpressionJudgment judgment, Location location,
       Reference writeMember, Reference combiner, DartType inferredType) {
     _store(location,
         reference: writeMember, inferredType: inferredType, combiner: combiner);
   }
 
-  @override
-  void isExpression(ExpressionJudgment judgment, Location location,
-      DartType testedType, DartType inferredType) {
+  void isExpression(
+      ExpressionJudgment judgment,
+      Location location,
+      void expression,
+      Token isOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType) {
     _store(location, literalType: testedType, inferredType: inferredType);
   }
 
-  void isNotExpression(ExpressionJudgment judgment, Location location,
-      DartType type, DartType inferredType) {
+  void isNotExpression(
+      ExpressionJudgment judgment,
+      Location location,
+      void expression,
+      Token isOperator,
+      Token notOperator,
+      void literalType,
+      DartType type,
+      DartType inferredType) {
     _store(location, literalType: type, inferredType: inferredType);
   }
 
-  @override
   void methodInvocation(
       ExpressionJudgment judgment,
       Location resultOffset,
@@ -324,7 +451,6 @@
         reference: interfaceMember);
   }
 
-  @override
   void methodInvocationCall(
       ExpressionJudgment judgment,
       Location resultOffset,
@@ -344,7 +470,6 @@
         isImplicitCall: isImplicitCall);
   }
 
-  @override
   void propertyAssign(
       ExpressionJudgment judgment,
       Location location,
@@ -360,38 +485,38 @@
         inferredType: inferredType);
   }
 
-  @override
   void propertySet(ExpressionJudgment judgment, Location location,
           DartType inferredType) =>
       genericExpression("propertySet", location, inferredType);
 
-  @override
   void propertyGet(ExpressionJudgment judgment, Location location,
       Reference member, DartType inferredType) {
     _store(location, reference: member, inferredType: inferredType);
   }
 
-  @override
   void propertyGetCall(
       ExpressionJudgment judgment, Location location, DartType inferredType) {
     _store(location, isExplicitCall: true);
   }
 
-  @override
-  void redirectingInitializer(InitializerJudgment judgment, Location location,
+  void redirectingInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token thisKeyword,
+      Token period,
+      Token constructorName,
+      covariant Object argumentList,
       Reference initializerTarget) {
     _store(location, reference: initializerTarget);
   }
 
-  @override
   void rethrow_(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+          Token rethrowKeyword, DartType inferredType) =>
       genericExpression('rethrow', location, inferredType);
 
-  @override
-  void returnStatement(StatementJudgment judgment, Location location) {}
+  void returnStatement(StatementJudgment judgment, Location location,
+      Token returnKeyword, void expression, Token semicolon) {}
 
-  @override
   void staticAssign(
       ExpressionJudgment judgment,
       Location location,
@@ -407,13 +532,11 @@
         inferredType: inferredType);
   }
 
-  @override
   void staticGet(ExpressionJudgment judgment, Location location,
       Reference expressionTarget, DartType inferredType) {
     _store(location, reference: expressionTarget, inferredType: inferredType);
   }
 
-  @override
   void staticInvocation(
       ExpressionJudgment judgment,
       Location location,
@@ -432,50 +555,75 @@
         inferredType: inferredType);
   }
 
-  @override
   void stringConcatenation(
       ExpressionJudgment judgment, Location location, DartType inferredType) {
     // We don't need the type - we already know that it is String.
     // Moreover, the file offset for StringConcatenation is `-1`.
   }
 
-  @override
   void stringLiteral(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+          Token literal, String value, DartType inferredType) =>
       genericExpression("StringLiteral", location, inferredType);
 
-  @override
-  void superInitializer(InitializerJudgment judgment, Location location) {}
+  void superInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token superKeyword,
+      Token period,
+      Token constructorName,
+      covariant Object argumentList) {}
 
-  @override
-  void switchStatement(StatementJudgment judgment, Location location) {}
+  void switchCase(SwitchCaseJudgment judgment, List<Object> labels,
+      Token keyword, void expression, Token colon, List<void> statements) {}
 
-  @override
-  void symbolLiteral(ExpressionJudgment judgment, Location location,
+  void switchLabel(covariant void binder, Token label, Token colon) {}
+
+  void binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+  void switchStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token switchKeyword,
+      Token leftParenthesis,
+      void expression,
+      Token rightParenthesis,
+      Token leftBracket,
+      void members,
+      Token rightBracket) {}
+
+  void symbolLiteral(
+          ExpressionJudgment judgment,
+          Location location,
+          Token poundSign,
+          List<Token> components,
+          String value,
           DartType inferredType) =>
       genericExpression("symbolLiteral", location, inferredType);
 
-  @override
-  void thisExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType) {}
+  void thisExpression(ExpressionJudgment judgment, Location location,
+      Token thisKeyword, DartType inferredType) {}
 
-  @override
   void throw_(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
+          Token throwKeyword, void expression, DartType inferredType) =>
       genericExpression('throw', location, inferredType);
 
-  @override
   void tryCatch(StatementJudgment judgment, Location location) {}
 
-  @override
-  void tryFinally(StatementJudgment judgment, Location location) {}
+  void tryFinally(
+      StatementJudgment judgment,
+      Location location,
+      Token tryKeyword,
+      void body,
+      void catchClauses,
+      Token finallyKeyword,
+      void finallyBlock) {}
 
   void typeLiteral(ExpressionJudgment judgment, Location location,
       Reference expressionType, DartType inferredType) {
     _store(location, reference: expressionType, inferredType: inferredType);
   }
 
-  @override
   void variableAssign(
       ExpressionJudgment judgment,
       Location location,
@@ -491,39 +639,47 @@
         inferredType: inferredType);
   }
 
-  @override
-  void variableDeclaration(StatementJudgment judgment, Location location,
+  void variableDeclaration(covariant VariableDeclarationBinder binder,
       DartType statementType, DartType inferredType) {
-    _store(location, literalType: statementType, inferredType: inferredType);
+    _store(binder.fileOffset as Location,
+        literalType: statementType, inferredType: inferredType);
   }
 
-  @override
-  void variableGet(ExpressionJudgment judgment, Location location,
-      bool isInCascade, Declaration expressionVariable, DartType inferredType) {
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
+    return new VariableDeclarationBinder(fileOffset);
+  }
+
+  void variableGet(
+      ExpressionJudgment judgment,
+      Location location,
+      bool isInCascade,
+      covariant VariableDeclarationBinder variableBinder,
+      DartType inferredType) {
     if (isInCascade) {
       return;
     }
     _store(location,
-        declaration: expressionVariable, inferredType: inferredType);
+        declaration: variableBinder.fileOffset as Declaration,
+        inferredType: inferredType);
   }
 
-  @override
-  void variableSet(ExpressionJudgment judgment, Location location,
-          DartType inferredType) =>
-      genericExpression("variableSet", location, inferredType);
+  void whileStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void body) {}
 
-  @override
-  void whileStatement(StatementJudgment judgment, Location location) {}
+  void yieldStatement(StatementJudgment judgment, Location location,
+      Token yieldKeyword, Token star, void expression, Token semicolon) {}
 
-  @override
-  void yieldStatement(StatementJudgment judgment, Location location) {}
-
-  @override
   void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
     _store(location, prefixInfo: prefixInfo);
   }
 
-  @override
   void storeClassReference(
       Location location, Reference reference, DartType rawType) {
     // TODO(paulberry): would it be better to use literalType?
@@ -531,6 +687,13 @@
   }
 }
 
+/// TODO(paulberry): eventually just use the element directly.
+class VariableDeclarationBinder {
+  final int fileOffset;
+
+  VariableDeclarationBinder(this.fileOffset);
+}
+
 /// A [DartType] wrapper around invocation type arguments.
 class TypeArgumentsDartType implements DartType {
   final List<DartType> types;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 204542e..b470ac2 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1239,6 +1239,7 @@
     _checkForTypeParameterSupertypeOfItsBound(node);
     _checkForTypeAnnotationDeferredClass(node.bound);
     _checkForImplicitDynamicType(node.bound);
+    _checkForGenericFunctionType(node.bound);
     if (_options.strongMode) node.bound?.accept(_uninstantiatedBoundChecker);
     return super.visitTypeParameter(node);
   }
@@ -4183,6 +4184,19 @@
     }
   }
 
+  void _checkForGenericFunctionType(TypeAnnotation node) {
+    if (node == null) {
+      return;
+    }
+    DartType type = node.type;
+    if (type is FunctionType && type.typeFormals.isNotEmpty) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
+          node,
+          [type]);
+    }
+  }
+
   void _checkForImplicitDynamicTypedLiteral(TypedLiteral node) {
     if (_options.implicitDynamic || node.typeArguments != null) {
       return;
@@ -5905,7 +5919,9 @@
    * Verify that the type arguments in the given [typeName] are all within
    * their bounds.
    *
-   * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+   * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS],
+   * [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS],
+   * [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_BOUND].
    */
   void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
     if (typeName.typeArguments == null) {
@@ -5931,11 +5947,19 @@
       for (int i = 0; i < loopThroughIndex; i++) {
         TypeAnnotation argumentNode = argumentNodes[i];
         DartType argType = argumentNode.type;
+        if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
+          _errorReporter.reportTypeErrorForNode(
+              CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
+              argumentNode,
+              [argType.typeFormals.join(', ')]);
+          continue;
+        }
         DartType boundType = parameterElements[i].bound;
         if (argType != null && boundType != null) {
           if (shouldSubstitute) {
             boundType = boundType.substitute2(arguments, parameterTypes);
           }
+
           if (!_typeSystem.isSubtypeOf(argType, boundType)) {
             ErrorCode errorCode;
             if (_isInConstInstanceCreation) {
@@ -6455,6 +6479,15 @@
         //     <T extends Clonable<T>>
         //
         DartType argType = typeArgs[i];
+
+        if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
+          _errorReporter.reportTypeErrorForNode(
+              CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
+              typeArgumentList[i],
+              [argType.typeFormals.join(', ')]);
+          continue;
+        }
+
         DartType bound =
             fnTypeParams[i].bound.substitute2(typeArgs, fnTypeParams);
         if (!_typeSystem.isSubtypeOf(argType, bound)) {
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 6f5e77a..43b4191 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -283,8 +283,10 @@
 
   @override
   TypeAnnotation parseTypeAnnotation(bool inExpression) {
-    currentToken = fastaParser
-        .parseType(fastaParser.syntheticPreviousToken(currentToken))
+    Token previous = fastaParser.syntheticPreviousToken(currentToken);
+    currentToken = fasta
+        .computeType(previous, true, !inExpression)
+        .parseType(previous, fastaParser)
         .next;
     return astBuilder.pop();
   }
@@ -301,8 +303,10 @@
 
   @override
   TypeName parseTypeName(bool inExpression) {
-    currentToken = fastaParser
-        .parseType(fastaParser.syntheticPreviousToken(currentToken))
+    Token previous = fastaParser.syntheticPreviousToken(currentToken);
+    currentToken = fasta
+        .computeType(previous, true, !inExpression)
+        .parseType(previous, fastaParser)
         .next;
     return astBuilder.pop();
   }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 663b76e..685704b 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -9043,7 +9043,10 @@
   TypeNameResolver typeNameResolver = null;
 
   TypeParameterBoundsResolver(
-      this.typeSystem, this.library, this.source, this.errorListener);
+      this.typeSystem, this.library, this.source, this.errorListener)
+      : libraryScope = new LibraryScope(library),
+        typeNameResolver = new TypeNameResolver(typeSystem,
+            typeSystem.typeProvider, library, source, errorListener);
 
   /**
    * Resolve bounds of type parameters of classes, class and function type
@@ -9070,27 +9073,40 @@
       typeNameResolver.resolveTypeName(type);
       // TODO(scheglov) report error when don't apply type bounds for type bounds
     } else if (type is GenericFunctionType) {
-      void resolveTypeParameter(TypeParameter t) {
-        _resolveTypeName(t.bound);
-      }
+      // While GenericFunctionTypes with free types are not allowed as bounds,
+      // those free types *should* ideally be recognized as type parameter types
+      // rather than classnames. Create a scope to accomplish that.
+      Scope previousScope = typeNameResolver.nameScope;
 
-      void resolveParameter(FormalParameter p) {
-        if (p is SimpleFormalParameter) {
-          _resolveTypeName(p.type);
-        } else if (p is DefaultFormalParameter) {
-          resolveParameter(p.parameter);
-        } else if (p is FieldFormalParameter) {
-          _resolveTypeName(p.type);
-        } else if (p is FunctionTypedFormalParameter) {
-          _resolveTypeName(p.returnType);
-          p.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
-          p.parameters?.parameters?.forEach(resolveParameter);
+      try {
+        Scope typeParametersScope = new TypeParameterScope(
+            typeNameResolver.nameScope, type.type.element);
+        typeNameResolver.nameScope = typeParametersScope;
+
+        void resolveTypeParameter(TypeParameter t) {
+          _resolveTypeName(t.bound);
         }
-      }
 
-      _resolveTypeName(type.returnType);
-      type.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
-      type.parameters?.parameters?.forEach(resolveParameter);
+        void resolveParameter(FormalParameter p) {
+          if (p is SimpleFormalParameter) {
+            _resolveTypeName(p.type);
+          } else if (p is DefaultFormalParameter) {
+            resolveParameter(p.parameter);
+          } else if (p is FieldFormalParameter) {
+            _resolveTypeName(p.type);
+          } else if (p is FunctionTypedFormalParameter) {
+            _resolveTypeName(p.returnType);
+            p.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
+            p.parameters?.parameters?.forEach(resolveParameter);
+          }
+        }
+
+        _resolveTypeName(type.returnType);
+        type.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
+        type.parameters?.parameters?.forEach(resolveParameter);
+      } finally {
+        typeNameResolver.nameScope = previousScope;
+      }
     }
   }
 
@@ -9111,10 +9127,10 @@
                 bound.type = typeParameterElement.bound;
               }
             } else {
-              libraryScope ??= new LibraryScope(library);
               typeParametersScope ??= createTypeParametersScope();
-              typeNameResolver ??= new TypeNameResolver(typeSystem,
-                  typeSystem.typeProvider, library, source, errorListener);
+              // _resolveTypeParameters is the entry point into each declaration
+              // with a separate scope. We can safely, and should, clobber the
+              // old scope here.
               typeNameResolver.nameScope = typeParametersScope;
               _resolveTypeName(bound);
               typeParameterElement.bound = bound.type;
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index e54318a..a500975 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -15,7 +15,8 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
+import 'package:analyzer/src/error/codes.dart'
+    show StrongModeCode, CompileTimeErrorCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
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 171376f..6cd4ceb 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
@@ -149,13 +149,6 @@
 
   @failingTest
   @override
-  test_fieldTypeOk_generic() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib2::y in let ...
-    await super.test_fieldTypeOk_generic();
-  }
-
-  @failingTest
-  @override
   test_fieldTypeOk_unresolved_null() async {
     // UnimplementedError: kernel: (AsExpression) x as{TypeError} invalid-type
     await super.test_fieldTypeOk_unresolved_null();
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 4d9b603..97fa300 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
@@ -526,16 +526,16 @@
 
   @override
   @failingTest
-  test_constWithNonConst_with() async {
-    // Bad state: No type information for C at 72
-    await super.test_constWithNonConst_with();
+  test_constWithNonConst_in_const_context() async {
+    // Bad state: No data for () at 58
+    await super.test_constWithNonConst_in_const_context();
   }
 
   @override
   @failingTest
-  test_constWithNonConst_in_const_context() async {
-    // Bad state: No data for () at 58
-    await super.test_constWithNonConst_in_const_context();
+  test_constWithNonConst_with() async {
+    // Bad state: No type information for C at 72
+    await super.test_constWithNonConst_with();
   }
 
   @override
@@ -3098,6 +3098,69 @@
     // Test passes, even though if fails in the superclass
     await super.test_yieldInNonGenerator_async();
   }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeAsBound_class() async {
+    await super.test_genericFunctionTypeAsBound_class();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeAsBound_genericFunction() async {
+    await super.test_genericFunctionTypeAsBound_genericFunction();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeAsBound_genericFunctionTypedef() async {
+    await super.test_genericFunctionTypeAsBound_genericFunctionTypedef();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeAsBound_parameterOfFunction() async {
+    await super.test_genericFunctionTypeAsBound_parameterOfFunction();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeAsBound_typedef() async {
+    await super.test_genericFunctionTypeAsBound_typedef();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_class() async {
+    await super.test_genericFunctionTypeArgument_class();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_functionType() async {
+    await super.test_genericFunctionTypeArgument_functionType();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_function() async {
+    await super.test_genericFunctionTypeArgument_function();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_genericFunctionTypeArgument_method() async {
+    await super.test_genericFunctionTypeArgument_method();
+  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
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 6923bc6..6f250b2 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -2749,6 +2749,55 @@
     verify([source]);
   }
 
+  test_genericFunctionTypeAsBound_class() async {
+    Source source = addSource(r'''
+class C<T extends S Function<S>(S)> {
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeAsBound_genericFunction() async {
+    Source source = addSource(r'''
+T Function<T extends S Function<S>(S)>(T) fun;
+''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeAsBound_genericFunctionTypedef() async {
+    Source source = addSource(r'''
+typedef foo = T Function<T extends S Function<S>(S)>(T t);
+''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeAsBound_parameterOfFunction() async {
+    Source source = addSource(r'''
+class C<T extends void Function(S Function<S>(S))> {
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeAsBound_typedef() async {
+    Source source = addSource(r'''
+typedef T foo<T extends S Function<S>(S)>(T t);
+''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+    verify([source]);
+  }
+
   test_genericFunctionTypedParameter() async {
     // Once dartbug.com/28515 is fixed, this syntax should no longer generate an
     // error.
@@ -7014,6 +7063,98 @@
     verify([source]);
   }
 
+  test_genericFunctionTypeArgument_class() async {
+    Source source = addSource(r'''
+class C<T> {}
+C<T Function<T>(T)> c;''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_functionType() async {
+    Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_function() async {
+    Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_method() async {
+    Source source = addSource(r'''
+class C {
+  T f<T>(T) => null;
+}
+main() { new C().f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_functionType() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_function() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_method() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+class C {
+  T f<T>(T) => null;
+}
+main() { new C().f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_typedef() async {
+    // TODO(mfairhurst) diagnose these parse errors to give the correct error
+    Source source = addSource(r'''
+typedef T f<T>(T t);
+final T<Function<S>(int)> x = null;''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
   test_undefinedAnnotation_unresolved_identifier() async {
     Source source = addSource(r'''
 @unresolved
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 410dd7e..85bd5a7 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -66,41 +66,6 @@
 
   @override
   @failingTest
-  test_multiple_ignores() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t2 = #lib2::x in let ...
-    await super.test_multiple_ignores();
-  }
-
-  @override
-  @failingTest
-  test_multiple_ignores_traling() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t3 = #lib3::x in let ...
-    await super.test_multiple_ignores_traling();
-  }
-
-  @override
-  @failingTest
-  test_multiple_ignores_whitespace_variant_1() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib4::x in let ...
-    await super.test_multiple_ignores_whitespace_variant_1();
-  }
-
-  @override
-  @failingTest
-  test_multiple_ignores_whitespace_variant_2() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t5 = #lib5::x in let ...
-    await super.test_multiple_ignores_whitespace_variant_2();
-  }
-
-  @override
-  @failingTest
-  test_multiple_ignores_whitespace_variant_3() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t6 = #lib6::x in let ...
-    await super.test_multiple_ignores_whitespace_variant_3();
-  }
-
-  @override
-  @failingTest
   test_no_ignores() async {
     // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
     //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index ad843c2..333ef36 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -12,6 +12,11 @@
   });
 }
 
+/// Tests marked with this annotation fail because of a Fasta problem.
+class FastaProblem {
+  const FastaProblem(String issueUri);
+}
+
 @reflectiveTest
 class HintCodeTest_Kernel extends HintCodeTest_Driver {
   @override
@@ -69,6 +74,27 @@
     return super.test_deadCode_deadFinalStatementInCase();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deadCode_statementAfterAlwaysThrowsFunction() async {
+    await super.test_deadCode_statementAfterAlwaysThrowsFunction();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deadCode_statementAfterAlwaysThrowsMethod() async {
+    await super.test_deadCode_statementAfterAlwaysThrowsMethod();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_assignment() async {
+    await super.test_deprecatedAnnotationUse_assignment();
+  }
+
   @failingTest
   @override
   test_deprecatedAnnotationUse_call() async {
@@ -76,6 +102,13 @@
     return super.test_deprecatedAnnotationUse_call();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_deprecated() async {
+    await super.test_deprecatedAnnotationUse_deprecated();
+  }
+
   @failingTest
   @override
   test_deprecatedAnnotationUse_Deprecated() async {
@@ -85,16 +118,95 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_export() async {
+    await super.test_deprecatedAnnotationUse_export();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_field() async {
+    await super.test_deprecatedAnnotationUse_field();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_getter() async {
+    await super.test_deprecatedAnnotationUse_getter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_import() async {
+    await super.test_deprecatedAnnotationUse_import();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_indexExpression() async {
+    await super.test_deprecatedAnnotationUse_indexExpression();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_instanceCreation() async {
+    await super.test_deprecatedAnnotationUse_instanceCreation();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_instanceCreation_namedConstructor() async {
+    await super
+        .test_deprecatedAnnotationUse_instanceCreation_namedConstructor();
+  }
+
+  @override
+  @failingTest
   test_deprecatedAnnotationUse_named() async {
     return super.test_deprecatedAnnotationUse_named();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_operator() async {
+    await super.test_deprecatedAnnotationUse_operator();
+  }
+
   @failingTest
   @override
   test_deprecatedAnnotationUse_positional() async {
     return super.test_deprecatedAnnotationUse_positional();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_setter() async {
+    await super.test_deprecatedAnnotationUse_setter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_superConstructor() async {
+    await super.test_deprecatedAnnotationUse_superConstructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedAnnotationUse_superConstructor_namedConstructor() async {
+    await super
+        .test_deprecatedAnnotationUse_superConstructor_namedConstructor();
+  }
+
   @failingTest
   @override
   test_deprecatedFunction_class() async {
@@ -150,6 +262,83 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory__expr_return_null_OK() async {
+    await super.test_factory__expr_return_null_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_abstract_OK() async {
+    await super.test_factory_abstract_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_bad_return() async {
+    await super.test_factory_bad_return();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_block_OK() async {
+    await super.test_factory_block_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_block_return_null_OK() async {
+    await super.test_factory_block_return_null_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_expr_OK() async {
+    await super.test_factory_expr_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_misplaced_annotation() async {
+    await super.test_factory_misplaced_annotation();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_no_return_type_OK() async {
+    await super.test_factory_no_return_type_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_subclass_OK() async {
+    await super.test_factory_subclass_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_factory_void_return() async {
+    await super.test_factory_void_return();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidImmutableAnnotation_method() async {
+    await super.test_invalidImmutableAnnotation_method();
+  }
+
+  @override
+  @failingTest
   test_invalidRequiredParam_on_named_parameter_with_default() async {
     return super.test_invalidRequiredParam_on_named_parameter_with_default();
   }
@@ -181,6 +370,223 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_closure() async {
+    await super.test_invalidUseOfProtectedMember_closure();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_field() async {
+    await super.test_invalidUseOfProtectedMember_field();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_field_OK() async {
+    await super.test_invalidUseOfProtectedMember_field_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_function() async {
+    await super.test_invalidUseOfProtectedMember_function();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_function_OK() async {
+    await super.test_invalidUseOfProtectedMember_function_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_function_OK2() async {
+    await super.test_invalidUseOfProtectedMember_function_OK2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_getter() async {
+    await super.test_invalidUseOfProtectedMember_getter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_getter_OK() async {
+    await super.test_invalidUseOfProtectedMember_getter_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_in_docs_OK() async {
+    await super.test_invalidUseOfProtectedMember_in_docs_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_message() async {
+    await super.test_invalidUseOfProtectedMember_message();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_method_1() async {
+    await super.test_invalidUseOfProtectedMember_method_1();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_method_OK() async {
+    await super.test_invalidUseOfProtectedMember_method_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_1() async {
+    await super.test_invalidUseOfProtectedMember_OK_1();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_2() async {
+    await super.test_invalidUseOfProtectedMember_OK_2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_3() async {
+    await super.test_invalidUseOfProtectedMember_OK_3();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_4() async {
+    await super.test_invalidUseOfProtectedMember_OK_4();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_field() async {
+    await super.test_invalidUseOfProtectedMember_OK_field();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_getter() async {
+    await super.test_invalidUseOfProtectedMember_OK_getter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_setter() async {
+    await super.test_invalidUseOfProtectedMember_OK_setter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_OK_setter_2() async {
+    await super.test_invalidUseOfProtectedMember_OK_setter_2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_setter() async {
+    await super.test_invalidUseOfProtectedMember_setter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_setter_OK() async {
+    await super.test_invalidUseOfProtectedMember_setter_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfProtectedMember_topLevelVariable() async {
+    await super.test_invalidUseOfProtectedMember_topLevelVariable();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfVisibleForTestingMember_constructor() async {
+    await super.test_invalidUseOfVisibleForTestingMember_constructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfVisibleForTestingMember_method() async {
+    await super.test_invalidUseOfVisibleForTestingMember_method();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfVisibleForTestingMember_method_OK() async {
+    await super.test_invalidUseOfVisibleForTestingMember_method_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfVisibleForTestingMember_OK_export() async {
+    await super.test_invalidUseOfVisibleForTestingMember_OK_export();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
+    await super.test_invalidUseOfVisibleForTestingMember_propertyAccess();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
+    await super.test_invalidUseOfVisibleForTestingMember_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseProtectedAndForTesting_asProtected_OK() async {
+    await super.test_invalidUseProtectedAndForTesting_asProtected_OK();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUseProtectedAndForTesting_asTesting_OK() async {
+    await super.test_invalidUseProtectedAndForTesting_asTesting_OK();
+  }
+
+  @override
+  @failingTest
   test_isNotDouble() {
     // Bad state: No data for is at 10
     return super.test_isNotDouble();
@@ -235,6 +641,34 @@
     return super.test_missingJsLibAnnotation_variable();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustBeImmutable_direct() async {
+    await super.test_mustBeImmutable_direct();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustBeImmutable_extends() async {
+    await super.test_mustBeImmutable_extends();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustBeImmutable_fromMixin() async {
+    await super.test_mustBeImmutable_fromMixin();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustBeImmutable_instance() async {
+    await super.test_mustBeImmutable_instance();
+  }
+
   @failingTest
   @override
   test_mustCallSuper() async {
@@ -242,6 +676,13 @@
     return super.test_mustCallSuper();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustCallSuper_fromInterface() async {
+    await super.test_mustCallSuper_fromInterface();
+  }
+
   @failingTest
   @override
   test_mustCallSuper_indirect() async {
@@ -249,6 +690,27 @@
     return super.test_mustCallSuper_indirect();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustCallSuper_overridden() async {
+    await super.test_mustCallSuper_overridden();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustCallSuper_overridden_w_future() async {
+    await super.test_mustCallSuper_overridden_w_future();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_mustCallSuper_overridden_w_future2() async {
+    await super.test_mustCallSuper_overridden_w_future2();
+  }
+
   @failingTest
   @override
   test_nullAwareBeforeOperator_ok_is_not() {
@@ -258,6 +720,34 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingField_invalid() async {
+    await super.test_overrideOnNonOverridingField_invalid();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingGetter_invalid() async {
+    await super.test_overrideOnNonOverridingGetter_invalid();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingMethod_invalid() async {
+    await super.test_overrideOnNonOverridingMethod_invalid();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingSetter_invalid() async {
+    await super.test_overrideOnNonOverridingSetter_invalid();
+  }
+
+  @override
+  @failingTest
   test_required_constructor_param() async {
     return super.test_required_constructor_param();
   }
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 2f7a8c9..b080ee6 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -283,6 +283,13 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_instance_creation_inside_annotation() async {
+    return super.test_instance_creation_inside_annotation();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_integerLiteralOutOfRange_negative_valid() async {
     return super.test_integerLiteralOutOfRange_negative_valid();
@@ -306,6 +313,13 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidAnnotation_constantVariable_topLevel() async {
+    return super.test_invalidAnnotation_constantVariable_topLevel();
+  }
+
+  @override
+  @failingTest
   test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
     // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
     // of 'topEntity'
@@ -430,13 +444,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_typeArgument_boundToFunctionType() async {
-    return super.test_typeArgument_boundToFunctionType();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_static_conditionalAccess() {
     // Bad state: No data for A at 36
     return super.test_undefinedGetter_static_conditionalAccess();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 1084149..6a12526 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -5386,7 +5386,7 @@
   }
 
   test_typeArgument_boundToFunctionType() async {
-    Source source = addSource("class A<T extends void Function<T>(T)>{}");
+    Source source = addSource("class A<T extends void Function(T)>{}");
     await computeAnalysisResult(source);
     assertNoErrors(source);
     verify([source]);
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 dc39f65..b3fe456 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -48,11 +48,10 @@
 
   @override
   @failingTest
-  test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() {
-    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
-    // node.parent is EnumConstantDeclaration': is not true.
+  test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
+    // Failed to resolve 1 nodes
     return super
-        .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
   }
 
   @override
@@ -65,10 +64,25 @@
 
   @override
   @failingTest
-  test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
-    // Failed to resolve 1 nodes
+  test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
     return super
-        .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
+        .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedMemberUse_inDeprecatedClass() async {
+    await super.test_deprecatedMemberUse_inDeprecatedClass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedMemberUse_inDeprecatedFunction() async {
+    await super.test_deprecatedMemberUse_inDeprecatedFunction();
   }
 
   @failingTest
@@ -82,6 +96,113 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedMemberUse_inDeprecatedMethod() async {
+    await super.test_deprecatedMemberUse_inDeprecatedMethod();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass() async {
+    await super.test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_missingReturn_alwaysThrows() async {
+    await super.test_missingReturn_alwaysThrows();
+  }
+
+  @override
+  @failingTest
+  test_overrideOnNonOverridingField_inInterface() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    return super.test_overrideOnNonOverridingField_inInterface();
+  }
+
+  @override
+  @failingTest
+  test_overrideOnNonOverridingField_inSuperclass() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+    return super.test_overrideOnNonOverridingField_inSuperclass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingGetter_inInterface() async {
+    await super.test_overrideOnNonOverridingGetter_inInterface();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingGetter_inSuperclass() async {
+    await super.test_overrideOnNonOverridingGetter_inSuperclass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingMethod_inInterface() async {
+    await super.test_overrideOnNonOverridingMethod_inInterface();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingMethod_inSuperclass() async {
+    await super.test_overrideOnNonOverridingMethod_inSuperclass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingMethod_inSuperclass_abstract() async {
+    await super.test_overrideOnNonOverridingMethod_inSuperclass_abstract();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingSetter_inInterface() async {
+    await super.test_overrideOnNonOverridingSetter_inInterface();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_overrideOnNonOverridingSetter_inSuperclass() async {
+    await super.test_overrideOnNonOverridingSetter_inSuperclass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_proxy_annotation_prefixed() async {
+    await super.test_proxy_annotation_prefixed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_proxy_annotation_prefixed2() async {
+    await super.test_proxy_annotation_prefixed2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_proxy_annotation_prefixed3() async {
+    await super.test_proxy_annotation_prefixed3();
+  }
+
+  @override
+  @failingTest
   @notForDart2
   test_undefinedOperator_binaryExpression_inSubtype() async {
     await super.test_undefinedOperator_binaryExpression_inSubtype();
@@ -133,22 +254,6 @@
 //    await super.test_unusedImport_annotationOnDirective();
   }
 
-  @override
-  @failingTest
-  test_overrideOnNonOverridingField_inSuperclass() {
-    // Expected 1 errors of type
-    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    return super.test_overrideOnNonOverridingField_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  test_overrideOnNonOverridingField_inInterface() {
-    // Expected 1 errors of type
-    // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    return super.test_overrideOnNonOverridingField_inInterface();
-  }
-
   @failingTest
   @override
   @potentialAnalyzerProblem
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index a341ce7..9697a3c 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -508,8 +508,8 @@
   }
 
   @override
-  void beginTypeVariable(Token name) {
-    super.beginTypeVariable(name);
+  void beginTypeVariable(Token token) {
+    super.beginTypeVariable(token);
     begin('TypeVariable');
   }
 
@@ -1037,15 +1037,15 @@
   }
 
   @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
     end('TypeVariable');
-    super.endTypeVariable(token, extendsOrSuper);
+    super.endTypeVariable(token, index, extendsOrSuper);
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
+  void endTypeVariables(Token beginToken, Token endToken) {
     end('TypeVariables');
-    super.endTypeVariables(count, beginToken, endToken);
+    super.endTypeVariables(beginToken, endToken);
   }
 
   @override
@@ -1169,4 +1169,9 @@
     expectIn('CompilationUnit');
     listener.handleScript(token);
   }
+
+  @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    listener.handleTypeVariablesDefined(token, count);
+  }
 }
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
deleted file mode 100644
index 7ca4c06..0000000
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ /dev/null
@@ -1,6141 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../src/fasta/body_builder_test_helper.dart';
-import 'parser_test.dart';
-
-main() {
-  return CompilerTestContext.runWithTestOptions((_) {
-    defineReflectiveSuite(() {
-      defineReflectiveTests(ClassMemberParserTest_Forest);
-      defineReflectiveTests(ComplexParserTest_Forest);
-      defineReflectiveTests(ErrorParserTest_Forest);
-      defineReflectiveTests(ExpressionParserTest_Forest);
-      defineReflectiveTests(FormalParameterParserTest_Forest);
-      defineReflectiveTests(RecoveryParserTest_Forest);
-      defineReflectiveTests(SimpleParserTest_Forest);
-      defineReflectiveTests(StatementParserTest_Forest);
-      defineReflectiveTests(TopLevelParserTest_Forest);
-    });
-  });
-}
-
-void dart2Failure() {
-  fail(
-      'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
-}
-
-@reflectiveTest
-class ClassMemberParserTest_Forest extends FastaBodyBuilderTestCase
-    with ClassMemberParserTestMixin {
-  ClassMemberParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_parseAwaitExpression_asStatement_inAsync() {
-    super.test_parseAwaitExpression_asStatement_inAsync();
-  }
-
-  @failingTest
-  void test_parseAwaitExpression_asStatement_inSync() {
-    super.test_parseAwaitExpression_asStatement_inSync();
-  }
-
-  @failingTest
-  void test_parseAwaitExpression_inSync() {
-    super.test_parseAwaitExpression_inSync();
-  }
-
-  @failingTest
-  void test_parseClassMember_constructor_withDocComment() {
-    super.test_parseClassMember_constructor_withDocComment();
-  }
-
-  @failingTest
-  void test_parseClassMember_constructor_withInitializers() {
-    super.test_parseClassMember_constructor_withInitializers();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_covariant() {
-    super.test_parseClassMember_field_covariant();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_generic() {
-    super.test_parseClassMember_field_generic();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_gftType_gftReturnType() {
-    super.test_parseClassMember_field_gftType_gftReturnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_gftType_noReturnType() {
-    super.test_parseClassMember_field_gftType_noReturnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_instance_prefixedType() {
-    super.test_parseClassMember_field_instance_prefixedType();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_namedGet() {
-    super.test_parseClassMember_field_namedGet();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_namedOperator() {
-    super.test_parseClassMember_field_namedOperator();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_namedOperator_withAssignment() {
-    super.test_parseClassMember_field_namedOperator_withAssignment();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_namedSet() {
-    super.test_parseClassMember_field_namedSet();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_nameKeyword() {
-    super.test_parseClassMember_field_nameKeyword();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_nameMissing() {
-    super.test_parseClassMember_field_nameMissing();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_nameMissing2() {
-    super.test_parseClassMember_field_nameMissing2();
-  }
-
-  @failingTest
-  void test_parseClassMember_field_static() {
-    super.test_parseClassMember_field_static();
-  }
-
-  @failingTest
-  void test_parseClassMember_getter_functionType() {
-    super.test_parseClassMember_getter_functionType();
-  }
-
-  @failingTest
-  void test_parseClassMember_getter_void() {
-    super.test_parseClassMember_getter_void();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_external() {
-    super.test_parseClassMember_method_external();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_external_withTypeAndArgs() {
-    super.test_parseClassMember_method_external_withTypeAndArgs();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_comment_noReturnType() {
-    super.test_parseClassMember_method_generic_comment_noReturnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_comment_parameterType() {
-    super.test_parseClassMember_method_generic_comment_parameterType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_comment_returnType() {
-    super.test_parseClassMember_method_generic_comment_returnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_comment_returnType_bound() {
-    super.test_parseClassMember_method_generic_comment_returnType_bound();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_comment_returnType_complex() {
-    super.test_parseClassMember_method_generic_comment_returnType_complex();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_comment_void() {
-    super.test_parseClassMember_method_generic_comment_void();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_noReturnType() {
-    super.test_parseClassMember_method_generic_noReturnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_parameterType() {
-    super.test_parseClassMember_method_generic_parameterType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_returnType() {
-    super.test_parseClassMember_method_generic_returnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_returnType_bound() {
-    super.test_parseClassMember_method_generic_returnType_bound();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_returnType_complex() {
-    super.test_parseClassMember_method_generic_returnType_complex();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_returnType_static() {
-    super.test_parseClassMember_method_generic_returnType_static();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_generic_void() {
-    super.test_parseClassMember_method_generic_void();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_get_noType() {
-    super.test_parseClassMember_method_get_noType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_get_type() {
-    super.test_parseClassMember_method_get_type();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_get_void() {
-    super.test_parseClassMember_method_get_void();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_gftReturnType_noReturnType() {
-    super.test_parseClassMember_method_gftReturnType_noReturnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_gftReturnType_voidReturnType() {
-    super.test_parseClassMember_method_gftReturnType_voidReturnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_native_allowed() {
-    super.test_parseClassMember_method_native_allowed();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_native_missing_literal_allowed() {
-    super.test_parseClassMember_method_native_missing_literal_allowed();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_native_missing_literal_not_allowed() {
-    super.test_parseClassMember_method_native_missing_literal_not_allowed();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_native_not_allowed() {
-    super.test_parseClassMember_method_native_not_allowed();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_native_with_body_allowed() {
-    super.test_parseClassMember_method_native_with_body_allowed();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_native_with_body_not_allowed() {
-    super.test_parseClassMember_method_native_with_body_not_allowed();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_operator_noType() {
-    super.test_parseClassMember_method_operator_noType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_operator_type() {
-    super.test_parseClassMember_method_operator_type();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_operator_void() {
-    super.test_parseClassMember_method_operator_void();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_returnType_functionType() {
-    super.test_parseClassMember_method_returnType_functionType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_returnType_parameterized() {
-    super.test_parseClassMember_method_returnType_parameterized();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_set_noType() {
-    super.test_parseClassMember_method_set_noType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_set_type() {
-    super.test_parseClassMember_method_set_type();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_set_void() {
-    super.test_parseClassMember_method_set_void();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_static_generic_comment_returnType() {
-    super.test_parseClassMember_method_static_generic_comment_returnType();
-  }
-
-  @failingTest
-  void test_parseClassMember_method_trailing_commas() {
-    super.test_parseClassMember_method_trailing_commas();
-  }
-
-  @failingTest
-  void test_parseClassMember_operator_functionType() {
-    super.test_parseClassMember_operator_functionType();
-  }
-
-  @failingTest
-  void test_parseClassMember_operator_index() {
-    super.test_parseClassMember_operator_index();
-  }
-
-  @failingTest
-  void test_parseClassMember_operator_indexAssign() {
-    super.test_parseClassMember_operator_indexAssign();
-  }
-
-  @failingTest
-  void test_parseClassMember_operator_lessThan() {
-    super.test_parseClassMember_operator_lessThan();
-  }
-
-  @failingTest
-  void test_parseClassMember_redirectingFactory_const() {
-    super.test_parseClassMember_redirectingFactory_const();
-  }
-
-  @failingTest
-  void test_parseClassMember_redirectingFactory_expressionBody() {
-    super.test_parseClassMember_redirectingFactory_expressionBody();
-  }
-
-  @failingTest
-  void test_parseClassMember_redirectingFactory_nonConst() {
-    super.test_parseClassMember_redirectingFactory_nonConst();
-  }
-
-  @failingTest
-  void test_parseConstructor_assert() {
-    super.test_parseConstructor_assert();
-  }
-
-  @failingTest
-  void test_parseConstructor_factory_const_external() {
-    super.test_parseConstructor_factory_const_external();
-  }
-
-  @failingTest
-  void test_parseConstructor_factory_named() {
-    super.test_parseConstructor_factory_named();
-  }
-
-  @failingTest
-  void test_parseConstructor_initializers_field() {
-    super.test_parseConstructor_initializers_field();
-  }
-
-  @failingTest
-  void test_parseConstructor_named() {
-    super.test_parseConstructor_named();
-  }
-
-  @failingTest
-  void test_parseConstructor_unnamed() {
-    super.test_parseConstructor_unnamed();
-  }
-
-  @failingTest
-  void test_parseConstructor_with_pseudo_function_literal() {
-    super.test_parseConstructor_with_pseudo_function_literal();
-  }
-
-  @failingTest
-  void test_parseConstructorFieldInitializer_qualified() {
-    super.test_parseConstructorFieldInitializer_qualified();
-  }
-
-  @failingTest
-  void test_parseConstructorFieldInitializer_unqualified() {
-    super.test_parseConstructorFieldInitializer_unqualified();
-  }
-
-  @failingTest
-  void test_parseGetter_nonStatic() {
-    super.test_parseGetter_nonStatic();
-  }
-
-  @failingTest
-  void test_parseGetter_static() {
-    super.test_parseGetter_static();
-  }
-
-  @failingTest
-  void test_parseInitializedIdentifierList_type() {
-    super.test_parseInitializedIdentifierList_type();
-  }
-
-  @failingTest
-  void test_parseInitializedIdentifierList_var() {
-    super.test_parseInitializedIdentifierList_var();
-  }
-
-  @failingTest
-  void test_parseOperator() {
-    super.test_parseOperator();
-  }
-
-  @failingTest
-  void test_parseSetter_nonStatic() {
-    super.test_parseSetter_nonStatic();
-  }
-
-  @failingTest
-  void test_parseSetter_static() {
-    super.test_parseSetter_static();
-  }
-
-  @failingTest
-  void test_simpleFormalParameter_withDocComment() {
-    super.test_simpleFormalParameter_withDocComment();
-  }
-}
-
-@reflectiveTest
-class ComplexParserTest_Forest extends FastaBodyBuilderTestCase
-    with ComplexParserTestMixin {
-  ComplexParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_additiveExpression_normal() {
-    super.test_additiveExpression_normal();
-  }
-
-  @failingTest
-  void test_additiveExpression_noSpaces() {
-    super.test_additiveExpression_noSpaces();
-  }
-
-  @failingTest
-  void test_additiveExpression_precedence_multiplicative_left() {
-    super.test_additiveExpression_precedence_multiplicative_left();
-  }
-
-  @failingTest
-  void test_additiveExpression_precedence_multiplicative_left_withSuper() {
-    super.test_additiveExpression_precedence_multiplicative_left_withSuper();
-  }
-
-  @failingTest
-  void test_additiveExpression_precedence_multiplicative_right() {
-    super.test_additiveExpression_precedence_multiplicative_right();
-  }
-
-  @failingTest
-  void test_additiveExpression_super() {
-    super.test_additiveExpression_super();
-  }
-
-  @failingTest
-  void test_assignableExpression_arguments_normal_chain() {
-    super.test_assignableExpression_arguments_normal_chain();
-  }
-
-  @failingTest
-  void test_assignableExpression_arguments_normal_chain_typeArgumentComments() {
-    super
-        .test_assignableExpression_arguments_normal_chain_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_assignableExpression_arguments_normal_chain_typeArguments() {
-    super.test_assignableExpression_arguments_normal_chain_typeArguments();
-  }
-
-  @failingTest
-  void test_assignmentExpression_compound() {
-    super.test_assignmentExpression_compound();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_assignmentExpression_indexExpression() {
-    super.test_assignmentExpression_indexExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_assignmentExpression_prefixedIdentifier() {
-    super.test_assignmentExpression_prefixedIdentifier();
-  }
-
-  @failingTest
-  void test_assignmentExpression_propertyAccess() {
-    super.test_assignmentExpression_propertyAccess();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_normal() {
-    super.test_bitwiseAndExpression_normal();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_precedence_equality_left() {
-    super.test_bitwiseAndExpression_precedence_equality_left();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_precedence_equality_right() {
-    super.test_bitwiseAndExpression_precedence_equality_right();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_super() {
-    super.test_bitwiseAndExpression_super();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_normal() {
-    super.test_bitwiseOrExpression_normal();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_precedence_xor_left() {
-    super.test_bitwiseOrExpression_precedence_xor_left();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_precedence_xor_right() {
-    super.test_bitwiseOrExpression_precedence_xor_right();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_super() {
-    super.test_bitwiseOrExpression_super();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_normal() {
-    super.test_bitwiseXorExpression_normal();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_precedence_and_left() {
-    super.test_bitwiseXorExpression_precedence_and_left();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_precedence_and_right() {
-    super.test_bitwiseXorExpression_precedence_and_right();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_super() {
-    super.test_bitwiseXorExpression_super();
-  }
-
-  @failingTest
-  void test_cascade_withAssignment() {
-    super.test_cascade_withAssignment();
-  }
-
-  @failingTest
-  void test_conditionalExpression_precedence_ifNullExpression() {
-    super.test_conditionalExpression_precedence_ifNullExpression();
-  }
-
-  @failingTest
-  void test_conditionalExpression_precedence_logicalOrExpression() {
-    super.test_conditionalExpression_precedence_logicalOrExpression();
-  }
-
-  @failingTest
-  void test_conditionalExpression_precedence_nullableType_as() {
-    super.test_conditionalExpression_precedence_nullableType_as();
-  }
-
-  @failingTest
-  void test_conditionalExpression_precedence_nullableType_is() {
-    super.test_conditionalExpression_precedence_nullableType_is();
-  }
-
-  @failingTest
-  void test_constructor_initializer_withParenthesizedExpression() {
-    super.test_constructor_initializer_withParenthesizedExpression();
-  }
-
-  @failingTest
-  void test_equalityExpression_normal() {
-    super.test_equalityExpression_normal();
-  }
-
-  @failingTest
-  void test_equalityExpression_precedence_relational_left() {
-    super.test_equalityExpression_precedence_relational_left();
-  }
-
-  @failingTest
-  void test_equalityExpression_precedence_relational_right() {
-    super.test_equalityExpression_precedence_relational_right();
-  }
-
-  @failingTest
-  void test_equalityExpression_super() {
-    super.test_equalityExpression_super();
-  }
-
-  @failingTest
-  void test_ifNullExpression() {
-    super.test_ifNullExpression();
-  }
-
-  @failingTest
-  void test_ifNullExpression_precedence_logicalOr_left() {
-    super.test_ifNullExpression_precedence_logicalOr_left();
-  }
-
-  @failingTest
-  void test_ifNullExpression_precedence_logicalOr_right() {
-    super.test_ifNullExpression_precedence_logicalOr_right();
-  }
-
-  @failingTest
-  void test_logicalAndExpression() {
-    super.test_logicalAndExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    super.test_logicalAndExpression_precedence_bitwiseOr_left();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    super.test_logicalAndExpression_precedence_bitwiseOr_right();
-  }
-
-  @failingTest
-  void test_logicalAndExpressionStatement() {
-    super.test_logicalAndExpressionStatement();
-  }
-
-  @failingTest
-  void test_logicalOrExpression() {
-    super.test_logicalOrExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_precedence_logicalAnd_left() {
-    super.test_logicalOrExpression_precedence_logicalAnd_left();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_precedence_logicalAnd_right() {
-    super.test_logicalOrExpression_precedence_logicalAnd_right();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_methodInvocation1() {
-    super.test_methodInvocation1();
-  }
-
-  @failingTest
-  void test_methodInvocation2() {
-    super.test_methodInvocation2();
-  }
-
-  @failingTest
-  void test_methodInvocation3() {
-    super.test_methodInvocation3();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_normal() {
-    super.test_multiplicativeExpression_normal();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_precedence_unary_left() {
-    super.test_multiplicativeExpression_precedence_unary_left();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_precedence_unary_right() {
-    super.test_multiplicativeExpression_precedence_unary_right();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_super() {
-    super.test_multiplicativeExpression_super();
-  }
-
-  @failingTest
-  void test_relationalExpression_precedence_shift_right() {
-    super.test_relationalExpression_precedence_shift_right();
-  }
-
-  @failingTest
-  void test_shiftExpression_normal() {
-    super.test_shiftExpression_normal();
-  }
-
-  @failingTest
-  void test_shiftExpression_precedence_additive_left() {
-    super.test_shiftExpression_precedence_additive_left();
-  }
-
-  @failingTest
-  void test_shiftExpression_precedence_additive_right() {
-    super.test_shiftExpression_precedence_additive_right();
-  }
-
-  @failingTest
-  void test_shiftExpression_super() {
-    super.test_shiftExpression_super();
-  }
-
-  @failingTest
-  void test_topLevelFunction_nestedGenericFunction() {
-    super.test_topLevelFunction_nestedGenericFunction();
-  }
-}
-
-@reflectiveTest
-class ErrorParserTest_Forest extends FastaBodyBuilderTestCase
-    with ErrorParserTestMixin {
-  ErrorParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_abstractClassMember_constructor() {
-    super.test_abstractClassMember_constructor();
-  }
-
-  @failingTest
-  void test_abstractClassMember_field() {
-    super.test_abstractClassMember_field();
-  }
-
-  @failingTest
-  void test_abstractClassMember_getter() {
-    super.test_abstractClassMember_getter();
-  }
-
-  @failingTest
-  void test_abstractClassMember_method() {
-    super.test_abstractClassMember_method();
-  }
-
-  @failingTest
-  void test_abstractClassMember_setter() {
-    super.test_abstractClassMember_setter();
-  }
-
-  @failingTest
-  void test_abstractEnum() {
-    super.test_abstractEnum();
-  }
-
-  @failingTest
-  void test_abstractTopLevelFunction_function() {
-    super.test_abstractTopLevelFunction_function();
-  }
-
-  @failingTest
-  void test_abstractTopLevelFunction_getter() {
-    super.test_abstractTopLevelFunction_getter();
-  }
-
-  @failingTest
-  void test_abstractTopLevelFunction_setter() {
-    super.test_abstractTopLevelFunction_setter();
-  }
-
-  @failingTest
-  void test_abstractTopLevelVariable() {
-    super.test_abstractTopLevelVariable();
-  }
-
-  @failingTest
-  void test_abstractTypeDef() {
-    super.test_abstractTypeDef();
-  }
-
-  @failingTest
-  void test_breakOutsideOfLoop_breakInForStatement() {
-    super.test_breakOutsideOfLoop_breakInForStatement();
-  }
-
-  @failingTest
-  void test_breakOutsideOfLoop_breakInIfStatement() {
-    super.test_breakOutsideOfLoop_breakInIfStatement();
-  }
-
-  @failingTest
-  void test_breakOutsideOfLoop_breakInSwitchStatement() {
-    super.test_breakOutsideOfLoop_breakInSwitchStatement();
-  }
-
-  @failingTest
-  void test_breakOutsideOfLoop_functionExpression_inALoop() {
-    super.test_breakOutsideOfLoop_functionExpression_inALoop();
-  }
-
-  @failingTest
-  void test_breakOutsideOfLoop_functionExpression_withALoop() {
-    super.test_breakOutsideOfLoop_functionExpression_withALoop();
-  }
-
-  @failingTest
-  void test_classInClass_abstract() {
-    super.test_classInClass_abstract();
-  }
-
-  @failingTest
-  void test_classInClass_nonAbstract() {
-    super.test_classInClass_nonAbstract();
-  }
-
-  @failingTest
-  void test_classTypeAlias_abstractAfterEq() {
-    super.test_classTypeAlias_abstractAfterEq();
-  }
-
-  @failingTest
-  void test_colonInPlaceOfIn() {
-    super.test_colonInPlaceOfIn();
-  }
-
-  @failingTest
-  void test_constAndCovariant() {
-    super.test_constAndCovariant();
-  }
-
-  @failingTest
-  void test_constAndFinal() {
-    super.test_constAndFinal();
-  }
-
-  @failingTest
-  void test_constAndVar() {
-    super.test_constAndVar();
-  }
-
-  @failingTest
-  void test_constClass() {
-    super.test_constClass();
-  }
-
-  @failingTest
-  void test_constConstructorWithBody() {
-    super.test_constConstructorWithBody();
-  }
-
-  @failingTest
-  void test_constEnum() {
-    super.test_constEnum();
-  }
-
-  @failingTest
-  void test_constFactory() {
-    super.test_constFactory();
-  }
-
-  @failingTest
-  void test_constMethod() {
-    super.test_constMethod();
-  }
-
-  @failingTest
-  void test_constructorPartial() {
-    super.test_constructorPartial();
-  }
-
-  @failingTest
-  void test_constructorPartial2() {
-    super.test_constructorPartial();
-  }
-
-  @failingTest
-  void test_constructorPartial3() {
-    super.test_constructorPartial();
-  }
-
-  @failingTest
-  void test_constructorWithReturnType() {
-    super.test_constructorWithReturnType();
-  }
-
-  @failingTest
-  void test_constructorWithReturnType_var() {
-    super.test_constructorWithReturnType_var();
-  }
-
-  @failingTest
-  void test_constTypedef() {
-    super.test_constTypedef();
-  }
-
-  @failingTest
-  void test_continueOutsideOfLoop_continueInForStatement() {
-    super.test_continueOutsideOfLoop_continueInForStatement();
-  }
-
-  @failingTest
-  void test_continueOutsideOfLoop_continueInIfStatement() {
-    super.test_continueOutsideOfLoop_continueInIfStatement();
-  }
-
-  @failingTest
-  void test_continueOutsideOfLoop_continueInSwitchStatement() {
-    super.test_continueOutsideOfLoop_continueInSwitchStatement();
-  }
-
-  @failingTest
-  void test_continueOutsideOfLoop_functionExpression_inALoop() {
-    super.test_continueOutsideOfLoop_functionExpression_inALoop();
-  }
-
-  @failingTest
-  void test_continueOutsideOfLoop_functionExpression_withALoop() {
-    super.test_continueOutsideOfLoop_functionExpression_withALoop();
-  }
-
-  @failingTest
-  void test_continueWithoutLabelInCase_error() {
-    super.test_continueWithoutLabelInCase_error();
-  }
-
-  @failingTest
-  void test_continueWithoutLabelInCase_noError() {
-    super.test_continueWithoutLabelInCase_noError();
-  }
-
-  @failingTest
-  void test_continueWithoutLabelInCase_noError_switchInLoop() {
-    super.test_continueWithoutLabelInCase_noError_switchInLoop();
-  }
-
-  @failingTest
-  void test_covariantAfterVar() {
-    super.test_covariantAfterVar();
-  }
-
-  @failingTest
-  void test_covariantAndFinal() {
-    super.test_covariantAndFinal();
-  }
-
-  @failingTest
-  void test_covariantAndStatic() {
-    super.test_covariantAndStatic();
-  }
-
-  @failingTest
-  void test_covariantAndType_local() {
-    super.test_covariantAndType_local();
-  }
-
-  @failingTest
-  void test_covariantConstructor() {
-    super.test_covariantConstructor();
-  }
-
-  @failingTest
-  void test_covariantMember_getter_noReturnType() {
-    super.test_covariantMember_getter_noReturnType();
-  }
-
-  @failingTest
-  void test_covariantMember_getter_returnType() {
-    super.test_covariantMember_getter_returnType();
-  }
-
-  @failingTest
-  void test_covariantMember_method() {
-    super.test_covariantMember_method();
-  }
-
-  @failingTest
-  void test_covariantTopLevelDeclaration_class() {
-    super.test_covariantTopLevelDeclaration_class();
-  }
-
-  @failingTest
-  void test_covariantTopLevelDeclaration_enum() {
-    super.test_covariantTopLevelDeclaration_enum();
-  }
-
-  @failingTest
-  void test_covariantTopLevelDeclaration_typedef() {
-    super.test_covariantTopLevelDeclaration_typedef();
-  }
-
-  @failingTest
-  void test_defaultValueInFunctionType_named_colon() {
-    super.test_defaultValueInFunctionType_named_colon();
-  }
-
-  @failingTest
-  void test_defaultValueInFunctionType_named_equal() {
-    super.test_defaultValueInFunctionType_named_equal();
-  }
-
-  @failingTest
-  void test_defaultValueInFunctionType_positional() {
-    super.test_defaultValueInFunctionType_positional();
-  }
-
-  @failingTest
-  void test_directiveAfterDeclaration_classBeforeDirective() {
-    super.test_directiveAfterDeclaration_classBeforeDirective();
-  }
-
-  @failingTest
-  void test_directiveAfterDeclaration_classBetweenDirectives() {
-    super.test_directiveAfterDeclaration_classBetweenDirectives();
-  }
-
-  @failingTest
-  void test_duplicatedModifier_const() {
-    super.test_duplicatedModifier_const();
-  }
-
-  @failingTest
-  void test_duplicatedModifier_external() {
-    super.test_duplicatedModifier_external();
-  }
-
-  @failingTest
-  void test_duplicatedModifier_factory() {
-    super.test_duplicatedModifier_factory();
-  }
-
-  @failingTest
-  void test_duplicatedModifier_final() {
-    super.test_duplicatedModifier_final();
-  }
-
-  @failingTest
-  void test_duplicatedModifier_static() {
-    super.test_duplicatedModifier_static();
-  }
-
-  @failingTest
-  void test_duplicatedModifier_var() {
-    super.test_duplicatedModifier_var();
-  }
-
-  @failingTest
-  void test_duplicateLabelInSwitchStatement() {
-    super.test_duplicateLabelInSwitchStatement();
-  }
-
-  @failingTest
-  void test_emptyEnumBody() {
-    super.test_emptyEnumBody();
-  }
-
-  @failingTest
-  void test_enumInClass() {
-    super.test_enumInClass();
-  }
-
-  @failingTest
-  void test_equalityCannotBeEqualityOperand_eq_eq() {
-    super.test_equalityCannotBeEqualityOperand_eq_eq();
-  }
-
-  @failingTest
-  void test_equalityCannotBeEqualityOperand_eq_neq() {
-    super.test_equalityCannotBeEqualityOperand_eq_neq();
-  }
-
-  @failingTest
-  void test_equalityCannotBeEqualityOperand_neq_eq() {
-    super.test_equalityCannotBeEqualityOperand_neq_eq();
-  }
-
-  @failingTest
-  void test_expectedCaseOrDefault() {
-    super.test_expectedCaseOrDefault();
-  }
-
-  @failingTest
-  void test_expectedClassMember_inClass_afterType() {
-    super.test_expectedClassMember_inClass_afterType();
-  }
-
-  @failingTest
-  void test_expectedClassMember_inClass_beforeType() {
-    super.test_expectedClassMember_inClass_beforeType();
-  }
-
-  @failingTest
-  void test_expectedExecutable_afterAnnotation_atEOF() {
-    super.test_expectedExecutable_afterAnnotation_atEOF();
-  }
-
-  @failingTest
-  void test_expectedExecutable_inClass_afterVoid() {
-    super.test_expectedExecutable_inClass_afterVoid();
-  }
-
-  @failingTest
-  void test_expectedExecutable_topLevel_afterType() {
-    super.test_expectedExecutable_topLevel_afterType();
-  }
-
-  @failingTest
-  void test_expectedExecutable_topLevel_afterVoid() {
-    super.test_expectedExecutable_topLevel_afterVoid();
-  }
-
-  @failingTest
-  void test_expectedExecutable_topLevel_beforeType() {
-    super.test_expectedExecutable_topLevel_beforeType();
-  }
-
-  @failingTest
-  void test_expectedExecutable_topLevel_eof() {
-    super.test_expectedExecutable_topLevel_eof();
-  }
-
-  @failingTest
-  void test_expectedInterpolationIdentifier() {
-    super.test_expectedInterpolationIdentifier();
-  }
-
-  @failingTest
-  void test_expectedInterpolationIdentifier_emptyString() {
-    super.test_expectedInterpolationIdentifier_emptyString();
-  }
-
-  @failingTest
-  void test_expectedListOrMapLiteral() {
-    super.test_expectedListOrMapLiteral();
-  }
-
-  @failingTest
-  void test_expectedStringLiteral() {
-    super.test_expectedStringLiteral();
-  }
-
-  @failingTest
-  void test_expectedToken_commaMissingInArgumentList() {
-    super.test_expectedToken_commaMissingInArgumentList();
-  }
-
-  @failingTest
-  void test_expectedToken_parseStatement_afterVoid() {
-    super.test_expectedToken_parseStatement_afterVoid();
-  }
-
-  @failingTest
-  void test_expectedToken_semicolonMissingAfterExport() {
-    super.test_expectedToken_semicolonMissingAfterExport();
-  }
-
-  @failingTest
-  void test_expectedToken_semicolonMissingAfterExpression() {
-    super.test_expectedToken_semicolonMissingAfterExpression();
-  }
-
-  @failingTest
-  void test_expectedToken_semicolonMissingAfterImport() {
-    super.test_expectedToken_semicolonMissingAfterImport();
-  }
-
-  @failingTest
-  void test_expectedToken_uriAndSemicolonMissingAfterExport() {
-    super.test_expectedToken_uriAndSemicolonMissingAfterExport();
-  }
-
-  @failingTest
-  void test_expectedToken_whileMissingInDoStatement() {
-    super.test_expectedToken_whileMissingInDoStatement();
-  }
-
-  @failingTest
-  void test_expectedTypeName_as() {
-    super.test_expectedTypeName_as();
-  }
-
-  @failingTest
-  void test_expectedTypeName_as_void() {
-    super.test_expectedTypeName_as_void();
-  }
-
-  @failingTest
-  void test_expectedTypeName_is() {
-    super.test_expectedTypeName_is();
-  }
-
-  @failingTest
-  void test_expectedTypeName_is_void() {
-    super.test_expectedTypeName_is_void();
-  }
-
-  @failingTest
-  void test_exportAsType() {
-    super.test_exportAsType();
-  }
-
-  @failingTest
-  void test_exportAsType_inClass() {
-    super.test_exportAsType_inClass();
-  }
-
-  @failingTest
-  void test_exportDirectiveAfterPartDirective() {
-    super.test_exportDirectiveAfterPartDirective();
-  }
-
-  @failingTest
-  void test_externalAfterConst() {
-    super.test_externalAfterConst();
-  }
-
-  @failingTest
-  void test_externalAfterFactory() {
-    super.test_externalAfterFactory();
-  }
-
-  @failingTest
-  void test_externalAfterStatic() {
-    super.test_externalAfterStatic();
-  }
-
-  @failingTest
-  void test_externalClass() {
-    super.test_externalClass();
-  }
-
-  @failingTest
-  void test_externalConstructorWithBody_factory() {
-    super.test_externalConstructorWithBody_factory();
-  }
-
-  @failingTest
-  void test_externalConstructorWithBody_named() {
-    super.test_externalConstructorWithBody_named();
-  }
-
-  @failingTest
-  void test_externalEnum() {
-    super.test_externalEnum();
-  }
-
-  @failingTest
-  void test_externalField_const() {
-    super.test_externalField_const();
-  }
-
-  @failingTest
-  void test_externalField_final() {
-    super.test_externalField_final();
-  }
-
-  @failingTest
-  void test_externalField_static() {
-    super.test_externalField_static();
-  }
-
-  @failingTest
-  void test_externalField_typed() {
-    super.test_externalField_typed();
-  }
-
-  @failingTest
-  void test_externalField_untyped() {
-    super.test_externalField_untyped();
-  }
-
-  @failingTest
-  void test_externalGetterWithBody() {
-    super.test_externalGetterWithBody();
-  }
-
-  @failingTest
-  void test_externalMethodWithBody() {
-    super.test_externalMethodWithBody();
-  }
-
-  @failingTest
-  void test_externalOperatorWithBody() {
-    super.test_externalOperatorWithBody();
-  }
-
-  @failingTest
-  void test_externalSetterWithBody() {
-    super.test_externalSetterWithBody();
-  }
-
-  @failingTest
-  void test_externalTypedef() {
-    super.test_externalTypedef();
-  }
-
-  @failingTest
-  void test_extraCommaInParameterList() {
-    super.test_extraCommaInParameterList();
-  }
-
-  @failingTest
-  void test_extraCommaTrailingNamedParameterGroup() {
-    super.test_extraCommaTrailingNamedParameterGroup();
-  }
-
-  @failingTest
-  void test_extraCommaTrailingPositionalParameterGroup() {
-    super.test_extraCommaTrailingPositionalParameterGroup();
-  }
-
-  @failingTest
-  void test_extraTrailingCommaInParameterList() {
-    super.test_extraTrailingCommaInParameterList();
-  }
-
-  @failingTest
-  void test_factoryTopLevelDeclaration_class() {
-    super.test_factoryTopLevelDeclaration_class();
-  }
-
-  @failingTest
-  void test_factoryTopLevelDeclaration_enum() {
-    super.test_factoryTopLevelDeclaration_enum();
-  }
-
-  @failingTest
-  void test_factoryTopLevelDeclaration_typedef() {
-    super.test_factoryTopLevelDeclaration_typedef();
-  }
-
-  @failingTest
-  void test_factoryWithInitializers() {
-    super.test_factoryWithInitializers();
-  }
-
-  @failingTest
-  void test_factoryWithoutBody() {
-    super.test_factoryWithoutBody();
-  }
-
-  @failingTest
-  void test_fieldInitializerOutsideConstructor() {
-    super.test_fieldInitializerOutsideConstructor();
-  }
-
-  @failingTest
-  void test_finalAndCovariant() {
-    super.test_finalAndCovariant();
-  }
-
-  @failingTest
-  void test_finalAndVar() {
-    super.test_finalAndVar();
-  }
-
-  @failingTest
-  void test_finalClass() {
-    super.test_finalClass();
-  }
-
-  @failingTest
-  void test_finalClassMember_modifierOnly() {
-    super.test_finalClassMember_modifierOnly();
-  }
-
-  @failingTest
-  void test_finalConstructor() {
-    super.test_finalConstructor();
-  }
-
-  @failingTest
-  void test_finalEnum() {
-    super.test_finalEnum();
-  }
-
-  @failingTest
-  void test_finalMethod() {
-    super.test_finalMethod();
-  }
-
-  @failingTest
-  void test_finalTypedef() {
-    super.test_finalTypedef();
-  }
-
-  @failingTest
-  void test_functionTypedField_invalidType_abstract() {
-    super.test_functionTypedField_invalidType_abstract();
-  }
-
-  @failingTest
-  void test_functionTypedField_invalidType_class() {
-    super.test_functionTypedField_invalidType_class();
-  }
-
-  @failingTest
-  void test_functionTypedParameter_const() {
-    super.test_functionTypedParameter_const();
-  }
-
-  @failingTest
-  void test_functionTypedParameter_final() {
-    super.test_functionTypedParameter_final();
-  }
-
-  @failingTest
-  void test_functionTypedParameter_incomplete1() {
-    super.test_functionTypedParameter_incomplete1();
-  }
-
-  @failingTest
-  void test_functionTypedParameter_var() {
-    super.test_functionTypedParameter_var();
-  }
-
-  @failingTest
-  void test_genericFunctionType_asIdentifier() {
-    super.test_genericFunctionType_asIdentifier();
-  }
-
-  @failingTest
-  void test_genericFunctionType_asIdentifier2() {
-    super.test_genericFunctionType_asIdentifier2();
-  }
-
-  @failingTest
-  void test_genericFunctionType_asIdentifier3() {
-    super.test_genericFunctionType_asIdentifier3();
-  }
-
-  @failingTest
-  void test_genericFunctionType_extraLessThan() {
-    super.test_genericFunctionType_extraLessThan();
-  }
-
-  @failingTest
-  void test_getterInFunction_block_noReturnType() {
-    super.test_getterInFunction_block_noReturnType();
-  }
-
-  @failingTest
-  void test_getterInFunction_block_returnType() {
-    super.test_getterInFunction_block_returnType();
-  }
-
-  @failingTest
-  void test_getterInFunction_expression_noReturnType() {
-    super.test_getterInFunction_expression_noReturnType();
-  }
-
-  @failingTest
-  void test_getterInFunction_expression_returnType() {
-    super.test_getterInFunction_expression_returnType();
-  }
-
-  @failingTest
-  void test_getterWithParameters() {
-    super.test_getterWithParameters();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_assign_int() {
-    super.test_illegalAssignmentToNonAssignable_assign_int();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_assign_this() {
-    super.test_illegalAssignmentToNonAssignable_assign_this();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal() {
-    super.test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal() {
-    super.test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_parenthesized() {
-    super
-        .test_illegalAssignmentToNonAssignable_postfix_plusPlus_parenthesized();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() {
-    super.test_illegalAssignmentToNonAssignable_primarySelectorPostfix();
-  }
-
-  @failingTest
-  void test_illegalAssignmentToNonAssignable_superAssigned() {
-    super.test_illegalAssignmentToNonAssignable_superAssigned();
-  }
-
-  @failingTest
-  void test_implementsBeforeExtends() {
-    super.test_implementsBeforeExtends();
-  }
-
-  @failingTest
-  void test_implementsBeforeWith() {
-    super.test_implementsBeforeWith();
-  }
-
-  @failingTest
-  void test_importDirectiveAfterPartDirective() {
-    super.test_importDirectiveAfterPartDirective();
-  }
-
-  @failingTest
-  void test_initializedVariableInForEach() {
-    super.test_initializedVariableInForEach();
-  }
-
-  @failingTest
-  void test_initializedVariableInForEach_annotation() {
-    super.test_initializedVariableInForEach_annotation();
-  }
-
-  @failingTest
-  void test_initializedVariableInForEach_localFunction() {
-    super.test_initializedVariableInForEach_localFunction();
-  }
-
-  @failingTest
-  void test_initializedVariableInForEach_localFunction2() {
-    super.test_initializedVariableInForEach_localFunction2();
-  }
-
-  @failingTest
-  void test_initializedVariableInForEach_var() {
-    super.test_initializedVariableInForEach_var();
-  }
-
-  @failingTest
-  void test_invalidAwaitInFor() {
-    super.test_invalidAwaitInFor();
-  }
-
-  @failingTest
-  void test_invalidCommentReference__new_nonIdentifier() {
-    super.test_invalidCommentReference__new_nonIdentifier();
-  }
-
-  @failingTest
-  void test_invalidCommentReference__new_tooMuch() {
-    super.test_invalidCommentReference__new_tooMuch();
-  }
-
-  @failingTest
-  void test_invalidCommentReference__nonNew_nonIdentifier() {
-    super.test_invalidCommentReference__nonNew_nonIdentifier();
-  }
-
-  @failingTest
-  void test_invalidCommentReference__nonNew_tooMuch() {
-    super.test_invalidCommentReference__nonNew_tooMuch();
-  }
-
-  @failingTest
-  void test_invalidConstructorName_star() {
-    super.test_invalidConstructorName_star();
-  }
-
-  @failingTest
-  void test_invalidConstructorName_with() {
-    super.test_invalidConstructorName_with();
-  }
-
-  @failingTest
-  void test_invalidInterpolationIdentifier_startWithDigit() {
-    super.test_invalidInterpolationIdentifier_startWithDigit();
-  }
-
-  @failingTest
-  void test_invalidLiteralInConfiguration() {
-    super.test_invalidLiteralInConfiguration();
-  }
-
-  @failingTest
-  void test_invalidOperator() {
-    super.test_invalidOperator();
-  }
-
-  @failingTest
-  void test_invalidOperator_unary() {
-    super.test_invalidOperator_unary();
-  }
-
-  @failingTest
-  void test_invalidOperatorAfterSuper_assignableExpression() {
-    super.test_invalidOperatorAfterSuper_assignableExpression();
-  }
-
-  @failingTest
-  void test_invalidOperatorAfterSuper_primaryExpression() {
-    super.test_invalidOperatorAfterSuper_primaryExpression();
-  }
-
-  @failingTest
-  void test_invalidOperatorForSuper() {
-    super.test_invalidOperatorForSuper();
-  }
-
-  @failingTest
-  void test_invalidStarAfterAsync() {
-    super.test_invalidStarAfterAsync();
-  }
-
-  @failingTest
-  void test_invalidSync() {
-    super.test_invalidSync();
-  }
-
-  @failingTest
-  void test_invalidTopLevelSetter() {
-    super.test_invalidTopLevelSetter();
-  }
-
-  @failingTest
-  void test_invalidTopLevelVar() {
-    super.test_invalidTopLevelVar();
-  }
-
-  @failingTest
-  void test_invalidTypedef() {
-    super.test_invalidTypedef();
-  }
-
-  @failingTest
-  void test_invalidTypedef2() {
-    super.test_invalidTypedef2();
-  }
-
-  @failingTest
-  void test_invalidUnicodeEscape_incomplete_noDigits() {
-    super.test_invalidUnicodeEscape_incomplete_noDigits();
-  }
-
-  @failingTest
-  void test_invalidUnicodeEscape_incomplete_someDigits() {
-    super.test_invalidUnicodeEscape_incomplete_someDigits();
-  }
-
-  @failingTest
-  void test_invalidUnicodeEscape_invalidDigit() {
-    super.test_invalidUnicodeEscape_invalidDigit();
-  }
-
-  @failingTest
-  void test_invalidUnicodeEscape_tooFewDigits_fixed() {
-    super.test_invalidUnicodeEscape_tooFewDigits_fixed();
-  }
-
-  @failingTest
-  void test_invalidUnicodeEscape_tooFewDigits_variable() {
-    super.test_invalidUnicodeEscape_tooFewDigits_variable();
-  }
-
-  @failingTest
-  void test_invalidUnicodeEscape_tooManyDigits_variable() {
-    super.test_invalidUnicodeEscape_tooManyDigits_variable();
-  }
-
-  @failingTest
-  void test_libraryDirectiveNotFirst() {
-    super.test_libraryDirectiveNotFirst();
-  }
-
-  @failingTest
-  void test_libraryDirectiveNotFirst_afterPart() {
-    super.test_libraryDirectiveNotFirst_afterPart();
-  }
-
-  @failingTest
-  void test_localFunction_annotation() {
-    super.test_localFunction_annotation();
-  }
-
-  @failingTest
-  void test_localFunctionDeclarationModifier_abstract() {
-    super.test_localFunctionDeclarationModifier_abstract();
-  }
-
-  @failingTest
-  void test_localFunctionDeclarationModifier_external() {
-    super.test_localFunctionDeclarationModifier_external();
-  }
-
-  @failingTest
-  void test_localFunctionDeclarationModifier_factory() {
-    super.test_localFunctionDeclarationModifier_factory();
-  }
-
-  @failingTest
-  void test_localFunctionDeclarationModifier_static() {
-    super.test_localFunctionDeclarationModifier_static();
-  }
-
-  @failingTest
-  void test_method_invalidTypeParameterComments() {
-    super.test_method_invalidTypeParameterComments();
-  }
-
-  @failingTest
-  void test_method_invalidTypeParameterExtends() {
-    super.test_method_invalidTypeParameterExtends();
-  }
-
-  @failingTest
-  void test_method_invalidTypeParameterExtendsComment() {
-    super.test_method_invalidTypeParameterExtendsComment();
-  }
-
-  @failingTest
-  void test_method_invalidTypeParameters() {
-    super.test_method_invalidTypeParameters();
-  }
-
-  @failingTest
-  void test_missingAssignableSelector_identifiersAssigned() {
-    super.test_missingAssignableSelector_identifiersAssigned();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_missingAssignableSelector_prefix_minusMinus_literal() {
-    super.test_missingAssignableSelector_prefix_minusMinus_literal();
-  }
-
-  @failingTest
-  void test_missingAssignableSelector_prefix_plusPlus_literal() {
-    super.test_missingAssignableSelector_prefix_plusPlus_literal();
-  }
-
-  @failingTest
-  void test_missingAssignableSelector_selector() {
-    super.test_missingAssignableSelector_selector();
-  }
-
-  @failingTest
-  void test_missingAssignableSelector_superPrimaryExpression() {
-    super.test_missingAssignableSelector_superPrimaryExpression();
-  }
-
-  @failingTest
-  void test_missingAssignableSelector_superPropertyAccessAssigned() {
-    super.test_missingAssignableSelector_superPropertyAccessAssigned();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_missingCatchOrFinally() {
-    super.test_missingCatchOrFinally();
-  }
-
-  @failingTest
-  void test_missingClassBody() {
-    super.test_missingClassBody();
-  }
-
-  @failingTest
-  void test_missingClosingParenthesis() {
-    super.test_missingClosingParenthesis();
-  }
-
-  @failingTest
-  void test_missingConstFinalVarOrType_static() {
-    super.test_missingConstFinalVarOrType_static();
-  }
-
-  @failingTest
-  void test_missingConstFinalVarOrType_topLevel() {
-    super.test_missingConstFinalVarOrType_topLevel();
-  }
-
-  @failingTest
-  void test_missingEnumBody() {
-    super.test_missingEnumBody();
-  }
-
-  @failingTest
-  void test_missingEnumComma() {
-    super.test_missingEnumComma();
-  }
-
-  @failingTest
-  void test_missingExpressionInThrow() {
-    super.test_missingExpressionInThrow();
-  }
-
-  @failingTest
-  void test_missingFunctionBody_emptyNotAllowed() {
-    super.test_missingFunctionBody_emptyNotAllowed();
-  }
-
-  @failingTest
-  void test_missingFunctionBody_invalid() {
-    super.test_missingFunctionBody_invalid();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_local_nonVoid_block() {
-    super.test_missingFunctionParameters_local_nonVoid_block();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_local_nonVoid_expression() {
-    super.test_missingFunctionParameters_local_nonVoid_expression();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_local_void_block() {
-    super.test_missingFunctionParameters_local_void_block();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_local_void_expression() {
-    super.test_missingFunctionParameters_local_void_expression();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_topLevel_nonVoid_block() {
-    super.test_missingFunctionParameters_topLevel_nonVoid_block();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_topLevel_nonVoid_expression() {
-    super.test_missingFunctionParameters_topLevel_nonVoid_expression();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_topLevel_void_block() {
-    super.test_missingFunctionParameters_topLevel_void_block();
-  }
-
-  @failingTest
-  void test_missingFunctionParameters_topLevel_void_expression() {
-    super.test_missingFunctionParameters_topLevel_void_expression();
-  }
-
-  @failingTest
-  void test_missingIdentifier_afterOperator() {
-    super.test_missingIdentifier_afterOperator();
-  }
-
-  @failingTest
-  void test_missingIdentifier_beforeClosingCurly() {
-    super.test_missingIdentifier_beforeClosingCurly();
-  }
-
-  @failingTest
-  void test_missingIdentifier_inEnum() {
-    super.test_missingIdentifier_inEnum();
-  }
-
-  @failingTest
-  void test_missingIdentifier_inParameterGroupNamed() {
-    super.test_missingIdentifier_inParameterGroupNamed();
-  }
-
-  @failingTest
-  void test_missingIdentifier_inParameterGroupOptional() {
-    super.test_missingIdentifier_inParameterGroupOptional();
-  }
-
-  @failingTest
-  void test_missingIdentifier_inSymbol_afterPeriod() {
-    super.test_missingIdentifier_inSymbol_afterPeriod();
-  }
-
-  @failingTest
-  void test_missingIdentifier_inSymbol_first() {
-    super.test_missingIdentifier_inSymbol_first();
-  }
-
-  @failingTest
-  void test_missingIdentifierForParameterGroup() {
-    super.test_missingIdentifierForParameterGroup();
-  }
-
-  @failingTest
-  void test_missingKeywordOperator() {
-    super.test_missingKeywordOperator();
-  }
-
-  @failingTest
-  void test_missingKeywordOperator_parseClassMember() {
-    super.test_missingKeywordOperator_parseClassMember();
-  }
-
-  @failingTest
-  void test_missingKeywordOperator_parseClassMember_afterTypeName() {
-    super.test_missingKeywordOperator_parseClassMember_afterTypeName();
-  }
-
-  @failingTest
-  void test_missingKeywordOperator_parseClassMember_afterVoid() {
-    super.test_missingKeywordOperator_parseClassMember_afterVoid();
-  }
-
-  @failingTest
-  void test_missingMethodParameters_void_block() {
-    super.test_missingMethodParameters_void_block();
-  }
-
-  @failingTest
-  void test_missingMethodParameters_void_expression() {
-    super.test_missingMethodParameters_void_expression();
-  }
-
-  @failingTest
-  void test_missingNameForNamedParameter_colon() {
-    super.test_missingNameForNamedParameter_colon();
-  }
-
-  @failingTest
-  void test_missingNameForNamedParameter_equals() {
-    super.test_missingNameForNamedParameter_equals();
-  }
-
-  @failingTest
-  void test_missingNameForNamedParameter_noDefault() {
-    super.test_missingNameForNamedParameter_noDefault();
-  }
-
-  @failingTest
-  void test_missingNameInLibraryDirective() {
-    super.test_missingNameInLibraryDirective();
-  }
-
-  @failingTest
-  void test_missingNameInPartOfDirective() {
-    super.test_missingNameInPartOfDirective();
-  }
-
-  @failingTest
-  void test_missingPrefixInDeferredImport() {
-    super.test_missingPrefixInDeferredImport();
-  }
-
-  @failingTest
-  void test_missingStartAfterSync() {
-    super.test_missingStartAfterSync();
-  }
-
-  @failingTest
-  void test_missingStatement() {
-    super.test_missingStatement();
-  }
-
-  @failingTest
-  void test_missingStatement_afterVoid() {
-    super.test_missingStatement_afterVoid();
-  }
-
-  @failingTest
-  void test_missingTerminatorForParameterGroup_named() {
-    super.test_missingTerminatorForParameterGroup_named();
-  }
-
-  @failingTest
-  void test_missingTerminatorForParameterGroup_optional() {
-    super.test_missingTerminatorForParameterGroup_optional();
-  }
-
-  @failingTest
-  void test_missingTypedefParameters_nonVoid() {
-    super.test_missingTypedefParameters_nonVoid();
-  }
-
-  @failingTest
-  void test_missingTypedefParameters_typeParameters() {
-    super.test_missingTypedefParameters_typeParameters();
-  }
-
-  @failingTest
-  void test_missingTypedefParameters_void() {
-    super.test_missingTypedefParameters_void();
-  }
-
-  @failingTest
-  void test_missingVariableInForEach() {
-    super.test_missingVariableInForEach();
-  }
-
-  @failingTest
-  void test_mixedParameterGroups_namedPositional() {
-    super.test_mixedParameterGroups_namedPositional();
-  }
-
-  @failingTest
-  void test_mixedParameterGroups_positionalNamed() {
-    super.test_mixedParameterGroups_positionalNamed();
-  }
-
-  @failingTest
-  void test_mixin_application_lacks_with_clause() {
-    super.test_mixin_application_lacks_with_clause();
-  }
-
-  @failingTest
-  void test_multipleExtendsClauses() {
-    super.test_multipleExtendsClauses();
-  }
-
-  @failingTest
-  void test_multipleImplementsClauses() {
-    super.test_multipleImplementsClauses();
-  }
-
-  @failingTest
-  void test_multipleLibraryDirectives() {
-    super.test_multipleLibraryDirectives();
-  }
-
-  @failingTest
-  void test_multipleNamedParameterGroups() {
-    super.test_multipleNamedParameterGroups();
-  }
-
-  @failingTest
-  void test_multiplePartOfDirectives() {
-    super.test_multiplePartOfDirectives();
-  }
-
-  @failingTest
-  void test_multiplePositionalParameterGroups() {
-    super.test_multiplePositionalParameterGroups();
-  }
-
-  @failingTest
-  void test_multipleVariablesInForEach() {
-    super.test_multipleVariablesInForEach();
-  }
-
-  @failingTest
-  void test_multipleWithClauses() {
-    super.test_multipleWithClauses();
-  }
-
-  @failingTest
-  void test_namedFunctionExpression() {
-    super.test_namedFunctionExpression();
-  }
-
-  @failingTest
-  void test_namedParameterOutsideGroup() {
-    super.test_namedParameterOutsideGroup();
-  }
-
-  @failingTest
-  void test_nonConstructorFactory_field() {
-    super.test_nonConstructorFactory_field();
-  }
-
-  @failingTest
-  void test_nonConstructorFactory_method() {
-    super.test_nonConstructorFactory_method();
-  }
-
-  @failingTest
-  void test_nonIdentifierLibraryName_library() {
-    super.test_nonIdentifierLibraryName_library();
-  }
-
-  @failingTest
-  void test_nonIdentifierLibraryName_partOf() {
-    super.test_nonIdentifierLibraryName_partOf();
-  }
-
-  @failingTest
-  void test_nonPartOfDirectiveInPart_after() {
-    super.test_nonPartOfDirectiveInPart_after();
-  }
-
-  @failingTest
-  void test_nonPartOfDirectiveInPart_before() {
-    super.test_nonPartOfDirectiveInPart_before();
-  }
-
-  @failingTest
-  void test_nonUserDefinableOperator() {
-    super.test_nonUserDefinableOperator();
-  }
-
-  @failingTest
-  void test_optionalAfterNormalParameters_named() {
-    super.test_optionalAfterNormalParameters_named();
-  }
-
-  @failingTest
-  void test_optionalAfterNormalParameters_positional() {
-    super.test_optionalAfterNormalParameters_positional();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_missingIdentifier() {
-    super.test_parseCascadeSection_missingIdentifier();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_missingIdentifier_typeArguments() {
-    super.test_parseCascadeSection_missingIdentifier_typeArguments();
-  }
-
-  @failingTest
-  void test_positionalAfterNamedArgument() {
-    super.test_positionalAfterNamedArgument();
-  }
-
-  @failingTest
-  void test_positionalParameterOutsideGroup() {
-    super.test_positionalParameterOutsideGroup();
-  }
-
-  @failingTest
-  void test_redirectingConstructorWithBody_named() {
-    super.test_redirectingConstructorWithBody_named();
-  }
-
-  @failingTest
-  void test_redirectingConstructorWithBody_unnamed() {
-    super.test_redirectingConstructorWithBody_unnamed();
-  }
-
-  @failingTest
-  void test_redirectionInNonFactoryConstructor() {
-    super.test_redirectionInNonFactoryConstructor();
-  }
-
-  @failingTest
-  void test_setterInFunction_block() {
-    super.test_setterInFunction_block();
-  }
-
-  @failingTest
-  void test_setterInFunction_expression() {
-    super.test_setterInFunction_expression();
-  }
-
-  @failingTest
-  void test_staticAfterConst() {
-    super.test_staticAfterConst();
-  }
-
-  @failingTest
-  void test_staticAfterFinal() {
-    super.test_staticAfterFinal();
-  }
-
-  @failingTest
-  void test_staticAfterVar() {
-    super.test_staticAfterVar();
-  }
-
-  @failingTest
-  void test_staticConstructor() {
-    super.test_staticConstructor();
-  }
-
-  @failingTest
-  void test_staticGetterWithoutBody() {
-    super.test_staticGetterWithoutBody();
-  }
-
-  @failingTest
-  void test_staticOperator_noReturnType() {
-    super.test_staticOperator_noReturnType();
-  }
-
-  @failingTest
-  void test_staticOperator_returnType() {
-    super.test_staticOperator_returnType();
-  }
-
-  @failingTest
-  void test_staticSetterWithoutBody() {
-    super.test_staticSetterWithoutBody();
-  }
-
-  @failingTest
-  void test_staticTopLevelDeclaration_class() {
-    super.test_staticTopLevelDeclaration_class();
-  }
-
-  @failingTest
-  void test_staticTopLevelDeclaration_enum() {
-    super.test_staticTopLevelDeclaration_enum();
-  }
-
-  @failingTest
-  void test_staticTopLevelDeclaration_function() {
-    super.test_staticTopLevelDeclaration_function();
-  }
-
-  @failingTest
-  void test_staticTopLevelDeclaration_typedef() {
-    super.test_staticTopLevelDeclaration_typedef();
-  }
-
-  @failingTest
-  void test_staticTopLevelDeclaration_variable() {
-    super.test_staticTopLevelDeclaration_variable();
-  }
-
-  @failingTest
-  void test_string_unterminated_interpolation_block() {
-    super.test_string_unterminated_interpolation_block();
-  }
-
-  @failingTest
-  void test_switchCase_missingColon() {
-    super.test_switchCase_missingColon();
-  }
-
-  @failingTest
-  void test_switchDefault_missingColon() {
-    super.test_switchDefault_missingColon();
-  }
-
-  @failingTest
-  void test_switchHasCaseAfterDefaultCase() {
-    super.test_switchHasCaseAfterDefaultCase();
-  }
-
-  @failingTest
-  void test_switchHasCaseAfterDefaultCase_repeated() {
-    super.test_switchHasCaseAfterDefaultCase_repeated();
-  }
-
-  @failingTest
-  void test_switchHasMultipleDefaultCases() {
-    super.test_switchHasMultipleDefaultCases();
-  }
-
-  @failingTest
-  void test_switchHasMultipleDefaultCases_repeated() {
-    super.test_switchHasMultipleDefaultCases_repeated();
-  }
-
-  @failingTest
-  void test_switchMissingBlock() {
-    super.test_switchMissingBlock();
-  }
-
-  @failingTest
-  void test_topLevel_getter() {
-    super.test_topLevel_getter();
-  }
-
-  @failingTest
-  void test_topLevelFactory_withFunction() {
-    super.test_topLevelFactory_withFunction();
-  }
-
-  @failingTest
-  void test_topLevelOperator_withFunction() {
-    super.test_topLevelOperator_withFunction();
-  }
-
-  @failingTest
-  void test_topLevelOperator_withoutOperator() {
-    super.test_topLevelOperator_withoutOperator();
-  }
-
-  @failingTest
-  void test_topLevelOperator_withoutType() {
-    super.test_topLevelOperator_withoutType();
-  }
-
-  @failingTest
-  void test_topLevelOperator_withType() {
-    super.test_topLevelOperator_withType();
-  }
-
-  @failingTest
-  void test_topLevelOperator_withVoid() {
-    super.test_topLevelOperator_withVoid();
-  }
-
-  @failingTest
-  void test_topLevelVariable_withMetadata() {
-    super.test_topLevelVariable_withMetadata();
-  }
-
-  @failingTest
-  void test_typedef_incomplete() {
-    super.test_typedef_incomplete();
-  }
-
-  @failingTest
-  void test_typedef_namedFunction() {
-    super.test_typedef_namedFunction();
-  }
-
-  @failingTest
-  void test_typedefInClass_withoutReturnType() {
-    super.test_typedefInClass_withoutReturnType();
-  }
-
-  @failingTest
-  void test_typedefInClass_withReturnType() {
-    super.test_typedefInClass_withReturnType();
-  }
-
-  @failingTest
-  void test_unexpectedTerminatorForParameterGroup_named() {
-    super.test_unexpectedTerminatorForParameterGroup_named();
-  }
-
-  @failingTest
-  void test_unexpectedTerminatorForParameterGroup_optional() {
-    super.test_unexpectedTerminatorForParameterGroup_optional();
-  }
-
-  @failingTest
-  void test_unexpectedToken_endOfFieldDeclarationStatement() {
-    super.test_unexpectedToken_endOfFieldDeclarationStatement();
-  }
-
-  @failingTest
-  void test_unexpectedToken_invalidPostfixExpression() {
-    super.test_unexpectedToken_invalidPostfixExpression();
-  }
-
-  @failingTest
-  void test_unexpectedToken_invalidPrefixExpression() {
-    super.test_unexpectedToken_invalidPrefixExpression();
-  }
-
-  @failingTest
-  void test_unexpectedToken_returnInExpressionFunctionBody() {
-    super.test_unexpectedToken_returnInExpressionFunctionBody();
-  }
-
-  @failingTest
-  void test_unexpectedToken_semicolonBetweenClassMembers() {
-    super.test_unexpectedToken_semicolonBetweenClassMembers();
-  }
-
-  @failingTest
-  void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
-    super.test_unexpectedToken_semicolonBetweenCompilationUnitMembers();
-  }
-
-  @failingTest
-  void test_unterminatedString_at_eof() {
-    super.test_unterminatedString_at_eof();
-  }
-
-  @failingTest
-  void test_unterminatedString_at_eol() {
-    super.test_unterminatedString_at_eol();
-  }
-
-  @failingTest
-  void test_unterminatedString_multiline_at_eof_3_quotes() {
-    super.test_unterminatedString_multiline_at_eof_3_quotes();
-  }
-
-  @failingTest
-  void test_unterminatedString_multiline_at_eof_4_quotes() {
-    super.test_unterminatedString_multiline_at_eof_4_quotes();
-  }
-
-  @failingTest
-  void test_unterminatedString_multiline_at_eof_5_quotes() {
-    super.test_unterminatedString_multiline_at_eof_5_quotes();
-  }
-
-  @failingTest
-  void test_useOfUnaryPlusOperator() {
-    super.test_useOfUnaryPlusOperator();
-  }
-
-  @failingTest
-  void test_varAndType_field() {
-    super.test_varAndType_field();
-  }
-
-  @failingTest
-  void test_varAndType_local() {
-    super.test_varAndType_local();
-  }
-
-  @failingTest
-  void test_varAndType_parameter() {
-    super.test_varAndType_parameter();
-  }
-
-  @failingTest
-  void test_varAndType_topLevelVariable() {
-    super.test_varAndType_topLevelVariable();
-  }
-
-  @failingTest
-  void test_varAsTypeName_as() {
-    super.test_varAsTypeName_as();
-  }
-
-  @failingTest
-  void test_varClass() {
-    super.test_varClass();
-  }
-
-  @failingTest
-  void test_varEnum() {
-    super.test_varEnum();
-  }
-
-  @failingTest
-  void test_varReturnType() {
-    super.test_varReturnType();
-  }
-
-  @failingTest
-  void test_varTypedef() {
-    super.test_varTypedef();
-  }
-
-  @failingTest
-  void test_voidParameter() {
-    super.test_voidParameter();
-  }
-
-  @failingTest
-  void test_voidVariable_parseClassMember_initializer() {
-    super.test_voidVariable_parseClassMember_initializer();
-  }
-
-  @failingTest
-  void test_voidVariable_parseClassMember_noInitializer() {
-    super.test_voidVariable_parseClassMember_noInitializer();
-  }
-
-  @failingTest
-  void test_voidVariable_parseCompilationUnit_initializer() {
-    super.test_voidVariable_parseCompilationUnit_initializer();
-  }
-
-  @failingTest
-  void test_voidVariable_parseCompilationUnit_noInitializer() {
-    super.test_voidVariable_parseCompilationUnit_noInitializer();
-  }
-
-  @failingTest
-  void test_voidVariable_parseCompilationUnitMember_initializer() {
-    super.test_voidVariable_parseCompilationUnitMember_initializer();
-  }
-
-  @failingTest
-  void test_voidVariable_parseCompilationUnitMember_noInitializer() {
-    super.test_voidVariable_parseCompilationUnitMember_noInitializer();
-  }
-
-  @failingTest
-  void test_voidVariable_statement_initializer() {
-    super.test_voidVariable_statement_initializer();
-  }
-
-  @failingTest
-  void test_voidVariable_statement_noInitializer() {
-    super.test_voidVariable_statement_noInitializer();
-  }
-
-  @failingTest
-  void test_withBeforeExtends() {
-    super.test_withBeforeExtends();
-  }
-
-  @failingTest
-  void test_withWithoutExtends() {
-    super.test_withWithoutExtends();
-  }
-
-  @failingTest
-  void test_wrongSeparatorForPositionalParameter() {
-    super.test_wrongSeparatorForPositionalParameter();
-  }
-
-  @failingTest
-  void test_wrongTerminatorForParameterGroup_named() {
-    super.test_wrongTerminatorForParameterGroup_named();
-  }
-
-  @failingTest
-  void test_wrongTerminatorForParameterGroup_optional() {
-    super.test_wrongTerminatorForParameterGroup_optional();
-  }
-}
-
-@reflectiveTest
-class ExpressionParserTest_Forest extends FastaBodyBuilderTestCase
-    with ExpressionParserTestMixin {
-  ExpressionParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_namedArgument() {
-    super.test_namedArgument();
-  }
-
-  @failingTest
-  void test_parseAdditiveExpression_normal() {
-    super.test_parseAdditiveExpression_normal();
-  }
-
-  @failingTest
-  void test_parseAdditiveExpression_super() {
-    super.test_parseAdditiveExpression_super();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_expression_args_dot() {
-    super.test_parseAssignableExpression_expression_args_dot();
-  }
-
-  @failingTest
-  void
-      test_parseAssignableExpression_expression_args_dot_typeArgumentComments() {
-    super
-        .test_parseAssignableExpression_expression_args_dot_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_expression_args_dot_typeArguments() {
-    super.test_parseAssignableExpression_expression_args_dot_typeArguments();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_expression_dot() {
-    super.test_parseAssignableExpression_expression_dot();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_expression_index() {
-    super.test_parseAssignableExpression_expression_index();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_expression_question_dot() {
-    super.test_parseAssignableExpression_expression_question_dot();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_identifier_args_dot() {
-    super.test_parseAssignableExpression_identifier_args_dot();
-  }
-
-  @failingTest
-  void
-      test_parseAssignableExpression_identifier_args_dot_typeArgumentComments() {
-    super
-        .test_parseAssignableExpression_identifier_args_dot_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_identifier_args_dot_typeArguments() {
-    super.test_parseAssignableExpression_identifier_args_dot_typeArguments();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_identifier_dot() {
-    super.test_parseAssignableExpression_identifier_dot();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_identifier_question_dot() {
-    super.test_parseAssignableExpression_identifier_question_dot();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_super_dot() {
-    super.test_parseAssignableExpression_super_dot();
-  }
-
-  @failingTest
-  void test_parseAssignableExpression_super_index() {
-    super.test_parseAssignableExpression_super_index();
-  }
-
-  @failingTest
-  void test_parseAssignableSelector_dot() {
-    super.test_parseAssignableSelector_dot();
-  }
-
-  @failingTest
-  void test_parseAssignableSelector_index() {
-    super.test_parseAssignableSelector_index();
-  }
-
-  @failingTest
-  void test_parseAssignableSelector_question_dot() {
-    super.test_parseAssignableSelector_question_dot();
-  }
-
-  @failingTest
-  void test_parseBitwiseAndExpression_normal() {
-    super.test_parseBitwiseAndExpression_normal();
-  }
-
-  @failingTest
-  void test_parseBitwiseAndExpression_super() {
-    super.test_parseBitwiseAndExpression_super();
-  }
-
-  @failingTest
-  void test_parseBitwiseOrExpression_normal() {
-    super.test_parseBitwiseOrExpression_normal();
-  }
-
-  @failingTest
-  void test_parseBitwiseOrExpression_super() {
-    super.test_parseBitwiseOrExpression_super();
-  }
-
-  @failingTest
-  void test_parseBitwiseXorExpression_normal() {
-    super.test_parseBitwiseXorExpression_normal();
-  }
-
-  @failingTest
-  void test_parseBitwiseXorExpression_super() {
-    super.test_parseBitwiseXorExpression_super();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_i() {
-    super.test_parseCascadeSection_i();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_ia() {
-    super.test_parseCascadeSection_ia();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_ia_typeArgumentComments() {
-    super.test_parseCascadeSection_ia_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_ia_typeArguments() {
-    super.test_parseCascadeSection_ia_typeArguments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_ii() {
-    super.test_parseCascadeSection_ii();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_ii_typeArgumentComments() {
-    super.test_parseCascadeSection_ii_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_ii_typeArguments() {
-    super.test_parseCascadeSection_ii_typeArguments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_p() {
-    super.test_parseCascadeSection_p();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_p_assign() {
-    super.test_parseCascadeSection_p_assign();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_p_assign_withCascade() {
-    super.test_parseCascadeSection_p_assign_withCascade();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
-    super.test_parseCascadeSection_p_assign_withCascade_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
-    super.test_parseCascadeSection_p_assign_withCascade_typeArguments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_p_builtIn() {
-    super.test_parseCascadeSection_p_builtIn();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_pa() {
-    super.test_parseCascadeSection_pa();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_pa_typeArgumentComments() {
-    super.test_parseCascadeSection_pa_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_pa_typeArguments() {
-    super.test_parseCascadeSection_pa_typeArguments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_paa() {
-    super.test_parseCascadeSection_paa();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_paa_typeArgumentComments() {
-    super.test_parseCascadeSection_paa_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_paa_typeArguments() {
-    super.test_parseCascadeSection_paa_typeArguments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_paapaa() {
-    super.test_parseCascadeSection_paapaa();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_paapaa_typeArgumentComments() {
-    super.test_parseCascadeSection_paapaa_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_paapaa_typeArguments() {
-    super.test_parseCascadeSection_paapaa_typeArguments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_pap() {
-    super.test_parseCascadeSection_pap();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_pap_typeArgumentComments() {
-    super.test_parseCascadeSection_pap_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseCascadeSection_pap_typeArguments() {
-    super.test_parseCascadeSection_pap_typeArguments();
-  }
-
-  @failingTest
-  void test_parseConditionalExpression() {
-    super.test_parseConditionalExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_parseConstExpression_instanceCreation() {
-    super.test_parseConstExpression_instanceCreation();
-  }
-
-  @failingTest
-  void test_parseConstExpression_listLiteral_typed() {
-    super.test_parseConstExpression_listLiteral_typed();
-  }
-
-  @failingTest
-  void test_parseConstExpression_listLiteral_typed_genericComment() {
-    super.test_parseConstExpression_listLiteral_typed_genericComment();
-  }
-
-  @failingTest
-  void test_parseConstExpression_mapLiteral_typed() {
-    super.test_parseConstExpression_mapLiteral_typed();
-  }
-
-  @failingTest
-  void test_parseConstExpression_mapLiteral_typed_genericComment() {
-    super.test_parseConstExpression_mapLiteral_typed_genericComment();
-  }
-
-  @failingTest
-  void test_parseEqualityExpression_normal() {
-    super.test_parseEqualityExpression_normal();
-  }
-
-  @failingTest
-  void test_parseEqualityExpression_super() {
-    super.test_parseEqualityExpression_super();
-  }
-
-  @failingTest
-  void test_parseExpression_assign() {
-    super.test_parseExpression_assign();
-  }
-
-  @failingTest
-  void test_parseExpression_comparison() {
-    super.test_parseExpression_comparison();
-  }
-
-  @failingTest
-  void test_parseExpression_function_async() {
-    super.test_parseExpression_function_async();
-  }
-
-  @failingTest
-  void test_parseExpression_function_asyncStar() {
-    super.test_parseExpression_function_asyncStar();
-  }
-
-  @failingTest
-  void test_parseExpression_function_sync() {
-    super.test_parseExpression_function_sync();
-  }
-
-  @failingTest
-  void test_parseExpression_function_syncStar() {
-    super.test_parseExpression_function_syncStar();
-  }
-
-  @failingTest
-  void test_parseExpression_invokeFunctionExpression() {
-    super.test_parseExpression_invokeFunctionExpression();
-  }
-
-  @failingTest
-  void test_parseExpression_nonAwait() {
-    super.test_parseExpression_nonAwait();
-  }
-
-  @failingTest
-  void test_parseExpression_superMethodInvocation() {
-    super.test_parseExpression_superMethodInvocation();
-  }
-
-  @failingTest
-  void test_parseExpression_superMethodInvocation_typeArgumentComments() {
-    super.test_parseExpression_superMethodInvocation_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseExpression_superMethodInvocation_typeArguments() {
-    super.test_parseExpression_superMethodInvocation_typeArguments();
-  }
-
-  @failingTest
-  void test_parseExpression_superMethodInvocation_typeArguments_chained() {
-    super.test_parseExpression_superMethodInvocation_typeArguments_chained();
-  }
-
-  @failingTest
-  void test_parseExpressionList_multiple() {
-    super.test_parseExpressionList_multiple();
-  }
-
-  @failingTest
-  void test_parseExpressionList_single() {
-    super.test_parseExpressionList_single();
-  }
-
-  @failingTest
-  void test_parseExpressionWithoutCascade_assign() {
-    super.test_parseExpressionWithoutCascade_assign();
-  }
-
-  @failingTest
-  void test_parseExpressionWithoutCascade_comparison() {
-    super.test_parseExpressionWithoutCascade_comparison();
-  }
-
-  @failingTest
-  void test_parseExpressionWithoutCascade_superMethodInvocation() {
-    super.test_parseExpressionWithoutCascade_superMethodInvocation();
-  }
-
-  @failingTest
-  void
-      test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
-    super
-        .test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments();
-  }
-
-  @failingTest
-  void
-      test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
-    super
-        .test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments();
-  }
-
-  @failingTest
-  void test_parseFunctionExpression_body_inExpression() {
-    super.test_parseFunctionExpression_body_inExpression();
-  }
-
-  @failingTest
-  void test_parseFunctionExpression_typeParameterComments() {
-    super.test_parseFunctionExpression_typeParameterComments();
-  }
-
-  @failingTest
-  void test_parseFunctionExpression_typeParameters() {
-    super.test_parseFunctionExpression_typeParameters();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_qualifiedType() {
-    super.test_parseInstanceCreationExpression_qualifiedType();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_qualifiedType_named() {
-    super.test_parseInstanceCreationExpression_qualifiedType_named();
-  }
-
-  @failingTest
-  void
-      test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments() {
-    super
-        .test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments();
-  }
-
-  @failingTest
-  void
-      test_parseInstanceCreationExpression_qualifiedType_named_typeArguments() {
-    super
-        .test_parseInstanceCreationExpression_qualifiedType_named_typeArguments();
-  }
-
-  @failingTest
-  void
-      test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments() {
-    super
-        .test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_qualifiedType_typeArguments() {
-    super.test_parseInstanceCreationExpression_qualifiedType_typeArguments();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_type() {
-    super.test_parseInstanceCreationExpression_type();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_type_named() {
-    super.test_parseInstanceCreationExpression_type_named();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_type_named_typeArgumentComments() {
-    super
-        .test_parseInstanceCreationExpression_type_named_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_type_named_typeArguments() {
-    super.test_parseInstanceCreationExpression_type_named_typeArguments();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_type_typeArgumentComments() {
-    super.test_parseInstanceCreationExpression_type_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parseInstanceCreationExpression_type_typeArguments() {
-    super.test_parseInstanceCreationExpression_type_typeArguments();
-  }
-
-  @failingTest
-  void test_parseListLiteral_empty_oneToken_withComment() {
-    super.test_parseListLiteral_empty_oneToken_withComment();
-  }
-
-  @failingTest
-  void test_parseListLiteral_single_withTypeArgument() {
-    super.test_parseListLiteral_single_withTypeArgument();
-  }
-
-  @failingTest
-  void test_parseListOrMapLiteral_list_type() {
-    super.test_parseListOrMapLiteral_list_type();
-  }
-
-  @failingTest
-  void test_parseListOrMapLiteral_map_type() {
-    super.test_parseListOrMapLiteral_map_type();
-  }
-
-  @failingTest
-  void test_parseLogicalAndExpression() {
-    super.test_parseLogicalAndExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_parseLogicalOrExpression() {
-    super.test_parseLogicalOrExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_parseMapLiteral_empty() {
-    super.test_parseMapLiteral_empty();
-  }
-
-  @failingTest
-  void test_parseMapLiteralEntry_complex() {
-    super.test_parseMapLiteralEntry_complex();
-  }
-
-  @failingTest
-  void test_parseMultiplicativeExpression_normal() {
-    super.test_parseMultiplicativeExpression_normal();
-  }
-
-  @failingTest
-  void test_parseMultiplicativeExpression_super() {
-    super.test_parseMultiplicativeExpression_super();
-  }
-
-  @failingTest
-  void test_parseNewExpression() {
-    super.test_parseNewExpression();
-  }
-
-  @failingTest
-  void test_parsePostfixExpression_decrement() {
-    super.test_parsePostfixExpression_decrement();
-  }
-
-  @failingTest
-  void test_parsePostfixExpression_increment() {
-    super.test_parsePostfixExpression_increment();
-  }
-
-  @failingTest
-  void test_parsePostfixExpression_none_methodInvocation() {
-    super.test_parsePostfixExpression_none_methodInvocation();
-  }
-
-  @failingTest
-  void test_parsePostfixExpression_none_methodInvocation_question_dot() {
-    super.test_parsePostfixExpression_none_methodInvocation_question_dot();
-  }
-
-  @failingTest
-  void
-      test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
-    super
-        .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments();
-  }
-
-  @failingTest
-  void
-      test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
-    super
-        .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments();
-  }
-
-  @failingTest
-  void
-      test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
-    super
-        .test_parsePostfixExpression_none_methodInvocation_typeArgumentComments();
-  }
-
-  @failingTest
-  void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
-    super.test_parsePostfixExpression_none_methodInvocation_typeArguments();
-  }
-
-  @failingTest
-  void test_parsePostfixExpression_none_propertyAccess() {
-    super.test_parsePostfixExpression_none_propertyAccess();
-  }
-
-  @failingTest
-  void test_parsePrefixedIdentifier_prefix() {
-    super.test_parsePrefixedIdentifier_prefix();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_const() {
-    super.test_parsePrimaryExpression_const();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_function_arguments() {
-    super.test_parsePrimaryExpression_function_arguments();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_function_noArguments() {
-    super.test_parsePrimaryExpression_function_noArguments();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_genericFunctionExpression() {
-    super.test_parsePrimaryExpression_genericFunctionExpression();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_listLiteral_typed() {
-    super.test_parsePrimaryExpression_listLiteral_typed();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
-    super.test_parsePrimaryExpression_listLiteral_typed_genericComment();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_mapLiteral_typed() {
-    super.test_parsePrimaryExpression_mapLiteral_typed();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
-    super.test_parsePrimaryExpression_mapLiteral_typed_genericComment();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_new() {
-    super.test_parsePrimaryExpression_new();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_parenthesized() {
-    super.test_parsePrimaryExpression_parenthesized();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_super() {
-    super.test_parsePrimaryExpression_super();
-  }
-
-  @failingTest
-  void test_parsePrimaryExpression_this() {
-    super.test_parsePrimaryExpression_this();
-  }
-
-  @failingTest
-  void test_parseRedirectingConstructorInvocation_named() {
-    super.test_parseRedirectingConstructorInvocation_named();
-  }
-
-  @failingTest
-  void test_parseRedirectingConstructorInvocation_unnamed() {
-    super.test_parseRedirectingConstructorInvocation_unnamed();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_as_functionType_noReturnType() {
-    super.test_parseRelationalExpression_as_functionType_noReturnType();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_as_functionType_returnType() {
-    super.test_parseRelationalExpression_as_functionType_returnType();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_as_generic() {
-    super.test_parseRelationalExpression_as_generic();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_as_simple() {
-    super.test_parseRelationalExpression_as_simple();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_as_simple_function() {
-    super.test_parseRelationalExpression_as_simple_function();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_is() {
-    super.test_parseRelationalExpression_is();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_isNot() {
-    super.test_parseRelationalExpression_isNot();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_normal() {
-    super.test_parseRelationalExpression_normal();
-  }
-
-  @failingTest
-  void test_parseRelationalExpression_super() {
-    super.test_parseRelationalExpression_super();
-  }
-
-  @failingTest
-  void test_parseShiftExpression_normal() {
-    super.test_parseShiftExpression_normal();
-  }
-
-  @failingTest
-  void test_parseShiftExpression_super() {
-    super.test_parseShiftExpression_super();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_endsWithInterpolation() {
-    super.test_parseStringLiteral_endsWithInterpolation();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_interpolated() {
-    super.test_parseStringLiteral_interpolated();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_multiline_endsWithInterpolation() {
-    super.test_parseStringLiteral_multiline_endsWithInterpolation();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
-    super.test_parseStringLiteral_multiline_quoteAfterInterpolation();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_multiline_startsWithInterpolation() {
-    super.test_parseStringLiteral_multiline_startsWithInterpolation();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_quoteAfterInterpolation() {
-    super.test_parseStringLiteral_quoteAfterInterpolation();
-  }
-
-  @failingTest
-  void test_parseStringLiteral_startsWithInterpolation() {
-    super.test_parseStringLiteral_startsWithInterpolation();
-  }
-
-  @failingTest
-  void test_parseSuperConstructorInvocation_named() {
-    super.test_parseSuperConstructorInvocation_named();
-  }
-
-  @failingTest
-  void test_parseSuperConstructorInvocation_unnamed() {
-    super.test_parseSuperConstructorInvocation_unnamed();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_decrement_normal() {
-    super.test_parseUnaryExpression_decrement_normal();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_decrement_super() {
-    super.test_parseUnaryExpression_decrement_super();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_decrement_super_propertyAccess() {
-    super.test_parseUnaryExpression_decrement_super_propertyAccess();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_decrement_super_withComment() {
-    super.test_parseUnaryExpression_decrement_super_withComment();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_increment_normal() {
-    super.test_parseUnaryExpression_increment_normal();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_increment_super_index() {
-    super.test_parseUnaryExpression_increment_super_index();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_increment_super_propertyAccess() {
-    super.test_parseUnaryExpression_increment_super_propertyAccess();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_minus_normal() {
-    super.test_parseUnaryExpression_minus_normal();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_minus_super() {
-    super.test_parseUnaryExpression_minus_super();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_not_super() {
-    super.test_parseUnaryExpression_not_super();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_tilda_normal() {
-    super.test_parseUnaryExpression_tilda_normal();
-  }
-
-  @failingTest
-  void test_parseUnaryExpression_tilda_super() {
-    super.test_parseUnaryExpression_tilda_super();
-  }
-}
-
-@reflectiveTest
-class FormalParameterParserTest_Forest extends FastaBodyBuilderTestCase
-    with FormalParameterParserTestMixin {
-  FormalParameterParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_parseFormalParameter_covariant_final_named() {
-    super.test_parseFormalParameter_covariant_final_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_final_normal() {
-    super.test_parseFormalParameter_covariant_final_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_final_positional() {
-    super.test_parseFormalParameter_covariant_final_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_final_type_named() {
-    super.test_parseFormalParameter_covariant_final_type_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_final_type_normal() {
-    super.test_parseFormalParameter_covariant_final_type_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_final_type_positional() {
-    super.test_parseFormalParameter_covariant_final_type_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_type_function() {
-    super.test_parseFormalParameter_covariant_type_function();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_type_named() {
-    super.test_parseFormalParameter_covariant_type_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_type_normal() {
-    super.test_parseFormalParameter_covariant_type_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_type_positional() {
-    super.test_parseFormalParameter_covariant_type_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_var_named() {
-    super.test_parseFormalParameter_covariant_var_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_var_normal() {
-    super.test_parseFormalParameter_covariant_var_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_covariant_var_positional() {
-    super.test_parseFormalParameter_covariant_var_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_final_named() {
-    super.test_parseFormalParameter_final_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_final_normal() {
-    super.test_parseFormalParameter_final_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_final_positional() {
-    super.test_parseFormalParameter_final_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_final_type_named() {
-    super.test_parseFormalParameter_final_type_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_final_type_normal() {
-    super.test_parseFormalParameter_final_type_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_final_type_positional() {
-    super.test_parseFormalParameter_final_type_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_type_function() {
-    super.test_parseFormalParameter_type_function();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_type_named() {
-    super.test_parseFormalParameter_type_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_type_named_noDefault() {
-    super.test_parseFormalParameter_type_named_noDefault();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_type_normal() {
-    super.test_parseFormalParameter_type_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_type_positional() {
-    super.test_parseFormalParameter_type_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_type_positional_noDefault() {
-    super.test_parseFormalParameter_type_positional_noDefault();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_var_named() {
-    super.test_parseFormalParameter_var_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_var_normal() {
-    super.test_parseFormalParameter_var_normal();
-  }
-
-  @failingTest
-  void test_parseFormalParameter_var_positional() {
-    super.test_parseFormalParameter_var_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_empty() {
-    super.test_parseFormalParameterList_empty();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_named_multiple() {
-    super.test_parseFormalParameterList_named_multiple();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_named_single() {
-    super.test_parseFormalParameterList_named_single();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_named_trailing_comma() {
-    super.test_parseFormalParameterList_named_trailing_comma();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_multiple() {
-    super.test_parseFormalParameterList_normal_multiple();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_named() {
-    super.test_parseFormalParameterList_normal_named();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_named_inFunctionType() {
-    super.test_parseFormalParameterList_normal_named_inFunctionType();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_positional() {
-    super.test_parseFormalParameterList_normal_positional();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_single() {
-    super.test_parseFormalParameterList_normal_single();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_single_Function() {
-    super.test_parseFormalParameterList_normal_single_Function();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_normal_single_trailing_comma() {
-    super.test_parseFormalParameterList_normal_single_trailing_comma();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_positional_multiple() {
-    super.test_parseFormalParameterList_positional_multiple();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_positional_single() {
-    super.test_parseFormalParameterList_positional_single();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_positional_trailing_comma() {
-    super.test_parseFormalParameterList_positional_trailing_comma();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_prefixedType() {
-    super.test_parseFormalParameterList_prefixedType();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_prefixedType_missingName() {
-    super.test_parseFormalParameterList_prefixedType_missingName();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_prefixedType_partial() {
-    super.test_parseFormalParameterList_prefixedType_partial();
-  }
-
-  @failingTest
-  void test_parseFormalParameterList_prefixedType_partial2() {
-    super.test_parseFormalParameterList_prefixedType_partial2();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_const_noType() {
-    super.test_parseNormalFormalParameter_field_const_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_const_type() {
-    super.test_parseNormalFormalParameter_field_const_type();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_final_noType() {
-    super.test_parseNormalFormalParameter_field_final_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_final_type() {
-    super.test_parseNormalFormalParameter_field_final_type();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_function_nested() {
-    super.test_parseNormalFormalParameter_field_function_nested();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_function_noNested() {
-    super.test_parseNormalFormalParameter_field_function_noNested();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_function_withDocComment() {
-    super.test_parseNormalFormalParameter_field_function_withDocComment();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_noType() {
-    super.test_parseNormalFormalParameter_field_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_type() {
-    super.test_parseNormalFormalParameter_field_type();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_var() {
-    super.test_parseNormalFormalParameter_field_var();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_field_withDocComment() {
-    super.test_parseNormalFormalParameter_field_withDocComment();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_named() {
-    super.test_parseNormalFormalParameter_function_named();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_noType() {
-    super.test_parseNormalFormalParameter_function_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_noType_covariant() {
-    super.test_parseNormalFormalParameter_function_noType_covariant();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_noType_typeParameterComments() {
-    super
-        .test_parseNormalFormalParameter_function_noType_typeParameterComments();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_noType_typeParameters() {
-    super.test_parseNormalFormalParameter_function_noType_typeParameters();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_type() {
-    super.test_parseNormalFormalParameter_function_type();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_type_typeParameterComments() {
-    super.test_parseNormalFormalParameter_function_type_typeParameterComments();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_type_typeParameters() {
-    super.test_parseNormalFormalParameter_function_type_typeParameters();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_typeVoid_covariant() {
-    super.test_parseNormalFormalParameter_function_typeVoid_covariant();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_void() {
-    super.test_parseNormalFormalParameter_function_void();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_void_typeParameterComments() {
-    super.test_parseNormalFormalParameter_function_void_typeParameterComments();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_void_typeParameters() {
-    super.test_parseNormalFormalParameter_function_void_typeParameters();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_function_withDocComment() {
-    super.test_parseNormalFormalParameter_function_withDocComment();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_const_noType() {
-    super.test_parseNormalFormalParameter_simple_const_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_const_type() {
-    super.test_parseNormalFormalParameter_simple_const_type();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_final_noType() {
-    super.test_parseNormalFormalParameter_simple_final_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_final_type() {
-    super.test_parseNormalFormalParameter_simple_final_type();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_noName() {
-    super.test_parseNormalFormalParameter_simple_noName();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_noType() {
-    super.test_parseNormalFormalParameter_simple_noType();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_noType_namedCovariant() {
-    super.test_parseNormalFormalParameter_simple_noType_namedCovariant();
-  }
-
-  @failingTest
-  void test_parseNormalFormalParameter_simple_type() {
-    super.test_parseNormalFormalParameter_simple_type();
-  }
-}
-
-@reflectiveTest
-class RecoveryParserTest_Forest extends FastaBodyBuilderTestCase
-    with RecoveryParserTestMixin {
-  RecoveryParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_additiveExpression_missing_LHS() {
-    super.test_additiveExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_additiveExpression_missing_LHS_RHS() {
-    super.test_additiveExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_additiveExpression_missing_RHS() {
-    super.test_additiveExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_additiveExpression_missing_RHS_super() {
-    super.test_additiveExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_additiveExpression_precedence_multiplicative_left() {
-    super.test_additiveExpression_precedence_multiplicative_left();
-  }
-
-  @failingTest
-  void test_additiveExpression_precedence_multiplicative_right() {
-    super.test_additiveExpression_precedence_multiplicative_right();
-  }
-
-  @failingTest
-  void test_additiveExpression_super() {
-    super.test_additiveExpression_super();
-  }
-
-  @failingTest
-  void test_assignableSelector() {
-    super.test_assignableSelector();
-  }
-
-  @failingTest
-  void test_assignmentExpression_missing_compound1() {
-    super.test_assignmentExpression_missing_compound1();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_assignmentExpression_missing_compound2() {
-    super.test_assignmentExpression_missing_compound2();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_assignmentExpression_missing_compound3() {
-    super.test_assignmentExpression_missing_compound3();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_assignmentExpression_missing_LHS() {
-    super.test_assignmentExpression_missing_LHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_assignmentExpression_missing_RHS() {
-    super.test_assignmentExpression_missing_RHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_missing_LHS() {
-    super.test_bitwiseAndExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_missing_LHS_RHS() {
-    super.test_bitwiseAndExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_missing_RHS() {
-    super.test_bitwiseAndExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_missing_RHS_super() {
-    super.test_bitwiseAndExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_precedence_equality_left() {
-    super.test_bitwiseAndExpression_precedence_equality_left();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_precedence_equality_right() {
-    super.test_bitwiseAndExpression_precedence_equality_right();
-  }
-
-  @failingTest
-  void test_bitwiseAndExpression_super() {
-    super.test_bitwiseAndExpression_super();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_missing_LHS() {
-    super.test_bitwiseOrExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_missing_LHS_RHS() {
-    super.test_bitwiseOrExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_missing_RHS() {
-    super.test_bitwiseOrExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_missing_RHS_super() {
-    super.test_bitwiseOrExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_precedence_xor_left() {
-    super.test_bitwiseOrExpression_precedence_xor_left();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_precedence_xor_right() {
-    super.test_bitwiseOrExpression_precedence_xor_right();
-  }
-
-  @failingTest
-  void test_bitwiseOrExpression_super() {
-    super.test_bitwiseOrExpression_super();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_missing_LHS() {
-    super.test_bitwiseXorExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_missing_LHS_RHS() {
-    super.test_bitwiseXorExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_missing_RHS() {
-    super.test_bitwiseXorExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_missing_RHS_super() {
-    super.test_bitwiseXorExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_precedence_and_left() {
-    super.test_bitwiseXorExpression_precedence_and_left();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_precedence_and_right() {
-    super.test_bitwiseXorExpression_precedence_and_right();
-  }
-
-  @failingTest
-  void test_bitwiseXorExpression_super() {
-    super.test_bitwiseXorExpression_super();
-  }
-
-  @failingTest
-  void test_classTypeAlias_withBody() {
-    super.test_classTypeAlias_withBody();
-  }
-
-  @failingTest
-  void test_combinator_badIdentifier() {
-    super.test_combinator_badIdentifier();
-  }
-
-  @failingTest
-  void test_combinator_missingIdentifier() {
-    super.test_combinator_missingIdentifier();
-  }
-
-  @failingTest
-  void test_conditionalExpression_missingElse() {
-    super.test_conditionalExpression_missingElse();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_conditionalExpression_missingThen() {
-    super.test_conditionalExpression_missingThen();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_declarationBeforeDirective() {
-    super.test_declarationBeforeDirective();
-  }
-
-  @failingTest
-  void test_equalityExpression_missing_LHS() {
-    super.test_equalityExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_equalityExpression_missing_LHS_RHS() {
-    super.test_equalityExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_equalityExpression_missing_RHS() {
-    super.test_equalityExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_equalityExpression_missing_RHS_super() {
-    super.test_equalityExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_equalityExpression_precedence_relational_left() {
-    super.test_equalityExpression_precedence_relational_left();
-  }
-
-  @failingTest
-  void test_equalityExpression_precedence_relational_right() {
-    super.test_equalityExpression_precedence_relational_right();
-  }
-
-  @failingTest
-  void test_equalityExpression_super() {
-    super.test_equalityExpression_super();
-  }
-
-  @failingTest
-  void test_expressionList_multiple_end() {
-    super.test_expressionList_multiple_end();
-  }
-
-  @failingTest
-  void test_expressionList_multiple_middle() {
-    super.test_expressionList_multiple_middle();
-  }
-
-  @failingTest
-  void test_expressionList_multiple_start() {
-    super.test_expressionList_multiple_start();
-  }
-
-  @failingTest
-  void test_functionExpression_in_ConstructorFieldInitializer() {
-    super.test_functionExpression_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void test_functionExpression_named() {
-    super.test_functionExpression_named();
-  }
-
-  @failingTest
-  void test_ifStatement_noElse_statement() {
-    super.test_ifStatement_noElse_statement();
-  }
-
-  @failingTest
-  void test_importDirectivePartial_as() {
-    super.test_importDirectivePartial_as();
-  }
-
-  @failingTest
-  void test_importDirectivePartial_hide() {
-    super.test_importDirectivePartial_hide();
-  }
-
-  @failingTest
-  void test_importDirectivePartial_show() {
-    super.test_importDirectivePartial_show();
-  }
-
-  @failingTest
-  void test_incomplete_conditionalExpression() {
-    super.test_incomplete_conditionalExpression();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_incomplete_constructorInitializers_empty() {
-    super.test_incomplete_constructorInitializers_empty();
-  }
-
-  @failingTest
-  void test_incomplete_constructorInitializers_missingEquals() {
-    super.test_incomplete_constructorInitializers_missingEquals();
-  }
-
-  @failingTest
-  void test_incomplete_constructorInitializers_this() {
-    super.test_incomplete_constructorInitializers_this();
-  }
-
-  @failingTest
-  void test_incomplete_constructorInitializers_thisField() {
-    super.test_incomplete_constructorInitializers_thisField();
-  }
-
-  @failingTest
-  void test_incomplete_constructorInitializers_thisPeriod() {
-    super.test_incomplete_constructorInitializers_thisPeriod();
-  }
-
-  @failingTest
-  void test_incomplete_constructorInitializers_variable() {
-    super.test_incomplete_constructorInitializers_variable();
-  }
-
-  @failingTest
-  void test_incomplete_functionExpression() {
-    super.test_incomplete_functionExpression();
-  }
-
-  @failingTest
-  void test_incomplete_functionExpression2() {
-    super.test_incomplete_functionExpression2();
-  }
-
-  @failingTest
-  void test_incomplete_returnType() {
-    super.test_incomplete_returnType();
-  }
-
-  @failingTest
-  void test_incomplete_topLevelFunction() {
-    super.test_incomplete_topLevelFunction();
-  }
-
-  @failingTest
-  void test_incomplete_topLevelVariable() {
-    super.test_incomplete_topLevelVariable();
-  }
-
-  @failingTest
-  void test_incomplete_topLevelVariable_const() {
-    super.test_incomplete_topLevelVariable_const();
-  }
-
-  @failingTest
-  void test_incomplete_topLevelVariable_final() {
-    super.test_incomplete_topLevelVariable_final();
-  }
-
-  @failingTest
-  void test_incomplete_topLevelVariable_var() {
-    super.test_incomplete_topLevelVariable_var();
-  }
-
-  @failingTest
-  void test_incompleteField_const() {
-    super.test_incompleteField_const();
-  }
-
-  @failingTest
-  void test_incompleteField_final() {
-    super.test_incompleteField_final();
-  }
-
-  @failingTest
-  void test_incompleteField_static() {
-    super.test_incompleteField_static();
-  }
-
-  @failingTest
-  void test_incompleteField_static2() {
-    super.test_incompleteField_static2();
-  }
-
-  @failingTest
-  void test_incompleteField_type() {
-    super.test_incompleteField_type();
-  }
-
-  @failingTest
-  void test_incompleteField_var() {
-    super.test_incompleteField_var();
-  }
-
-  @failingTest
-  void test_incompleteForEach() {
-    super.test_incompleteForEach();
-  }
-
-  @failingTest
-  void test_incompleteLocalVariable_atTheEndOfBlock() {
-    super.test_incompleteLocalVariable_atTheEndOfBlock();
-  }
-
-  @failingTest
-  void test_incompleteLocalVariable_atTheEndOfBlock_modifierOnly() {
-    super.test_incompleteLocalVariable_atTheEndOfBlock_modifierOnly();
-  }
-
-  @failingTest
-  void test_incompleteLocalVariable_beforeIdentifier() {
-    super.test_incompleteLocalVariable_beforeIdentifier();
-  }
-
-  @failingTest
-  void test_incompleteLocalVariable_beforeKeyword() {
-    super.test_incompleteLocalVariable_beforeKeyword();
-  }
-
-  @failingTest
-  void test_incompleteLocalVariable_beforeNextBlock() {
-    super.test_incompleteLocalVariable_beforeNextBlock();
-  }
-
-  @failingTest
-  void test_incompleteLocalVariable_parameterizedType() {
-    super.test_incompleteLocalVariable_parameterizedType();
-  }
-
-  @failingTest
-  void test_incompleteTypeArguments_field() {
-    super.test_incompleteTypeArguments_field();
-  }
-
-  @failingTest
-  void test_incompleteTypeParameters() {
-    super.test_incompleteTypeParameters();
-  }
-
-  @failingTest
-  void test_incompleteTypeParameters2() {
-    super.test_incompleteTypeParameters2();
-  }
-
-  @failingTest
-  void test_incompleteTypeParameters3() {
-    super.test_incompleteTypeParameters3();
-  }
-
-  @failingTest
-  void test_invalidFunctionBodyModifier() {
-    super.test_invalidFunctionBodyModifier();
-  }
-
-  @failingTest
-  void test_invalidTypeParameters() {
-    super.test_invalidTypeParameters();
-  }
-
-  @failingTest
-  void test_isExpression_noType() {
-    super.test_isExpression_noType();
-  }
-
-  @failingTest
-  void test_keywordInPlaceOfIdentifier() {
-    super.test_keywordInPlaceOfIdentifier();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_missing_LHS() {
-    super.test_logicalAndExpression_missing_LHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_missing_LHS_RHS() {
-    super.test_logicalAndExpression_missing_LHS_RHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_missing_RHS() {
-    super.test_logicalAndExpression_missing_RHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_precedence_bitwiseOr_left() {
-    super.test_logicalAndExpression_precedence_bitwiseOr_left();
-  }
-
-  @failingTest
-  void test_logicalAndExpression_precedence_bitwiseOr_right() {
-    super.test_logicalAndExpression_precedence_bitwiseOr_right();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_missing_LHS() {
-    super.test_logicalOrExpression_missing_LHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_missing_LHS_RHS() {
-    super.test_logicalOrExpression_missing_LHS_RHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_missing_RHS() {
-    super.test_logicalOrExpression_missing_RHS();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_precedence_logicalAnd_left() {
-    super.test_logicalOrExpression_precedence_logicalAnd_left();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_logicalOrExpression_precedence_logicalAnd_right() {
-    super.test_logicalOrExpression_precedence_logicalAnd_right();
-    dart2Failure();
-  }
-
-  @failingTest
-  void test_method_missingBody() {
-    super.test_method_missingBody();
-  }
-
-  @failingTest
-  void test_missing_commaInArgumentList() {
-    super.test_missing_commaInArgumentList();
-  }
-
-  @failingTest
-  void test_missingComma_beforeNamedArgument() {
-    super.test_missingComma_beforeNamedArgument();
-  }
-
-  @failingTest
-  void test_missingGet() {
-    super.test_missingGet();
-  }
-
-  @failingTest
-  void test_missingIdentifier_afterAnnotation() {
-    super.test_missingIdentifier_afterAnnotation();
-  }
-
-  @failingTest
-  void test_missingSemicolon_varialeDeclarationList() {
-    super.test_missingSemicolon_varialeDeclarationList();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_missing_LHS() {
-    super.test_multiplicativeExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_missing_LHS_RHS() {
-    super.test_multiplicativeExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_missing_RHS() {
-    super.test_multiplicativeExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_missing_RHS_super() {
-    super.test_multiplicativeExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_precedence_unary_left() {
-    super.test_multiplicativeExpression_precedence_unary_left();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_precedence_unary_right() {
-    super.test_multiplicativeExpression_precedence_unary_right();
-  }
-
-  @failingTest
-  void test_multiplicativeExpression_super() {
-    super.test_multiplicativeExpression_super();
-  }
-
-  @failingTest
-  void test_namedParameterOutsideGroup() {
-    super.test_namedParameterOutsideGroup();
-  }
-
-  @failingTest
-  void test_nonStringLiteralUri_import() {
-    super.test_nonStringLiteralUri_import();
-  }
-
-  @failingTest
-  void test_prefixExpression_missing_operand_minus() {
-    super.test_prefixExpression_missing_operand_minus();
-  }
-
-  @failingTest
-  void test_primaryExpression_argumentDefinitionTest() {
-    super.test_primaryExpression_argumentDefinitionTest();
-  }
-
-  @failingTest
-  void test_propertyAccess_missing_LHS_RHS() {
-    super.test_propertyAccess_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_relationalExpression_missing_LHS() {
-    super.test_relationalExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_relationalExpression_missing_LHS_RHS() {
-    super.test_relationalExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_relationalExpression_missing_RHS() {
-    super.test_relationalExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_relationalExpression_precedence_shift_right() {
-    super.test_relationalExpression_precedence_shift_right();
-  }
-
-  @failingTest
-  void test_shiftExpression_missing_LHS() {
-    super.test_shiftExpression_missing_LHS();
-  }
-
-  @failingTest
-  void test_shiftExpression_missing_LHS_RHS() {
-    super.test_shiftExpression_missing_LHS_RHS();
-  }
-
-  @failingTest
-  void test_shiftExpression_missing_RHS() {
-    super.test_shiftExpression_missing_RHS();
-  }
-
-  @failingTest
-  void test_shiftExpression_missing_RHS_super() {
-    super.test_shiftExpression_missing_RHS_super();
-  }
-
-  @failingTest
-  void test_shiftExpression_precedence_unary_left() {
-    super.test_shiftExpression_precedence_unary_left();
-  }
-
-  @failingTest
-  void test_shiftExpression_precedence_unary_right() {
-    super.test_shiftExpression_precedence_unary_right();
-  }
-
-  @failingTest
-  void test_shiftExpression_super() {
-    super.test_shiftExpression_super();
-  }
-
-  @failingTest
-  void test_typedef_eof() {
-    super.test_typedef_eof();
-  }
-
-  @failingTest
-  void test_unaryPlus() {
-    super.test_unaryPlus();
-  }
-}
-
-@reflectiveTest
-class SimpleParserTest_Forest extends FastaBodyBuilderTestCase
-    with SimpleParserTestMixin {
-  SimpleParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_classDeclaration_complexTypeParam() {
-    super.test_classDeclaration_complexTypeParam();
-  }
-
-  @failingTest
-  void test_parseAnnotation_n1() {
-    super.test_parseAnnotation_n1();
-  }
-
-  @failingTest
-  void test_parseAnnotation_n1_a() {
-    super.test_parseAnnotation_n1_a();
-  }
-
-  @failingTest
-  void test_parseAnnotation_n2() {
-    super.test_parseAnnotation_n2();
-  }
-
-  @failingTest
-  void test_parseAnnotation_n2_a() {
-    super.test_parseAnnotation_n2_a();
-  }
-
-  @failingTest
-  void test_parseAnnotation_n3() {
-    super.test_parseAnnotation_n3();
-  }
-
-  @failingTest
-  void test_parseAnnotation_n3_a() {
-    super.test_parseAnnotation_n3_a();
-  }
-
-  @failingTest
-  void test_parseArgumentList_empty() {
-    super.test_parseArgumentList_empty();
-  }
-
-  @failingTest
-  void test_parseArgumentList_mixed() {
-    super.test_parseArgumentList_mixed();
-  }
-
-  @failingTest
-  void test_parseArgumentList_noNamed() {
-    super.test_parseArgumentList_noNamed();
-  }
-
-  @failingTest
-  void test_parseArgumentList_onlyNamed() {
-    super.test_parseArgumentList_onlyNamed();
-  }
-
-  @failingTest
-  void test_parseArgumentList_trailing_comma() {
-    super.test_parseArgumentList_trailing_comma();
-  }
-
-  @failingTest
-  void test_parseArgumentList_typeArguments() {
-    super.test_parseArgumentList_typeArguments();
-  }
-
-  @failingTest
-  void test_parseArgumentList_typeArguments_none() {
-    super.test_parseArgumentList_typeArguments_none();
-  }
-
-  @failingTest
-  void test_parseArgumentList_typeArguments_prefixed() {
-    super.test_parseArgumentList_typeArguments_prefixed();
-  }
-
-  @failingTest
-  void test_parseCombinators_h() {
-    super.test_parseCombinators_h();
-  }
-
-  @failingTest
-  void test_parseCombinators_hs() {
-    super.test_parseCombinators_hs();
-  }
-
-  @failingTest
-  void test_parseCombinators_hshs() {
-    super.test_parseCombinators_hshs();
-  }
-
-  @failingTest
-  void test_parseCombinators_s() {
-    super.test_parseCombinators_s();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_c() {
-    super.test_parseCommentAndMetadata_c();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_cmc() {
-    super.test_parseCommentAndMetadata_cmc();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_cmcm() {
-    super.test_parseCommentAndMetadata_cmcm();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_cmm() {
-    super.test_parseCommentAndMetadata_cmm();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_m() {
-    super.test_parseCommentAndMetadata_m();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_mcm() {
-    super.test_parseCommentAndMetadata_mcm();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_mcmc() {
-    super.test_parseCommentAndMetadata_mcmc();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_mm() {
-    super.test_parseCommentAndMetadata_mm();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_none() {
-    super.test_parseCommentAndMetadata_none();
-  }
-
-  @failingTest
-  void test_parseCommentAndMetadata_singleLine() {
-    super.test_parseCommentAndMetadata_singleLine();
-  }
-
-  @failingTest
-  void test_parseConfiguration_noOperator_dottedIdentifier() {
-    super.test_parseConfiguration_noOperator_dottedIdentifier();
-  }
-
-  @failingTest
-  void test_parseConfiguration_noOperator_simpleIdentifier() {
-    super.test_parseConfiguration_noOperator_simpleIdentifier();
-  }
-
-  @failingTest
-  void test_parseConfiguration_operator_dottedIdentifier() {
-    super.test_parseConfiguration_operator_dottedIdentifier();
-  }
-
-  @failingTest
-  void test_parseConfiguration_operator_simpleIdentifier() {
-    super.test_parseConfiguration_operator_simpleIdentifier();
-  }
-
-  @failingTest
-  void test_parseConstructorName_named_noPrefix() {
-    super.test_parseConstructorName_named_noPrefix();
-  }
-
-  @failingTest
-  void test_parseConstructorName_named_prefixed() {
-    super.test_parseConstructorName_named_prefixed();
-  }
-
-  @failingTest
-  void test_parseConstructorName_unnamed_noPrefix() {
-    super.test_parseConstructorName_unnamed_noPrefix();
-  }
-
-  @failingTest
-  void test_parseConstructorName_unnamed_prefixed() {
-    super.test_parseConstructorName_unnamed_prefixed();
-  }
-
-  @failingTest
-  void test_parseDocumentationComment_block() {
-    super.test_parseDocumentationComment_block();
-  }
-
-  @failingTest
-  void test_parseDocumentationComment_block_withReference() {
-    super.test_parseDocumentationComment_block_withReference();
-  }
-
-  @failingTest
-  void test_parseDocumentationComment_endOfLine() {
-    super.test_parseDocumentationComment_endOfLine();
-  }
-
-  @failingTest
-  void test_parseExtendsClause() {
-    super.test_parseExtendsClause();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_block() {
-    super.test_parseFunctionBody_block();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_block_async() {
-    super.test_parseFunctionBody_block_async();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_block_asyncGenerator() {
-    super.test_parseFunctionBody_block_asyncGenerator();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_block_syncGenerator() {
-    super.test_parseFunctionBody_block_syncGenerator();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_empty() {
-    super.test_parseFunctionBody_empty();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_expression() {
-    super.test_parseFunctionBody_expression();
-  }
-
-  @failingTest
-  void test_parseFunctionBody_expression_async() {
-    super.test_parseFunctionBody_expression_async();
-  }
-
-  @failingTest
-  void test_parseIdentifierList_multiple() {
-    super.test_parseIdentifierList_multiple();
-  }
-
-  @failingTest
-  void test_parseIdentifierList_single() {
-    super.test_parseIdentifierList_single();
-  }
-
-  @failingTest
-  void test_parseImplementsClause_multiple() {
-    super.test_parseImplementsClause_multiple();
-  }
-
-  @failingTest
-  void test_parseImplementsClause_single() {
-    super.test_parseImplementsClause_single();
-  }
-
-  @failingTest
-  void test_parseInstanceCreation_noKeyword_noPrefix() {
-    super.test_parseInstanceCreation_noKeyword_noPrefix();
-  }
-
-  @failingTest
-  void test_parseInstanceCreation_noKeyword_prefix() {
-    super.test_parseInstanceCreation_noKeyword_prefix();
-  }
-
-  @failingTest
-  void test_parseInstanceCreation_noKeyword_varInit() {
-    super.test_parseInstanceCreation_noKeyword_varInit();
-  }
-
-  @failingTest
-  void test_parseLibraryIdentifier_builtin() {
-    super.test_parseLibraryIdentifier_builtin();
-  }
-
-  @failingTest
-  void test_parseLibraryIdentifier_invalid() {
-    super.test_parseLibraryIdentifier_invalid();
-  }
-
-  @failingTest
-  void test_parseLibraryIdentifier_multiple() {
-    super.test_parseLibraryIdentifier_multiple();
-  }
-
-  @failingTest
-  void test_parseLibraryIdentifier_pseudo() {
-    super.test_parseLibraryIdentifier_pseudo();
-  }
-
-  @failingTest
-  void test_parseLibraryIdentifier_single() {
-    super.test_parseLibraryIdentifier_single();
-  }
-
-  @failingTest
-  void test_parseStatement_function_noReturnType() {
-    super.test_parseStatement_function_noReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_noReturnType_noParameters() {
-    super.test_parseTypeAnnotation_function_noReturnType_noParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_noReturnType_parameters() {
-    super.test_parseTypeAnnotation_function_noReturnType_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_noReturnType_typeParameters() {
-    super.test_parseTypeAnnotation_function_noReturnType_typeParameters();
-  }
-
-  @failingTest
-  void
-      test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters() {
-    super
-        .test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_classFunction() {
-    super.test_parseTypeAnnotation_function_returnType_classFunction();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_function() {
-    super.test_parseTypeAnnotation_function_returnType_function();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_noParameters() {
-    super.test_parseTypeAnnotation_function_returnType_noParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_parameters() {
-    super.test_parseTypeAnnotation_function_returnType_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_simple() {
-    super.test_parseTypeAnnotation_function_returnType_simple();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_typeParameters() {
-    super.test_parseTypeAnnotation_function_returnType_typeParameters();
-  }
-
-  @failingTest
-  void
-      test_parseTypeAnnotation_function_returnType_typeParameters_parameters() {
-    super
-        .test_parseTypeAnnotation_function_returnType_typeParameters_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_function_returnType_withArguments() {
-    super.test_parseTypeAnnotation_function_returnType_withArguments();
-  }
-
-  @failingTest
-  void test_parseTypeAnnotation_named() {
-    super.test_parseTypeAnnotation_named();
-  }
-
-  @failingTest
-  void test_parseTypeArgumentList_empty() {
-    super.test_parseTypeArgumentList_empty();
-  }
-
-  @failingTest
-  void test_parseTypeArgumentList_multiple() {
-    super.test_parseTypeArgumentList_multiple();
-  }
-
-  @failingTest
-  void test_parseTypeArgumentList_nested() {
-    super.test_parseTypeArgumentList_nested();
-  }
-
-  @failingTest
-  void test_parseTypeArgumentList_nested_withComment_double() {
-    super.test_parseTypeArgumentList_nested_withComment_double();
-  }
-
-  @failingTest
-  void test_parseTypeArgumentList_nested_withComment_tripple() {
-    super.test_parseTypeArgumentList_nested_withComment_tripple();
-  }
-
-  @failingTest
-  void test_parseTypeArgumentList_single() {
-    super.test_parseTypeArgumentList_single();
-  }
-
-  @failingTest
-  void test_parseTypeName_parameterized() {
-    super.test_parseTypeName_parameterized();
-  }
-
-  @failingTest
-  void test_parseTypeName_simple() {
-    super.test_parseTypeName_simple();
-  }
-
-  @failingTest
-  void test_parseTypeParameter_bounded_functionType_noReturn() {
-    super.test_parseTypeParameter_bounded_functionType_noReturn();
-  }
-
-  @failingTest
-  void test_parseTypeParameter_bounded_functionType_return() {
-    super.test_parseTypeParameter_bounded_functionType_return();
-  }
-
-  @failingTest
-  void test_parseTypeParameter_bounded_generic() {
-    super.test_parseTypeParameter_bounded_generic();
-  }
-
-  @failingTest
-  void test_parseTypeParameter_bounded_simple() {
-    super.test_parseTypeParameter_bounded_simple();
-  }
-
-  @failingTest
-  void test_parseTypeParameter_simple() {
-    super.test_parseTypeParameter_simple();
-  }
-
-  @failingTest
-  void test_parseTypeParameterList_multiple() {
-    super.test_parseTypeParameterList_multiple();
-  }
-
-  @failingTest
-  void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
-    super.test_parseTypeParameterList_parameterizedWithTrailingEquals();
-  }
-
-  @failingTest
-  void test_parseTypeParameterList_parameterizedWithTrailingEquals2() {
-    super.test_parseTypeParameterList_parameterizedWithTrailingEquals2();
-  }
-
-  @failingTest
-  void test_parseTypeParameterList_single() {
-    super.test_parseTypeParameterList_single();
-  }
-
-  @failingTest
-  void test_parseTypeParameterList_withTrailingEquals() {
-    super.test_parseTypeParameterList_withTrailingEquals();
-  }
-
-  @failingTest
-  void test_parseVariableDeclaration_equals() {
-    super.test_parseVariableDeclaration_equals();
-  }
-
-  @failingTest
-  void test_parseVariableDeclaration_noEquals() {
-    super.test_parseVariableDeclaration_noEquals();
-  }
-
-  @failingTest
-  void test_parseWithClause_multiple() {
-    super.test_parseWithClause_multiple();
-  }
-
-  @failingTest
-  void test_parseWithClause_single() {
-    super.test_parseWithClause_single();
-  }
-}
-
-@reflectiveTest
-class StatementParserTest_Forest extends FastaBodyBuilderTestCase
-    with StatementParserTestMixin {
-  StatementParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_invalid_typeParamAnnotation() {
-    super.test_invalid_typeParamAnnotation();
-  }
-
-  @failingTest
-  void test_invalid_typeParamAnnotation2() {
-    super.test_invalid_typeParamAnnotation2();
-  }
-
-  @failingTest
-  void test_invalid_typeParamAnnotation3() {
-    super.test_invalid_typeParamAnnotation3();
-  }
-
-  @failingTest
-  void test_parseForStatement_each_await() {
-    super.test_parseForStatement_each_await();
-  }
-
-  @failingTest
-  void test_parseForStatement_each_genericFunctionType() {
-    super.test_parseForStatement_each_genericFunctionType();
-  }
-
-  @failingTest
-  void test_parseForStatement_each_identifier() {
-    super.test_parseForStatement_each_identifier();
-  }
-
-  @failingTest
-  void test_parseForStatement_each_noType_metadata() {
-    super.test_parseForStatement_each_noType_metadata();
-  }
-
-  @failingTest
-  void test_parseForStatement_each_type() {
-    super.test_parseForStatement_each_type();
-  }
-
-  @failingTest
-  void test_parseForStatement_each_var() {
-    super.test_parseForStatement_each_var();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_c() {
-    super.test_parseForStatement_loop_c();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_cu() {
-    super.test_parseForStatement_loop_cu();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_ecu() {
-    super.test_parseForStatement_loop_ecu();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_i() {
-    super.test_parseForStatement_loop_i();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_i_withMetadata() {
-    super.test_parseForStatement_loop_i_withMetadata();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_ic() {
-    super.test_parseForStatement_loop_ic();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_icu() {
-    super.test_parseForStatement_loop_icu();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_iicuu() {
-    super.test_parseForStatement_loop_iicuu();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_iu() {
-    super.test_parseForStatement_loop_iu();
-  }
-
-  @failingTest
-  void test_parseForStatement_loop_u() {
-    super.test_parseForStatement_loop_u();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclarationStatement() {
-    super.test_parseFunctionDeclarationStatement();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclarationStatement_typeParameterComments() {
-    super.test_parseFunctionDeclarationStatement_typeParameterComments();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclarationStatement_typeParameters() {
-    super.test_parseFunctionDeclarationStatement_typeParameters();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclarationStatement_typeParameters_noReturnType() {
-    super.test_parseFunctionDeclarationStatement_typeParameters_noReturnType();
-  }
-
-  @failingTest
-  void test_parseIfStatement_else_statement() {
-    super.test_parseIfStatement_else_statement();
-  }
-
-  @failingTest
-  void test_parseIfStatement_noElse_statement() {
-    super.test_parseIfStatement_noElse_statement();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_const_object() {
-    super.test_parseNonLabeledStatement_const_object();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_const_object_named_typeParameters() {
-    super.test_parseNonLabeledStatement_const_object_named_typeParameters();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_constructorInvocation() {
-    super.test_parseNonLabeledStatement_constructorInvocation();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_functionDeclaration() {
-    super.test_parseNonLabeledStatement_functionDeclaration();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_functionDeclaration_arguments() {
-    super.test_parseNonLabeledStatement_functionDeclaration_arguments();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_functionExpressionIndex() {
-    super.test_parseNonLabeledStatement_functionExpressionIndex();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_functionInvocation() {
-    super.test_parseNonLabeledStatement_functionInvocation();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_invokeFunctionExpression() {
-    super.test_parseNonLabeledStatement_invokeFunctionExpression();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_localFunction_gftReturnType() {
-    super.test_parseNonLabeledStatement_localFunction_gftReturnType();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
-    super.test_parseNonLabeledStatement_startingWithBuiltInIdentifier();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_typeCast() {
-    super.test_parseNonLabeledStatement_typeCast();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_variableDeclaration_final_namedFunction() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_final_namedFunction();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_variableDeclaration_gftType() {
-    super.test_parseNonLabeledStatement_variableDeclaration_gftType();
-  }
-
-  @failingTest
-  void
-      test_parseNonLabeledStatement_variableDeclaration_gftType_functionReturnType() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_gftType_functionReturnType();
-  }
-
-  @failingTest
-  void
-      test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType();
-  }
-
-  @failingTest
-  void
-      test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType2() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType2();
-  }
-
-  @failingTest
-  void
-      test_parseNonLabeledStatement_variableDeclaration_gftType_noReturnType() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_gftType_noReturnType();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_variableDeclaration_gftType_returnType() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_gftType_returnType();
-  }
-
-  @failingTest
-  void
-      test_parseNonLabeledStatement_variableDeclaration_gftType_voidReturnType() {
-    super
-        .test_parseNonLabeledStatement_variableDeclaration_gftType_voidReturnType();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_variableDeclaration_typeParam() {
-    super.test_parseNonLabeledStatement_variableDeclaration_typeParam();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_variableDeclaration_typeParam2() {
-    super.test_parseNonLabeledStatement_variableDeclaration_typeParam2();
-  }
-
-  @failingTest
-  void test_parseNonLabeledStatement_variableDeclaration_typeParam3() {
-    super.test_parseNonLabeledStatement_variableDeclaration_typeParam3();
-  }
-
-  @failingTest
-  void test_parseStatement_emptyTypeArgumentList() {
-    super.test_parseStatement_emptyTypeArgumentList();
-  }
-
-  @failingTest
-  void test_parseStatement_function_gftReturnType() {
-    super.test_parseStatement_function_gftReturnType();
-  }
-
-  @failingTest
-  void
-      test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() {
-    super
-        .test_parseStatement_functionDeclaration_noReturnType_typeParameterComments();
-  }
-
-  @failingTest
-  void test_parseStatement_functionDeclaration_noReturnType_typeParameters() {
-    super.test_parseStatement_functionDeclaration_noReturnType_typeParameters();
-  }
-
-  @failingTest
-  void test_parseStatement_functionDeclaration_returnType() {
-    super.test_parseStatement_functionDeclaration_returnType();
-  }
-
-  @failingTest
-  void test_parseStatement_functionDeclaration_returnType_typeParameters() {
-    super.test_parseStatement_functionDeclaration_returnType_typeParameters();
-  }
-
-  @failingTest
-  void test_parseSwitchStatement_case() {
-    super.test_parseSwitchStatement_case();
-  }
-
-  @failingTest
-  void test_parseSwitchStatement_empty() {
-    super.test_parseSwitchStatement_empty();
-  }
-
-  @failingTest
-  void test_parseSwitchStatement_labeledCase() {
-    super.test_parseSwitchStatement_labeledCase();
-  }
-
-  @failingTest
-  void test_parseSwitchStatement_labeledDefault() {
-    super.test_parseSwitchStatement_labeledDefault();
-  }
-
-  @failingTest
-  void test_parseSwitchStatement_labeledStatementInCase() {
-    super.test_parseSwitchStatement_labeledStatementInCase();
-  }
-
-  @failingTest
-  void test_parseTryStatement_catch() {
-    super.test_parseTryStatement_catch();
-  }
-
-  @failingTest
-  void test_parseTryStatement_catch_error_missingCatchParam() {
-    super.test_parseTryStatement_catch_error_missingCatchParam();
-  }
-
-  @failingTest
-  void test_parseTryStatement_catch_error_missingCatchParen() {
-    super.test_parseTryStatement_catch_error_missingCatchParen();
-  }
-
-  @failingTest
-  void test_parseTryStatement_catch_error_missingCatchTrace() {
-    super.test_parseTryStatement_catch_error_missingCatchTrace();
-  }
-
-  @failingTest
-  void test_parseTryStatement_catch_finally() {
-    super.test_parseTryStatement_catch_finally();
-  }
-
-  @failingTest
-  void test_parseTryStatement_multiple() {
-    super.test_parseTryStatement_multiple();
-  }
-
-  @failingTest
-  void test_parseTryStatement_on() {
-    super.test_parseTryStatement_on();
-  }
-
-  @failingTest
-  void test_parseTryStatement_on_catch() {
-    super.test_parseTryStatement_on_catch();
-  }
-
-  @failingTest
-  void test_parseTryStatement_on_catch_finally() {
-    super.test_parseTryStatement_on_catch_finally();
-  }
-
-  @failingTest
-  void test_parseVariableDeclaration_equals_builtIn() {
-    super.test_parseVariableDeclaration_equals_builtIn();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_const_noType() {
-    super.test_parseVariableDeclarationListAfterMetadata_const_noType();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_const_type() {
-    super.test_parseVariableDeclarationListAfterMetadata_const_type();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_const_typeComment() {
-    super.test_parseVariableDeclarationListAfterMetadata_const_typeComment();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_dynamic_typeComment() {
-    super.test_parseVariableDeclarationListAfterMetadata_dynamic_typeComment();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_final_noType() {
-    super.test_parseVariableDeclarationListAfterMetadata_final_noType();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_final_type() {
-    super.test_parseVariableDeclarationListAfterMetadata_final_type();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_final_typeComment() {
-    super.test_parseVariableDeclarationListAfterMetadata_final_typeComment();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_type_multiple() {
-    super.test_parseVariableDeclarationListAfterMetadata_type_multiple();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_type_single() {
-    super.test_parseVariableDeclarationListAfterMetadata_type_single();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_type_typeComment() {
-    super.test_parseVariableDeclarationListAfterMetadata_type_typeComment();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_var_multiple() {
-    super.test_parseVariableDeclarationListAfterMetadata_var_multiple();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_var_single() {
-    super.test_parseVariableDeclarationListAfterMetadata_var_single();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationListAfterMetadata_var_typeComment() {
-    super.test_parseVariableDeclarationListAfterMetadata_var_typeComment();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationStatementAfterMetadata_multiple() {
-    super.test_parseVariableDeclarationStatementAfterMetadata_multiple();
-  }
-
-  @failingTest
-  void test_parseVariableDeclarationStatementAfterMetadata_single() {
-    super.test_parseVariableDeclarationStatementAfterMetadata_single();
-  }
-
-  @failingTest
-  void test_parseYieldStatement_each() {
-    super.test_parseYieldStatement_each();
-  }
-
-  @failingTest
-  void test_parseYieldStatement_normal() {
-    super.test_parseYieldStatement_normal();
-  }
-}
-
-@reflectiveTest
-class TopLevelParserTest_Forest extends FastaBodyBuilderTestCase
-    with TopLevelParserTestMixin {
-  TopLevelParserTest_Forest() : super(false);
-
-  @failingTest
-  void test_function_literal_allowed_at_toplevel() {
-    super.test_function_literal_allowed_at_toplevel();
-  }
-
-  @failingTest
-  void
-      test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() {
-    super
-        .test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void
-      test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() {
-    super
-        .test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void
-      test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() {
-    super
-        .test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void
-      test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() {
-    super
-        .test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void
-      test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() {
-    super
-        .test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void
-      test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() {
-    super
-        .test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer();
-  }
-
-  @failingTest
-  void test_import_as_show() {
-    super.test_import_as_show();
-  }
-
-  @failingTest
-  void test_import_show_hide() {
-    super.test_import_show_hide();
-  }
-
-  @failingTest
-  void test_import_withDocComment() {
-    super.test_import_withDocComment();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_abstract() {
-    super.test_parseClassDeclaration_abstract();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_empty() {
-    super.test_parseClassDeclaration_empty();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_extends() {
-    super.test_parseClassDeclaration_extends();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_extendsAndImplements() {
-    super.test_parseClassDeclaration_extendsAndImplements();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_extendsAndWith() {
-    super.test_parseClassDeclaration_extendsAndWith();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_extendsAndWithAndImplements() {
-    super.test_parseClassDeclaration_extendsAndWithAndImplements();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_implements() {
-    super.test_parseClassDeclaration_implements();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_metadata() {
-    super.test_parseClassDeclaration_metadata();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_native() {
-    super.test_parseClassDeclaration_native();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_nonEmpty() {
-    super.test_parseClassDeclaration_nonEmpty();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_typeAlias_implementsC() {
-    super.test_parseClassDeclaration_typeAlias_implementsC();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_typeAlias_withB() {
-    super.test_parseClassDeclaration_typeAlias_withB();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_typeParameters() {
-    super.test_parseClassDeclaration_typeParameters();
-  }
-
-  @failingTest
-  void test_parseClassDeclaration_withDocumentationComment() {
-    super.test_parseClassDeclaration_withDocumentationComment();
-  }
-
-  @failingTest
-  void test_parseClassTypeAlias_withDocumentationComment() {
-    super.test_parseClassTypeAlias_withDocumentationComment();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
-    super.test_parseCompilationUnit_abstractAsPrefix_parameterized();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_builtIn_asFunctionName() {
-    super.test_parseCompilationUnit_builtIn_asFunctionName();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter() {
-    super.test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_builtIn_asGetter() {
-    super.test_parseCompilationUnit_builtIn_asGetter();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_directives_multiple() {
-    super.test_parseCompilationUnit_directives_multiple();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_directives_single() {
-    super.test_parseCompilationUnit_directives_single();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_empty() {
-    super.test_parseCompilationUnit_empty();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_exportAsPrefix() {
-    super.test_parseCompilationUnit_exportAsPrefix();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_exportAsPrefix_parameterized() {
-    super.test_parseCompilationUnit_exportAsPrefix_parameterized();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
-    super.test_parseCompilationUnit_operatorAsPrefix_parameterized();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_pseudo_prefixed() {
-    super.test_parseCompilationUnit_pseudo_prefixed();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_script() {
-    super.test_parseCompilationUnit_script();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
-    super.test_parseCompilationUnit_skipFunctionBody_withInterpolation();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_topLevelDeclaration() {
-    super.test_parseCompilationUnit_topLevelDeclaration();
-  }
-
-  @failingTest
-  void test_parseCompilationUnit_typedefAsPrefix() {
-    super.test_parseCompilationUnit_typedefAsPrefix();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_abstractAsPrefix() {
-    super.test_parseCompilationUnitMember_abstractAsPrefix();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_class() {
-    super.test_parseCompilationUnitMember_class();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_classTypeAlias() {
-    super.test_parseCompilationUnitMember_classTypeAlias();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_constVariable() {
-    super.test_parseCompilationUnitMember_constVariable();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_expressionFunctionBody_tokens() {
-    super.test_parseCompilationUnitMember_expressionFunctionBody_tokens();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_finalVariable() {
-    super.test_parseCompilationUnitMember_finalVariable();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_external_noType() {
-    super.test_parseCompilationUnitMember_function_external_noType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_external_type() {
-    super.test_parseCompilationUnitMember_function_external_type();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_generic_noReturnType() {
-    super.test_parseCompilationUnitMember_function_generic_noReturnType();
-  }
-
-  @failingTest
-  void
-      test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
-    super
-        .test_parseCompilationUnitMember_function_generic_noReturnType_annotated();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_generic_returnType() {
-    super.test_parseCompilationUnitMember_function_generic_returnType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_generic_void() {
-    super.test_parseCompilationUnitMember_function_generic_void();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_gftReturnType() {
-    super.test_parseCompilationUnitMember_function_gftReturnType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_noReturnType() {
-    super.test_parseCompilationUnitMember_function_noReturnType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_noType() {
-    super.test_parseCompilationUnitMember_function_noType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_type() {
-    super.test_parseCompilationUnitMember_function_type();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_function_void() {
-    super.test_parseCompilationUnitMember_function_void();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_getter_external_noType() {
-    super.test_parseCompilationUnitMember_getter_external_noType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_getter_external_type() {
-    super.test_parseCompilationUnitMember_getter_external_type();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_getter_noType() {
-    super.test_parseCompilationUnitMember_getter_noType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_getter_type() {
-    super.test_parseCompilationUnitMember_getter_type();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_setter_external_noType() {
-    super.test_parseCompilationUnitMember_setter_external_noType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_setter_external_type() {
-    super.test_parseCompilationUnitMember_setter_external_type();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_setter_noType() {
-    super.test_parseCompilationUnitMember_setter_noType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_setter_type() {
-    super.test_parseCompilationUnitMember_setter_type();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typeAlias_abstract() {
-    super.test_parseCompilationUnitMember_typeAlias_abstract();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typeAlias_generic() {
-    super.test_parseCompilationUnitMember_typeAlias_generic();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typeAlias_implements() {
-    super.test_parseCompilationUnitMember_typeAlias_implements();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typeAlias_noImplements() {
-    super.test_parseCompilationUnitMember_typeAlias_noImplements();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typedef() {
-    super.test_parseCompilationUnitMember_typedef();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typedef_withDocComment() {
-    super.test_parseCompilationUnitMember_typedef_withDocComment();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_typedVariable() {
-    super.test_parseCompilationUnitMember_typedVariable();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_variable() {
-    super.test_parseCompilationUnitMember_variable();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_variable_gftType_gftReturnType() {
-    super.test_parseCompilationUnitMember_variable_gftType_gftReturnType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_variable_gftType_noReturnType() {
-    super.test_parseCompilationUnitMember_variable_gftType_noReturnType();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_variable_withDocumentationComment() {
-    super.test_parseCompilationUnitMember_variable_withDocumentationComment();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_variableGet() {
-    super.test_parseCompilationUnitMember_variableGet();
-  }
-
-  @failingTest
-  void test_parseCompilationUnitMember_variableSet() {
-    super.test_parseCompilationUnitMember_variableSet();
-  }
-
-  @failingTest
-  void test_parseDirective_export() {
-    super.test_parseDirective_export();
-  }
-
-  @failingTest
-  void test_parseDirective_export_withDocComment() {
-    super.test_parseDirective_export_withDocComment();
-  }
-
-  @failingTest
-  void test_parseDirective_import() {
-    super.test_parseDirective_import();
-  }
-
-  @failingTest
-  void test_parseDirective_library() {
-    super.test_parseDirective_library();
-  }
-
-  @failingTest
-  void test_parseDirective_library_1_component() {
-    super.test_parseDirective_library_1_component();
-  }
-
-  @failingTest
-  void test_parseDirective_library_2_components() {
-    super.test_parseDirective_library_2_components();
-  }
-
-  @failingTest
-  void test_parseDirective_library_3_components() {
-    super.test_parseDirective_library_3_components();
-  }
-
-  @failingTest
-  void test_parseDirective_library_withDocumentationComment() {
-    super.test_parseDirective_library_withDocumentationComment();
-  }
-
-  @failingTest
-  void test_parseDirective_part() {
-    super.test_parseDirective_part();
-  }
-
-  @failingTest
-  void test_parseDirective_part_of_1_component() {
-    super.test_parseDirective_part_of_1_component();
-  }
-
-  @failingTest
-  void test_parseDirective_part_of_2_components() {
-    super.test_parseDirective_part_of_2_components();
-  }
-
-  @failingTest
-  void test_parseDirective_part_of_3_components() {
-    super.test_parseDirective_part_of_3_components();
-  }
-
-  @failingTest
-  void test_parseDirective_part_of_withDocumentationComment() {
-    super.test_parseDirective_part_of_withDocumentationComment();
-  }
-
-  @failingTest
-  void test_parseDirective_part_withDocumentationComment() {
-    super.test_parseDirective_part_withDocumentationComment();
-  }
-
-  @failingTest
-  void test_parseDirective_partOf() {
-    super.test_parseDirective_partOf();
-  }
-
-  @failingTest
-  void test_parseDirectives_complete() {
-    super.test_parseDirectives_complete();
-  }
-
-  @failingTest
-  void test_parseDirectives_empty() {
-    super.test_parseDirectives_empty();
-  }
-
-  @failingTest
-  void test_parseDirectives_mixed() {
-    super.test_parseDirectives_mixed();
-  }
-
-  @failingTest
-  void test_parseDirectives_multiple() {
-    super.test_parseDirectives_multiple();
-  }
-
-  @failingTest
-  void test_parseDirectives_script() {
-    super.test_parseDirectives_script();
-  }
-
-  @failingTest
-  void test_parseDirectives_single() {
-    super.test_parseDirectives_single();
-  }
-
-  @failingTest
-  void test_parseDirectives_topLevelDeclaration() {
-    super.test_parseDirectives_topLevelDeclaration();
-  }
-
-  @failingTest
-  void test_parseEnumDeclaration_one() {
-    super.test_parseEnumDeclaration_one();
-  }
-
-  @failingTest
-  void test_parseEnumDeclaration_trailingComma() {
-    super.test_parseEnumDeclaration_trailingComma();
-  }
-
-  @failingTest
-  void test_parseEnumDeclaration_two() {
-    super.test_parseEnumDeclaration_two();
-  }
-
-  @failingTest
-  void test_parseEnumDeclaration_withDocComment_onEnum() {
-    super.test_parseEnumDeclaration_withDocComment_onEnum();
-  }
-
-  @failingTest
-  void test_parseEnumDeclaration_withDocComment_onValue() {
-    super.test_parseEnumDeclaration_withDocComment_onValue();
-  }
-
-  @failingTest
-  void test_parseExportDirective_configuration_multiple() {
-    super.test_parseExportDirective_configuration_multiple();
-  }
-
-  @failingTest
-  void test_parseExportDirective_configuration_single() {
-    super.test_parseExportDirective_configuration_single();
-  }
-
-  @failingTest
-  void test_parseExportDirective_hide() {
-    super.test_parseExportDirective_hide();
-  }
-
-  @failingTest
-  void test_parseExportDirective_hide_show() {
-    super.test_parseExportDirective_hide_show();
-  }
-
-  @failingTest
-  void test_parseExportDirective_noCombinator() {
-    super.test_parseExportDirective_noCombinator();
-  }
-
-  @failingTest
-  void test_parseExportDirective_show() {
-    super.test_parseExportDirective_show();
-  }
-
-  @failingTest
-  void test_parseExportDirective_show_hide() {
-    super.test_parseExportDirective_show_hide();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclaration_function() {
-    super.test_parseFunctionDeclaration_function();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclaration_functionWithTypeParameters() {
-    super.test_parseFunctionDeclaration_functionWithTypeParameters();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclaration_getter() {
-    super.test_parseFunctionDeclaration_getter();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclaration_metadata() {
-    super.test_parseFunctionDeclaration_metadata();
-  }
-
-  @failingTest
-  void test_parseFunctionDeclaration_setter() {
-    super.test_parseFunctionDeclaration_setter();
-  }
-
-  @failingTest
-  void test_parseGenericTypeAlias_noTypeParameters() {
-    super.test_parseGenericTypeAlias_noTypeParameters();
-  }
-
-  @failingTest
-  void test_parseGenericTypeAlias_typeParameters() {
-    super.test_parseGenericTypeAlias_typeParameters();
-  }
-
-  @failingTest
-  void test_parseImportDirective_configuration_multiple() {
-    super.test_parseImportDirective_configuration_multiple();
-  }
-
-  @failingTest
-  void test_parseImportDirective_configuration_single() {
-    super.test_parseImportDirective_configuration_single();
-  }
-
-  @failingTest
-  void test_parseImportDirective_deferred() {
-    super.test_parseImportDirective_deferred();
-  }
-
-  @failingTest
-  void test_parseImportDirective_hide() {
-    super.test_parseImportDirective_hide();
-  }
-
-  @failingTest
-  void test_parseImportDirective_noCombinator() {
-    super.test_parseImportDirective_noCombinator();
-  }
-
-  @failingTest
-  void test_parseImportDirective_prefix() {
-    super.test_parseImportDirective_prefix();
-  }
-
-  @failingTest
-  void test_parseImportDirective_prefix_hide_show() {
-    super.test_parseImportDirective_prefix_hide_show();
-  }
-
-  @failingTest
-  void test_parseImportDirective_prefix_show_hide() {
-    super.test_parseImportDirective_prefix_show_hide();
-  }
-
-  @failingTest
-  void test_parseImportDirective_show() {
-    super.test_parseImportDirective_show();
-  }
-
-  @failingTest
-  void test_parseLibraryDirective() {
-    super.test_parseLibraryDirective();
-  }
-
-  @failingTest
-  void test_parsePartDirective() {
-    super.test_parsePartDirective();
-  }
-
-  @failingTest
-  void test_parsePartOfDirective_name() {
-    super.test_parsePartOfDirective_name();
-  }
-
-  @failingTest
-  void test_parsePartOfDirective_uri() {
-    super.test_parsePartOfDirective_uri();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_function_noParameters() {
-    super.test_parseTypeAlias_function_noParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_function_noReturnType() {
-    super.test_parseTypeAlias_function_noReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_function_parameterizedReturnType() {
-    super.test_parseTypeAlias_function_parameterizedReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_function_parameters() {
-    super.test_parseTypeAlias_function_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_function_typeParameters() {
-    super.test_parseTypeAlias_function_typeParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_function_voidReturnType() {
-    super.test_parseTypeAlias_function_voidReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_noParameters() {
-    super.test_parseTypeAlias_genericFunction_noParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_noReturnType() {
-    super.test_parseTypeAlias_genericFunction_noReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_parameterizedReturnType() {
-    super.test_parseTypeAlias_genericFunction_parameterizedReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_parameters() {
-    super.test_parseTypeAlias_genericFunction_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters() {
-    super.test_parseTypeAlias_genericFunction_typeParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_noParameters() {
-    super.test_parseTypeAlias_genericFunction_typeParameters_noParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() {
-    super.test_parseTypeAlias_genericFunction_typeParameters_noReturnType();
-  }
-
-  @failingTest
-  void
-      test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() {
-    super
-        .test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_parameters() {
-    super.test_parseTypeAlias_genericFunction_typeParameters_parameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() {
-    super.test_parseTypeAlias_genericFunction_typeParameters_typeParameters();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() {
-    super.test_parseTypeAlias_genericFunction_typeParameters_voidReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_voidReturnType() {
-    super.test_parseTypeAlias_genericFunction_voidReturnType();
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_withDocComment() {
-    super.test_parseTypeAlias_genericFunction_withDocComment();
-  }
-
-  @failingTest
-  void test_parseTypeVariable_withDocumentationComment() {
-    super.test_parseTypeVariable_withDocumentationComment();
-  }
-}
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 234c2ff..b0bd5c2 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
@@ -261,20 +261,6 @@
 
   @override
   @failingTest
-  test_invalidAssignment_defaultValue_named() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
-    await super.test_invalidAssignment_defaultValue_named();
-  }
-
-  @override
-  @failingTest
-  test_invalidAssignment_defaultValue_optional() async {
-    // UnimplementedError: kernel: (Let) let final dynamic #t2 = 0 in let ...
-    await super.test_invalidAssignment_defaultValue_optional();
-  }
-
-  @override
-  @failingTest
   test_invalidAssignment_dynamic() async {
     // Bad state: No reference information for dynamic at 11
     await super.test_invalidAssignment_dynamic();
@@ -719,6 +705,13 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_undefinedGetter_proxy_annotation_fakeProxy() async {
+    await super.test_undefinedGetter_proxy_annotation_fakeProxy();
+  }
+
+  @override
+  @failingTest
   test_undefinedGetter_static() async {
     // Bad state: No reference information for A at 19
     await super.test_undefinedGetter_static();
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 9157b6d..0e94294 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -653,13 +653,6 @@
 
   @override
   @failingTest
-  test_notInstantiatedBound_ok_class_function() {
-    // Failed to resolve 1 nodes
-    return super.test_notInstantiatedBound_ok_class_function();
-  }
-
-  @override
-  @failingTest
   test_objectMethodOnFunctions_Typedef() {
     // UnimplementedError: TODO(paulberry): resynthesize generic typedef
     return super.test_objectMethodOnFunctions_Typedef();
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 1414b83..a84ddc6 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4107,7 +4107,7 @@
 
   test_notInstantiatedBound_ok_class_function() async {
     String code = r'''
-class A<T extends void Function<Z>()> {}
+class A<T extends void Function()> {}
 class B<T extends A> {}
 ''';
     await resolveTestUnit(code);
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index ef889c4..52a3081 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -42,7 +42,6 @@
 import 'non_hint_code_test.dart' as non_hint_code_test;
 import 'package_test.dart' as package_test;
 import 'parser_fasta_test.dart' as parser_fasta_test;
-import 'parser_forest_test.dart' as parser_forest_test;
 import 'parser_test.dart' as parser_test;
 import 'resolver_driver_test.dart' as resolver_driver_test;
 import 'resolver_kernel_test.dart' as resolver_kernel_test;
@@ -108,7 +107,6 @@
     non_hint_code_test.main();
     package_test.main();
     parser_fasta_test.main();
-    parser_forest_test.main();
     parser_test.main();
     resolver_driver_test.main();
     resolver_kernel_test.main();
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 830cd0f..4bb1b75 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -31,8 +31,6 @@
   @override
   bool get useCFE => true;
 
-//  @failingTest
-//  @potentialAnalyzerProblem
   @override
   test_asyncChangesDuringAnalysis_getErrors() async {
     // TODO(brianwilkerson) Re-enable this test. It was disabled because it
@@ -54,6 +52,13 @@
 //    await super.test_asyncChangesDuringAnalysis_getErrors();
   }
 
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_const_annotation_notConstConstructor() async {
+    await super.test_const_annotation_notConstConstructor();
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   @override
@@ -61,6 +66,27 @@
     await super.test_const_annotation_withArgs();
   }
 
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_const_annotation_withoutArgs() async {
+    await super.test_const_annotation_withoutArgs();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_const_circular_reference() async {
+    await super.test_const_circular_reference();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_const_dependency_sameUnit() async {
+    await super.test_const_dependency_sameUnit();
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   @override
@@ -82,6 +108,13 @@
     await super.test_const_implicitSuperConstructorInvocation();
   }
 
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_const_simple_topLevelVariable() async {
+    await super.test_const_simple_topLevelVariable();
+  }
+
   @failingTest
   @potentialAnalyzerProblem
   @override
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 2422f69..ce897ed 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
@@ -23,6 +23,27 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_annotation() async {
+    await super.test_annotation();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_annotation_constructor_withNestedConstructorInvocation() async {
+    await super.test_annotation_constructor_withNestedConstructorInvocation();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_annotation_kind_reference() async {
+    await super.test_annotation_kind_reference();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_annotation_prefixed_classConstructor() {
     // TODO(paulberry): broken because prefixes are not working properly
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index d667f0e..d3573f1 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -1646,6 +1646,23 @@
     }
   }
 
+  test_subtypes_partWithoutLibrary() async {
+    await _resolveTestUnit('''
+part of lib;
+
+class A {}
+class B extends A {}
+''');
+    ClassElement a = _findElement('A');
+
+    List<SubtypeResult> subtypes = await driver.search.subtypes(type: a);
+    expect(subtypes, hasLength(1));
+
+    SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
+    expect(b.libraryUri, testUri);
+    expect(b.id, '$testUri;$testUri;B');
+  }
+
   test_subtypes_discover() async {
     var pathT = _p('/test/lib/t.dart');
     var pathA = _p('/aaa/lib/a.dart');
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
index 66b2d52..22a2cc8 100644
--- a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -5,41 +5,24 @@
 import 'dart:async';
 import 'dart:io' show File;
 
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/fasta/ast_body_builder.dart';
-import 'package:analyzer/src/generated/parser.dart' as analyzer;
-import 'package:analyzer/src/generated/resolver.dart';
 import "package:front_end/src/api_prototype/front_end.dart";
 import "package:front_end/src/api_prototype/memory_file_system.dart";
 import "package:front_end/src/base/processed_options.dart";
 import "package:front_end/src/compute_platform_binaries_location.dart";
 import 'package:front_end/src/fasta/compiler_context.dart';
-import 'package:front_end/src/fasta/constant_context.dart';
 import 'package:front_end/src/fasta/dill/dill_target.dart';
 import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/forest.dart' hide Identifier;
-import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
 import "package:front_end/src/fasta/kernel/kernel_target.dart";
-import 'package:front_end/src/fasta/modifier.dart' as Modifier;
-import 'package:front_end/src/fasta/parser/async_modifier.dart';
-import 'package:front_end/src/fasta/parser/parser.dart';
-import 'package:front_end/src/fasta/scanner.dart';
 import 'package:front_end/src/fasta/ticker.dart';
-import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
-import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:front_end/src/fasta/uri_translator_impl.dart';
 import 'package:kernel/class_hierarchy.dart' as kernel;
 import 'package:kernel/core_types.dart' as kernel;
 import 'package:kernel/kernel.dart' as kernel;
 import 'package:test/test.dart';
 
-import '../../generated/parser_test.dart';
-import '../../generated/test_support.dart';
-
 Element _buildElement(kernel.Class coreType) {
   ClassElementImpl element =
       new ClassElementImpl(coreType.name, coreType.fileOffset);
@@ -54,7 +37,6 @@
 
 class CompilerTestContext extends CompilerContext {
   KernelTarget kernelTarget;
-  TypeProvider _typeProvider;
 
   CompilerTestContext(ProcessedOptions options) : super(options);
 
@@ -139,9 +121,6 @@
       ]) {
         map[coreType.name] = _buildElement(coreType);
       }
-      Namespace namespace = new Namespace(map);
-      c._typeProvider =
-          new TypeProviderImpl.forNamespaces(namespace, namespace);
 
       T result;
       Completer<T> completer = new Completer<T>();
@@ -160,651 +139,3 @@
 
   static CompilerTestContext get current => CompilerContext.current;
 }
-
-/// Implementation of [AbstractParserTestCase] specialized for testing building
-/// Analyzer AST using the fasta [Forest] API.
-class FastaBodyBuilderTestCase extends Object
-    with ParserTestHelpers
-    implements AbstractParserTestCase {
-  final bool resolveTypes;
-
-  String content;
-
-  /// The expected offset of the next token to be parsed after the parser has
-  /// finished parsing, or `null` (the default) if EOF is expected.
-  int expectedEndOffset;
-
-  @override
-  void set enableGenericMethodComments(_) {
-    // Ignored.
-  }
-
-  FastaBodyBuilderTestCase(this.resolveTypes);
-
-  analyzer.Parser get parser => new ParserProxy(this);
-
-  TypeProvider get typeProvider => CompilerTestContext.current._typeProvider;
-
-  bool get usingFastaParser => true;
-
-  @override
-  void assertNoErrors() {
-    // TODO(brianwilkerson) Implement this.
-  }
-
-  void createParser(String content, {int expectedEndOffset}) {
-    this.content = content;
-    this.expectedEndOffset = expectedEndOffset;
-  }
-
-  @override
-  void expectNotNullIfNoErrors(Object result) {
-    // TODO(brianwilkerson) Implement this.
-  }
-
-  @override
-  ExpectedError expectedError(ErrorCode code, int offset, int length) {
-    return new ExpectedError(code, offset, length);
-  }
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  Expression parseAdditiveExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseAssignableExpression(String code, bool primaryAllowed) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseAssignableSelector(String code, bool optional,
-      {bool allowConditional: true}) {
-    return parseExpression(code);
-  }
-
-  @override
-  AwaitExpression parseAwaitExpression(String code) {
-    return parseExpression(code, inAsync: true);
-  }
-
-  @override
-  Expression parseBitwiseAndExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseBitwiseOrExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseBitwiseXorExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseCascadeSection(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  CompilationUnit parseCompilationUnit(String source,
-      {List<ErrorCode> codes, List<ExpectedError> errors}) {
-    return _parse(source, (parser, token) => parser.parseUnit(token.next));
-  }
-
-  @override
-  ConditionalExpression parseConditionalExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseConstExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  ConstructorInitializer parseConstructorInitializer(String code) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  CompilationUnit parseDirectives(String source,
-      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
-    return parseCompilationUnit(content, codes: errorCodes);
-  }
-
-  @override
-  BinaryExpression parseEqualityExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseExpression(String source,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      int expectedEndOffset,
-      bool inAsync: false,
-      bool inCatchBlock: false}) {
-    // TODO(brianwilkerson) Check error codes.
-    Object result = _parse(
-        source, (parser, token) => parser.parseExpression(token),
-        inAsync: inAsync, inCatchBlock: inCatchBlock);
-    if (result is Generator) {
-      result = (result as Generator).buildForEffect();
-    }
-    if (result is! Expression) {
-      throw new StateError('Expected Expression, found ${result.runtimeType}');
-    }
-    return result;
-  }
-
-  @override
-  List<Expression> parseExpressionList(String code) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parseExpressionWithoutCascade(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  FormalParameter parseFormalParameter(String code, ParameterKind kind,
-      {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  FormalParameterList parseFormalParameterList(String code,
-      {bool inFunctionType: false,
-      List<ErrorCode> errorCodes: const <ErrorCode>[],
-      List<ExpectedError> errors}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  CompilationUnitMember parseFullCompilationUnitMember() {
-    CompilationUnit unit = parseCompilationUnit(content);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    return unit.declarations[0];
-  }
-
-  @override
-  Directive parseFullDirective() {
-    CompilationUnit unit = parseCompilationUnit(content);
-    expect(unit.directives, hasLength(1));
-    expect(unit.declarations, hasLength(0));
-    return unit.directives[0];
-  }
-
-  @override
-  FunctionExpression parseFunctionExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  InstanceCreationExpression parseInstanceCreationExpression(
-      String code, Token newToken) {
-    return parseExpression(code);
-  }
-
-  @override
-  ListLiteral parseListLiteral(
-      Token token, String typeArgumentsCode, String code) {
-    StringBuffer buffer = new StringBuffer();
-    if (token != null) {
-      buffer.write(token.lexeme);
-      buffer.write(' ');
-    }
-    if (typeArgumentsCode != null) {
-      buffer.write(typeArgumentsCode);
-    }
-    buffer.write(code);
-    return parseExpression(buffer.toString());
-  }
-
-  @override
-  TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseLogicalAndExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseLogicalOrExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  MapLiteral parseMapLiteral(
-      Token token, String typeArgumentsCode, String code) {
-    StringBuffer buffer = new StringBuffer();
-    if (token != null) {
-      buffer.write(token.lexeme);
-      buffer.write(' ');
-    }
-    if (typeArgumentsCode != null) {
-      buffer.write(typeArgumentsCode);
-    }
-    buffer.write(code);
-    return parseExpression(buffer.toString());
-  }
-
-  @override
-  MapLiteralEntry parseMapLiteralEntry(String code) {
-    Expression expression = parseExpression('{$code}');
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
-    expect(literal.entries, hasLength(1));
-    return literal.entries[0];
-  }
-
-  @override
-  Expression parseMultiplicativeExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  InstanceCreationExpression parseNewExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  NormalFormalParameter parseNormalFormalParameter(String code,
-      {bool inFunctionType: false,
-      List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parsePostfixExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Identifier parsePrefixedIdentifier(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parsePrimaryExpression(String code,
-      {int expectedEndOffset, List<ExpectedError> errors}) {
-    return parseExpression(code,
-        expectedEndOffset: expectedEndOffset, errors: errors);
-  }
-
-  @override
-  Expression parseRelationalExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  RethrowExpression parseRethrowExpression(String code) {
-    Statement statement = parseStatement(code, inCatchBlock: true);
-    expect(statement, new isInstanceOf<ExpressionStatement>());
-    Expression expression = (statement as ExpressionStatement).expression;
-    expect(expression, new isInstanceOf<RethrowExpression>());
-    return expression;
-  }
-
-  @override
-  BinaryExpression parseShiftExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  SimpleIdentifier parseSimpleIdentifier(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Statement parseStatement(String source,
-      {bool enableLazyAssignmentOperators,
-      int expectedEndOffset,
-      bool inCatchBlock: true}) {
-    // TODO(brianwilkerson) Check error codes.
-    return _parse(source, (parser, token) => parser.parseStatement(token),
-        inCatchBlock: inCatchBlock);
-  }
-
-  @override
-  Expression parseStringLiteral(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  SymbolLiteral parseSymbolLiteral(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseThrowExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseThrowExpressionWithoutCascade(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  PrefixExpression parseUnaryExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  VariableDeclarationList parseVariableDeclarationList(String source) {
-    CompilationUnit unit = parseCompilationUnit('''
-f() {
-  $source;
-}
-''');
-    FunctionDeclaration function = unit.declarations[0];
-    BlockFunctionBody body = function.functionExpression.body;
-    VariableDeclarationStatement statement = body.block.statements[0];
-    return statement.variables;
-  }
-
-  T _parse<T>(
-      String source, void parseFunction(Parser parser, Token previousToken),
-      {bool inAsync: false, bool inCatchBlock: false}) {
-    ScannerResult scan = scanString(source);
-
-    CompilerTestContext c = CompilerTestContext.current;
-    KernelLibraryBuilder library = new KernelLibraryBuilder(
-      c.entryPoint,
-      c.entryPoint,
-      c.kernelTarget.loader,
-      null /* actualOrigin */,
-      null /* enclosingLibrary */,
-    );
-    List<KernelTypeVariableBuilder> typeVariableBuilders =
-        <KernelTypeVariableBuilder>[];
-    List<KernelFormalParameterBuilder> formalParameterBuilders =
-        <KernelFormalParameterBuilder>[];
-    KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
-        null /* metadata */,
-        Modifier.staticMask /* or Modifier.varMask */,
-        c.kernelTarget.dynamicType,
-        "analyzerTest",
-        typeVariableBuilders,
-        formalParameterBuilders,
-        kernel.ProcedureKind.Method,
-        library,
-        -1 /* charOffset */,
-        -1 /* charOpenParenOffset */,
-        -1 /* charEndOffset */);
-
-    TypeInferrerDisabled typeInferrer =
-        new TypeInferrerDisabled(new TypeSchemaEnvironment(
-      c.kernelTarget.loader.coreTypes,
-      c.kernelTarget.loader.hierarchy,
-      // TODO(danrubel): Enable strong mode.
-      false /* strong mode */,
-    ));
-
-    AstBodyBuilder builder = new AstBodyBuilder(
-      library,
-      procedureBuilder,
-      new UnlinkedScope(),
-      null,
-      c.kernelTarget.loader.hierarchy,
-      c.kernelTarget.loader.coreTypes,
-      null /* classBuilder */,
-      false /* isInstanceMember */,
-      null /* uri */,
-      typeInferrer,
-      typeProvider,
-    )..constantContext = ConstantContext.none; // .inferred ?
-
-    Parser parser = new Parser(builder);
-    if (inAsync) {
-      parser.asyncState = AsyncModifier.Async;
-    }
-    if (inCatchBlock) {
-      builder.inCatchBlock = inCatchBlock;
-    }
-    parseFunction(parser, parser.syntheticPreviousToken(scan.tokens));
-    // TODO(brianwilkerson) Check `expectedEndOffset` if it is not `null`.
-    return builder.pop();
-  }
-}
-
-/// A parser that can be used by [FastaBodyBuilderTestCase] to support the tests
-/// that still call methods on the parser directly.
-class ParserProxy implements analyzer.Parser {
-  final FastaBodyBuilderTestCase testCase;
-
-  ParserProxy(this.testCase);
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  Annotation parseAnnotation() {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('${testCase.content} var v;');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(
-        unit.declarations[0], new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = unit.declarations[0];
-    expect(declaration.metadata, hasLength(1));
-    return declaration.metadata[0];
-  }
-
-  @override
-  ArgumentList parseArgumentList() {
-    Expression expression = testCase.parseExpression('f${testCase.content}');
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
-    return invocation.argumentList;
-  }
-
-  @override
-  ClassMember parseClassMember(String className) {
-    CompilationUnit unit = testCase
-        .parseCompilationUnit('class $className { ${testCase.content} }');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration classDeclaration = unit.declarations[0];
-    expect(classDeclaration.members, hasLength(1));
-    return classDeclaration.members[0];
-  }
-
-  @override
-  List<Combinator> parseCombinators() {
-    CompilationUnit unit = testCase
-        .parseCompilationUnit('import "file.dart" ${testCase.content};');
-    expect(unit.directives, hasLength(1));
-    expect(unit.declarations, hasLength(0));
-    expect(unit.directives[0], new isInstanceOf<LibraryDirective>());
-    ImportDirective directive = unit.directives[0];
-    return directive.combinators;
-  }
-
-  @override
-  CommentReference parseCommentReference(
-      String referenceSource, int sourceOffset) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
-  }
-
-  @override
-  CompilationUnit parseCompilationUnit2() {
-    return testCase.parseCompilationUnit(testCase.content);
-  }
-
-  @override
-  Configuration parseConfiguration() {
-    CompilationUnit unit = testCase
-        .parseCompilationUnit('import "file.dart" ${testCase.content};');
-    expect(unit.directives, hasLength(1));
-    expect(unit.declarations, hasLength(0));
-    expect(unit.directives[0], new isInstanceOf<LibraryDirective>());
-    ImportDirective directive = unit.directives[0];
-    expect(directive.configurations, hasLength(1));
-    return directive.configurations[0];
-  }
-
-  @override
-  DottedName parseDottedName() {
-    CompilationUnit unit = testCase.parseCompilationUnit(
-        'import "file.dart" if (${testCase.content}) "file2.dart";');
-    expect(unit.directives, hasLength(1));
-    expect(unit.declarations, hasLength(0));
-    expect(unit.directives[0], new isInstanceOf<LibraryDirective>());
-    ImportDirective directive = unit.directives[0];
-    expect(directive.configurations, hasLength(1));
-    return directive.configurations[0].name;
-  }
-
-  @override
-  ExtendsClause parseExtendsClause() {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('class C ${testCase.content} {}');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration classDeclaration = unit.declarations[0];
-    return classDeclaration.extendsClause;
-  }
-
-  @override
-  analyzer.FinalConstVarOrType parseFinalConstVarOrType(bool optional,
-      {bool inFunctionType: false}) {
-    // TODO(brianwilkerson) Implement this or re-write the tests.
-    throw new UnimplementedError();
-  }
-
-  @override
-  FormalParameterList parseFormalParameterList({bool inFunctionType: false}) {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('f${testCase.content} {}');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration function = unit.declarations[0];
-    return function.functionExpression.parameters;
-  }
-
-  @override
-  FunctionBody parseFunctionBody(bool mayBeEmpty,
-      analyzer.ParserErrorCode emptyErrorCode, bool inExpression) {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('f() ${testCase.content}');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = unit.declarations[0];
-    return declaration.functionExpression.body;
-  }
-
-  @override
-  ImplementsClause parseImplementsClause() {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('class C ${testCase.content} {}');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration classDeclaration = unit.declarations[0];
-    return classDeclaration.implementsClause;
-  }
-
-  @override
-  analyzer.Modifiers parseModifiers() {
-    // TODO(brianwilkerson) Implement this or re-write the tests (this might
-    // need context to create the right kind of declaration for the modifiers).
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parseMultiplicativeExpression() {
-    return testCase.parseExpression(testCase.content);
-  }
-
-  @override
-  Expression parsePrimaryExpression() {
-    return testCase.parseExpression(testCase.content);
-  }
-
-  @override
-  SimpleIdentifier parseSimpleIdentifier(
-      {bool allowKeyword: false, bool isDeclaration: false}) {
-    return testCase.parseExpression(testCase.content);
-  }
-
-  @override
-  Statement parseStatement2() {
-    return testCase.parseStatement(testCase.content);
-  }
-
-  @override
-  TypeAnnotation parseTypeAnnotation(bool inExpression) {
-    if (inExpression) {
-      // TODO(brianwilkerson) As far as I can see, this path is not used.
-      throw new UnimplementedError();
-    }
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('${testCase.content} x;');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(
-        unit.declarations[0], new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration variable = unit.declarations[0];
-    return variable.variables.type;
-  }
-
-  @override
-  TypeArgumentList parseTypeArgumentList() {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('C${testCase.content} c;');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(
-        unit.declarations[0], new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration variable = unit.declarations[0];
-    return (variable.variables.type as TypeName).typeArguments;
-  }
-
-  @override
-  TypeName parseTypeName(bool inExpression) {
-    return parseTypeAnnotation(inExpression) as TypeName;
-  }
-
-  @override
-  TypeParameter parseTypeParameter() {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('class C<${testCase.content}> {}');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration classDeclaration = unit.declarations[0];
-    return classDeclaration.typeParameters.typeParameters[0];
-  }
-
-  @override
-  Expression parseUnaryExpression() {
-    return testCase.parseExpression(testCase.content);
-  }
-
-  @override
-  WithClause parseWithClause() {
-    CompilationUnit unit =
-        testCase.parseCompilationUnit('class C ${testCase.content} {}');
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-    expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration classDeclaration = unit.declarations[0];
-    return classDeclaration.withClause;
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
index f169558..decfa5e 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
@@ -31,13 +31,19 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "assert (_s_);",
-              failing: allExceptEof),
+              failing: [
+                'assert',
+                'block',
+                'labeled',
+                'localFunctionNonVoid',
+                'localFunctionVoid',
+                'return'
+              ]),
           new TestDescriptor(
               'condition',
               'assert (a',
               [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
-              "assert (a);",
-              failing: allExceptEof),
+              "assert (a);"),
           new TestDescriptor(
               'comma',
               'assert (a,',
@@ -48,14 +54,12 @@
               'message',
               'assert (a, b',
               [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
-              "assert (a, b);",
-              failing: allExceptEof),
+              "assert (a, b);"),
           new TestDescriptor(
               'trailingComma',
               'assert (a, b,',
               [ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
-              "assert (a, b,);",
-              failing: allExceptEof),
+              "assert (a, b,);"),
           new TestDescriptor('rightParen', 'assert (a, b)',
               [ParserErrorCode.EXPECTED_TOKEN], "assert (a, b);"),
         ],
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
index a4ddf6b..af989fd 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
@@ -56,7 +56,13 @@
           'const f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'const f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'const_initializer',
@@ -86,7 +92,13 @@
           'final f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'final f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'final_initializer',
@@ -116,7 +128,13 @@
           'var f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'var f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'var_initializer',
@@ -148,7 +166,13 @@
           'A f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'A f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'type_initializer',
@@ -187,7 +211,13 @@
           'static const f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'static const f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'static_const_initializer',
@@ -217,7 +247,13 @@
           'static final f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'static final f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'static_final_initializer',
@@ -247,7 +283,13 @@
           'static var f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'static var f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'static_var_initializer',
@@ -279,7 +321,13 @@
           'static A f =',
           [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
           'static A f = _s_;',
-          failing: allExceptEof,
+          failing: [
+            'fieldConst',
+            'methodNonVoid',
+            'methodVoid',
+            'getter',
+            'setter'
+          ],
         ),
         new TestDescriptor(
           'static_type_initializer',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index 388eec1..dc875ff 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -139,7 +139,14 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "var a = _s_;",
-              failing: allExceptEof),
+              failing: [
+                'block',
+                'assert',
+                'labeled',
+                'localFunctionNonVoid',
+                'localFunctionVoid',
+                'return'
+              ]),
           new TestDescriptor('varNameEqualsExpression', 'var a = b',
               [ParserErrorCode.EXPECTED_TOKEN], "var a = b;"),
         ],
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
index bb3264c..76e6f1c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
@@ -214,7 +214,15 @@
               ParserErrorCode.EXPECTED_TOKEN
             ],
             "var a = _s_;",
-            failing: allExceptEof,
+            failing: [
+              'class',
+              'typedef',
+              'functionVoid',
+              'functionNonVoid',
+              'const',
+              'getter',
+              'setter'
+            ],
           ),
           new TestDescriptor(
             'varNameEqualsExpression',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
index 0234d1f..bc15d07 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
@@ -26,19 +26,10 @@
               failing: [
                 'assert',
                 'block',
-                'break',
-                'continue',
-                'do',
-                'if',
-                'for',
                 'labeled',
                 'localFunctionNonVoid',
                 'localFunctionVoid',
-                'localVariable',
-                'switch',
-                'try',
                 'return',
-                'while'
               ]),
           new TestDescriptor('expression', 'yield a',
               [ParserErrorCode.EXPECTED_TOKEN], "yield a;"),
@@ -53,19 +44,10 @@
               failing: [
                 'assert',
                 'block',
-                'break',
-                'continue',
-                'do',
-                'if',
-                'for',
                 'labeled',
                 'localFunctionNonVoid',
                 'localFunctionVoid',
-                'localVariable',
-                'switch',
-                'try',
                 'return',
-                'while'
               ]),
           new TestDescriptor('star_expression', 'yield * a',
               [ParserErrorCode.EXPECTED_TOKEN], "yield * a;"),
diff --git a/pkg/analyzer/test/src/fasta/resolution_test.dart b/pkg/analyzer/test/src/fasta/resolution_test.dart
deleted file mode 100644
index 1fbaa11..0000000
--- a/pkg/analyzer/test/src/fasta/resolution_test.dart
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../generated/parser_test.dart';
-import 'body_builder_test_helper.dart';
-
-main() {
-  return CompilerTestContext.runWithTestOptions((_) {
-    defineReflectiveSuite(() {
-      defineReflectiveTests(ResolutionTest);
-    });
-  });
-}
-
-/**
- * Tests of the fasta parser based on [ExpressionParserTestMixin].
- */
-@reflectiveTest
-class ResolutionTest extends FastaBodyBuilderTestCase {
-  ResolutionTest() : super(true);
-
-  test_booleanLiteral_false() {
-    Expression result = parseExpression('false');
-    expect(result, new isInstanceOf<BooleanLiteral>());
-    expect((result as BooleanLiteral).staticType, typeProvider.boolType);
-  }
-
-  test_booleanLiteral_true() {
-    Expression result = parseExpression('true');
-    expect(result, new isInstanceOf<BooleanLiteral>());
-    expect((result as BooleanLiteral).staticType, typeProvider.boolType);
-  }
-
-  test_doubleLiteral() {
-    Expression result = parseExpression('4.2');
-    expect(result, new isInstanceOf<DoubleLiteral>());
-    expect((result as DoubleLiteral).staticType, typeProvider.doubleType);
-  }
-
-  test_integerLiteral() {
-    Expression result = parseExpression('3');
-    expect(result, new isInstanceOf<IntegerLiteral>());
-    expect((result as IntegerLiteral).staticType, typeProvider.intType);
-  }
-
-  @failingTest
-  test_listLiteral_explicitType() {
-    Expression result = parseExpression('<int>[]');
-    expect(result, new isInstanceOf<ListLiteral>());
-    InterfaceType listType = typeProvider.listType;
-    expect((result as ListLiteral).staticType,
-        listType.instantiate([typeProvider.intType]));
-  }
-
-  @failingTest
-  test_listLiteral_noType() {
-    Expression result = parseExpression('[]');
-    expect(result, new isInstanceOf<ListLiteral>());
-    InterfaceType listType = typeProvider.listType;
-    expect((result as ListLiteral).staticType,
-        listType.instantiate([typeProvider.dynamicType]));
-  }
-
-  @failingTest
-  test_mapLiteral_explicitType() {
-    Expression result = parseExpression('<String, int>{}');
-    expect(result, new isInstanceOf<MapLiteral>());
-    InterfaceType mapType = typeProvider.mapType;
-    expect((result as MapLiteral).staticType,
-        mapType.instantiate([typeProvider.stringType, typeProvider.intType]));
-  }
-
-  @failingTest
-  test_mapLiteral_noType() {
-    Expression result = parseExpression('{}');
-    expect(result, new isInstanceOf<MapLiteral>());
-    InterfaceType mapType = typeProvider.mapType;
-    expect(
-        (result as MapLiteral).staticType,
-        mapType
-            .instantiate([typeProvider.dynamicType, typeProvider.dynamicType]));
-  }
-
-  test_nullLiteral() {
-    Expression result = parseExpression('null');
-    expect(result, new isInstanceOf<NullLiteral>());
-    expect((result as NullLiteral).staticType, typeProvider.nullType);
-  }
-
-  test_simpleStringLiteral() {
-    Expression result = parseExpression('"abc"');
-    expect(result, new isInstanceOf<SimpleStringLiteral>());
-    expect((result as SimpleStringLiteral).staticType, typeProvider.stringType);
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index 37ccad1..b9f73b5 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -7,13 +7,11 @@
 import 'ast_builder_test.dart' as ast_builder;
 import 'message_coverage_test.dart' as message_coverage;
 import 'recovery/test_all.dart' as recovery;
-import 'resolution_test.dart' as resolution;
 
 main() {
   defineReflectiveSuite(() {
     ast_builder.main();
     message_coverage.main();
     recovery.main();
-    resolution.main();
   }, name: 'fasta');
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 9a2a5e1..f594ed6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -29,11 +29,9 @@
 import 'resynthesize_common.dart';
 
 main() {
-  // TODO(brianwilkerson) Either remove the following test, or uncomment it if
-  // we get it working under Dart2 semantics.
-//  defineReflectiveSuite(() {
-//    defineReflectiveTests(ResynthesizeKernelStrongTest);
-//  });
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ResynthesizeKernelStrongTest);
+  });
 }
 
 /// Tests marked with this annotation fail because they test features that
@@ -97,6 +95,27 @@
   }
 
   @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_class_constructor_fieldFormal_named_withDefault() async {
+    await super.test_class_constructor_fieldFormal_named_withDefault();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_class_constructor_fieldFormal_optional_withDefault() async {
+    await super.test_class_constructor_fieldFormal_optional_withDefault();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_class_field_const() async {
+    await super.test_class_field_const();
+  }
+
+  @override
   test_class_setter_invalid_named_parameter() async {
     var library = await checkLibrary('class C { void set x({a}) {} }');
     checkElementText(library, r'''
@@ -149,6 +168,635 @@
   test_const_constructor_inferred_args() =>
       super.test_const_constructor_inferred_args();
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_finalField_hasConstConstructor() async {
+    await super.test_const_finalField_hasConstConstructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invalid_field_const() async {
+    await super.test_const_invalid_field_const();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invalid_intLiteral() async {
+    await super.test_const_invalid_intLiteral();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invalid_topLevel() async {
+    await super.test_const_invalid_topLevel();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_named() async {
+    await super.test_const_invokeConstructor_generic_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_named_imported() async {
+    await super.test_const_invokeConstructor_generic_named_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_named_imported_withPrefix() async {
+    return super
+        .test_const_invokeConstructor_generic_named_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_noTypeArguments() async {
+    await super.test_const_invokeConstructor_generic_noTypeArguments();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_unnamed() async {
+    await super.test_const_invokeConstructor_generic_unnamed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_unnamed_imported() async {
+    await super.test_const_invokeConstructor_generic_unnamed_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
+    return super
+        .test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named() async {
+    await super.test_const_invokeConstructor_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_imported() async {
+    await super.test_const_invokeConstructor_named_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_imported_withPrefix() async {
+    await super.test_const_invokeConstructor_named_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_unresolved() async {
+    await super.test_const_invokeConstructor_named_unresolved();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_unresolved2() async {
+    await super.test_const_invokeConstructor_named_unresolved2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_unresolved3() async {
+    await super.test_const_invokeConstructor_named_unresolved3();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_unresolved4() async {
+    await super.test_const_invokeConstructor_named_unresolved4();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_unresolved5() async {
+    await super.test_const_invokeConstructor_named_unresolved5();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_named_unresolved6() async {
+    await super.test_const_invokeConstructor_named_unresolved6();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_unnamed() async {
+    await super.test_const_invokeConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_unnamed_imported() async {
+    await super.test_const_invokeConstructor_unnamed_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_unnamed_imported_withPrefix() async {
+    await super.test_const_invokeConstructor_unnamed_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_unnamed_unresolved() async {
+    await super.test_const_invokeConstructor_unnamed_unresolved();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_unnamed_unresolved2() async {
+    await super.test_const_invokeConstructor_unnamed_unresolved2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_invokeConstructor_unnamed_unresolved3() async {
+    await super.test_const_invokeConstructor_unnamed_unresolved3();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofClassConstField() async {
+    await super.test_const_length_ofClassConstField();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofClassConstField_imported() async {
+    await super.test_const_length_ofClassConstField_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofClassConstField_imported_withPrefix() async {
+    await super.test_const_length_ofClassConstField_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofStringLiteral() async {
+    await super.test_const_length_ofStringLiteral();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofTopLevelVariable() async {
+    await super.test_const_length_ofTopLevelVariable();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofTopLevelVariable_imported() async {
+    await super.test_const_length_ofTopLevelVariable_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_ofTopLevelVariable_imported_withPrefix() async {
+    await super.test_const_length_ofTopLevelVariable_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_length_staticMethod() async {
+    await super.test_const_length_staticMethod();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_list_inferredType() async {
+    await super.test_const_list_inferredType();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_map_inferredType() async {
+    await super.test_const_map_inferredType();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
+    return super
+        .test_const_parameterDefaultValue_initializingFormal_functionTyped();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_parameterDefaultValue_initializingFormal_named() async {
+    await super.test_const_parameterDefaultValue_initializingFormal_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_parameterDefaultValue_initializingFormal_positional() async {
+    return super
+        .test_const_parameterDefaultValue_initializingFormal_positional();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_parameterDefaultValue_normal() async {
+    await super.test_const_parameterDefaultValue_normal();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_staticField() async {
+    await super.test_const_reference_staticField();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_staticField_imported() async {
+    await super.test_const_reference_staticField_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_staticField_imported_withPrefix() async {
+    await super.test_const_reference_staticField_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_staticMethod() async {
+    await super.test_const_reference_staticMethod();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_staticMethod_imported() async {
+    await super.test_const_reference_staticMethod_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_staticMethod_imported_withPrefix() async {
+    await super.test_const_reference_staticMethod_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelFunction() async {
+    await super.test_const_reference_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelFunction_generic() async {
+    await super.test_const_reference_topLevelFunction_generic();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelFunction_imported() async {
+    await super.test_const_reference_topLevelFunction_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelFunction_imported_withPrefix() async {
+    await super.test_const_reference_topLevelFunction_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelVariable() async {
+    await super.test_const_reference_topLevelVariable();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelVariable_imported() async {
+    await super.test_const_reference_topLevelVariable_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_topLevelVariable_imported_withPrefix() async {
+    await super.test_const_reference_topLevelVariable_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_type() async {
+    await super.test_const_reference_type();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_type_imported() async {
+    await super.test_const_reference_type_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_type_imported_withPrefix() async {
+    await super.test_const_reference_type_imported_withPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_unresolved_prefix0() async {
+    await super.test_const_reference_unresolved_prefix0();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_unresolved_prefix1() async {
+    await super.test_const_reference_unresolved_prefix1();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_reference_unresolved_prefix2() async {
+    await super.test_const_reference_unresolved_prefix2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_binary() async {
+    await super.test_const_topLevel_binary();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_conditional() async {
+    await super.test_const_topLevel_conditional();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_identical() async {
+    await super.test_const_topLevel_identical();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_ifNull() async {
+    await super.test_const_topLevel_ifNull();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_literal() async {
+    await super.test_const_topLevel_literal();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_parenthesis() async {
+    await super.test_const_topLevel_parenthesis();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_prefix() async {
+    await super.test_const_topLevel_prefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_super() async {
+    await super.test_const_topLevel_super();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_this() async {
+    await super.test_const_topLevel_this();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_typedList() async {
+    await super.test_const_topLevel_typedList();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_typedList_imported() async {
+    await super.test_const_topLevel_typedList_imported();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_typedList_importedWithPrefix() async {
+    await super.test_const_topLevel_typedList_importedWithPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_typedList_typedefArgument() async {
+    await super.test_const_topLevel_typedList_typedefArgument();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_typedMap() async {
+    await super.test_const_topLevel_typedMap();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_untypedList() async {
+    await super.test_const_topLevel_untypedList();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_const_topLevel_untypedMap() async {
+    await super.test_const_topLevel_untypedMap();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constExpr_pushReference_field_simpleIdentifier() async {
+    await super.test_constExpr_pushReference_field_simpleIdentifier();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
+    await super.test_constExpr_pushReference_staticMethod_simpleIdentifier();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_assertInvocation() async {
+    await super.test_constructor_initializers_assertInvocation();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_assertInvocation_message() async {
+    await super.test_constructor_initializers_assertInvocation_message();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_field() async {
+    await super.test_constructor_initializers_field();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_field_notConst() async {
+    await super.test_constructor_initializers_field_notConst();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_field_withParameter() async {
+    await super.test_constructor_initializers_field_withParameter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_superInvocation_named() async {
+    await super.test_constructor_initializers_superInvocation_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_superInvocation_named_underscore() async {
+    return super
+        .test_constructor_initializers_superInvocation_named_underscore();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_superInvocation_namedExpression() async {
+    return super
+        .test_constructor_initializers_superInvocation_namedExpression();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_superInvocation_unnamed() async {
+    await super.test_constructor_initializers_superInvocation_unnamed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_thisInvocation_named() async {
+    await super.test_constructor_initializers_thisInvocation_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_thisInvocation_namedExpression() async {
+    await super.test_constructor_initializers_thisInvocation_namedExpression();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_initializers_thisInvocation_unnamed() async {
+    await super.test_constructor_initializers_thisInvocation_unnamed();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30258')
   test_constructor_redirected_factory_named_generic() async {
@@ -185,6 +833,83 @@
     await super.test_constructor_redirected_factory_unnamed_prefixed_generic();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_redirected_thisInvocation_named() async {
+    await super.test_constructor_redirected_thisInvocation_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_redirected_thisInvocation_named_generic() async {
+    await super.test_constructor_redirected_thisInvocation_named_generic();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_redirected_thisInvocation_unnamed() async {
+    await super.test_constructor_redirected_thisInvocation_unnamed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_redirected_thisInvocation_unnamed_generic() async {
+    await super.test_constructor_redirected_thisInvocation_unnamed_generic();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_constructor_withCycles_const() async {
+    await super.test_constructor_withCycles_const();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_defaultValue_refersToGenericClass_constructor() async {
+    await super.test_defaultValue_refersToGenericClass_constructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_defaultValue_refersToGenericClass_constructor2() async {
+    await super.test_defaultValue_refersToGenericClass_constructor2();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_defaultValue_refersToGenericClass_functionG() async {
+    await super.test_defaultValue_refersToGenericClass_functionG();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_defaultValue_refersToGenericClass_methodG() async {
+    await super.test_defaultValue_refersToGenericClass_methodG();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_defaultValue_refersToGenericClass_methodG_classG() async {
+    await super.test_defaultValue_refersToGenericClass_methodG_classG();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_defaultValue_refersToGenericClass_methodNG() async {
+    await super.test_defaultValue_refersToGenericClass_methodNG();
+  }
+
   @failingTest
   @notForDart2
   test_export_configurations_useFirst() async {
@@ -203,6 +928,27 @@
     await super.test_exportImport_configurations_useFirst();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_field_propagatedType_const_noDep() async {
+    await super.test_field_propagatedType_const_noDep();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_function_async() async {
+    await super.test_function_async();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_function_asyncStar() async {
+    await super.test_function_asyncStar();
+  }
+
   @failingTest
   @override
   test_futureOr() async {
@@ -255,6 +1001,20 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_infer_generic_typedef_simple() async {
+    await super.test_infer_generic_typedef_simple();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_instantiateToBounds_functionTypeAlias_simple() async {
+    await super.test_instantiateToBounds_functionTypeAlias_simple();
+  }
+
+  @override
+  @failingTest
   test_invalid_annotation_prefixed_constructor() {
     return super.test_invalid_annotation_prefixed_constructor();
   }
@@ -284,17 +1044,130 @@
   }
 
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
-  test_invalid_setterParameter_fieldFormalParameter() async {
-    await super.test_invalid_setterParameter_fieldFormalParameter();
-  }
-
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30725')
   test_invalidUri_part_emptyUri() async {
     await super.test_invalidUri_part_emptyUri();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_invalidUris() async {
+    await super.test_invalidUris();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_member_function_async() async {
+    await super.test_member_function_async();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_member_function_asyncStar() async {
+    await super.test_member_function_asyncStar();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_member_function_syncStar() async {
+    await super.test_member_function_syncStar();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_classDeclaration() async {
+    await super.test_metadata_classDeclaration();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_classTypeAlias() async {
+    await super.test_metadata_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructor_call_named() async {
+    await super.test_metadata_constructor_call_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructor_call_named_prefixed() async {
+    await super.test_metadata_constructor_call_named_prefixed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructor_call_unnamed() async {
+    await super.test_metadata_constructor_call_unnamed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructor_call_unnamed_prefixed() async {
+    await super.test_metadata_constructor_call_unnamed_prefixed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructor_call_with_args() async {
+    await super.test_metadata_constructor_call_with_args();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructorDeclaration_named() async {
+    await super.test_metadata_constructorDeclaration_named();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_constructorDeclaration_unnamed() async {
+    await super.test_metadata_constructorDeclaration_unnamed();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_enumConstantDeclaration() async {
+    await super.test_metadata_enumConstantDeclaration();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_enumDeclaration() async {
+    await super.test_metadata_enumDeclaration();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_exportDirective() async {
+    await super.test_metadata_exportDirective();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_fieldDeclaration() async {
+    await super.test_metadata_fieldDeclaration();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_fieldFormalParameter() async {
@@ -307,6 +1180,34 @@
     await super.test_metadata_fieldFormalParameter_withDefault();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_functionDeclaration_function() async {
+    await super.test_metadata_functionDeclaration_function();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_functionDeclaration_getter() async {
+    await super.test_metadata_functionDeclaration_getter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_functionDeclaration_setter() async {
+    await super.test_metadata_functionDeclaration_setter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_functionTypeAlias() async {
+    await super.test_metadata_functionTypeAlias();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_functionTypedFormalParameter() async {
@@ -319,6 +1220,62 @@
     await super.test_metadata_functionTypedFormalParameter_withDefault();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_importDirective() async {
+    await super.test_metadata_importDirective();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_invalid_classDeclaration() async {
+    await super.test_metadata_invalid_classDeclaration();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_libraryDirective() async {
+    await super.test_metadata_libraryDirective();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_methodDeclaration_getter() async {
+    await super.test_metadata_methodDeclaration_getter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_methodDeclaration_method() async {
+    await super.test_metadata_methodDeclaration_method();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_methodDeclaration_setter() async {
+    await super.test_metadata_methodDeclaration_setter();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_partDirective() async {
+    await super.test_metadata_partDirective();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_prefixed_variable() async {
+    await super.test_metadata_prefixed_variable();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_simpleFormalParameter() async {
@@ -331,6 +1288,41 @@
     await super.test_metadata_simpleFormalParameter_withDefault();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_topLevelVariableDeclaration() async {
+    await super.test_metadata_topLevelVariableDeclaration();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_typeParameter_ofClass() async {
+    await super.test_metadata_typeParameter_ofClass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_typeParameter_ofClassTypeAlias() async {
+    await super.test_metadata_typeParameter_ofClassTypeAlias();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_typeParameter_ofFunction() async {
+    await super.test_metadata_typeParameter_ofFunction();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_metadata_typeParameter_ofTypedef() async {
+    await super.test_metadata_typeParameter_ofTypedef();
+  }
+
   @failingTest
   @notForDart2
   test_parameter_checked() async {
@@ -345,6 +1337,55 @@
     await super.test_parameter_checked_inherited();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_parameterTypeNotInferred_constructor() async {
+    await super.test_parameterTypeNotInferred_constructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_parameterTypeNotInferred_initializingFormal() async {
+    await super.test_parameterTypeNotInferred_initializingFormal();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_parameterTypeNotInferred_staticMethod() async {
+    await super.test_parameterTypeNotInferred_staticMethod();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_parameterTypeNotInferred_topLevelFunction() async {
+    await super.test_parameterTypeNotInferred_topLevelFunction();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_setter_inferred_type_conflictingInheritance() async {
+    await super.test_setter_inferred_type_conflictingInheritance();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_type_reference_to_typedef_with_type_arguments() async {
+    await super.test_type_reference_to_typedef_with_type_arguments();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_type_reference_to_typedef_with_type_arguments_implicit() async {
+    await super.test_type_reference_to_typedef_with_type_arguments_implicit();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31711')
   test_typedef_generic_asFieldType() async {
@@ -359,16 +1400,6 @@
   }
 
   @failingTest
-  test_typedef_type_parameters_bound_recursive() async {
-    await super.test_typedef_type_parameters_bound_recursive();
-  }
-
-  @failingTest
-  test_typedef_type_parameters_bound_recursive2() async {
-    await super.test_typedef_type_parameters_bound_recursive2();
-  }
-
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
   test_unresolved_annotation_instanceCreation_argument_super() async {
     await super.test_unresolved_annotation_instanceCreation_argument_super();
@@ -376,6 +1407,28 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_instanceCreation_argument_this() async {
+    await super.test_unresolved_annotation_instanceCreation_argument_this();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_namedConstructorCall_noClass() async {
+    await super.test_unresolved_annotation_namedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_namedConstructorCall_noConstructor() async {
+    return super
+        .test_unresolved_annotation_namedConstructorCall_noConstructor();
+  }
+
+  @override
+  @failingTest
   test_unresolved_annotation_prefixedIdentifier_badPrefix() {
     return super.test_unresolved_annotation_prefixedIdentifier_badPrefix();
   }
@@ -388,10 +1441,71 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
+    return super
+        .test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
+    return super
+        .test_unresolved_annotation_prefixedNamedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
+    return super
+        .test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
+    return super
+        .test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
+    return super
+        .test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
   test_unresolved_annotation_simpleIdentifier() {
     return super.test_unresolved_annotation_simpleIdentifier();
   }
 
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_unresolved_annotation_unnamedConstructorCall_noClass() async {
+    await super.test_unresolved_annotation_unnamedConstructorCall_noClass();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_variable_const() async {
+    await super.test_variable_const();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  test_variable_propagatedType_const_noDep() async {
+    await super.test_variable_propagatedType_const_noDep();
+  }
+
   Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
     var logger = new PerformanceLog(null);
     var byteStore = new MemoryByteStore();
@@ -415,7 +1529,7 @@
         fsState,
         resourceProvider.pathContext);
 
-    LibraryCompilationResult libraryResult = await compiler.compile(testUri);
+    LibraryOutlineResult libraryResult = await compiler.getOutline(testUri);
 
     // Remember Kernel libraries produced by the compiler.
     var libraryMap = <String, kernel.Library>{};
diff --git a/pkg/analyzer/tool/analyzer_cfe_progress.dart b/pkg/analyzer/tool/analyzer_cfe_progress.dart
new file mode 100644
index 0000000..27577db
--- /dev/null
+++ b/pkg/analyzer/tool/analyzer_cfe_progress.dart
@@ -0,0 +1,122 @@
+// 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:io' as io;
+
+import 'package:analyzer/dart/analysis/context_builder.dart';
+import 'package:analyzer/dart/analysis/context_locator.dart';
+import 'package:analyzer/dart/analysis/context_root.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:path/path.dart' as path;
+
+// TODO(devoncarew): Convert the commented out code below to a --verbose option,
+// emitting failing tests in a markdown ready format?
+
+/// Count failing Analyzer CFE integration tests.
+///
+/// We look for classes ending in *Test_UseCFE or *Test_Kernel with test
+/// methods that are marked with @failingTest annotations.
+///
+/// In addition, we count the test exclusions from pkg/pkg.status related to
+/// using Fasta with the Analyzer.
+void main() {
+  if (!io.FileSystemEntity.isDirectorySync('pkg')) {
+    io.stderr
+        .writeln('This tool should be run from the top level sdk directory.');
+    io.exit(1);
+  }
+
+  final List<String> analysisPaths = [
+    'pkg/analysis_server',
+    'pkg/analyzer_cli',
+    'pkg/analyzer_plugin',
+    'pkg/analyzer',
+  ];
+
+  final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
+  ContextLocator locator =
+      new ContextLocator(resourceProvider: resourceProvider);
+  List<ContextRoot> contextRoots =
+      locator.locateRoots(includedPaths: analysisPaths);
+  ContextBuilder builder =
+      new ContextBuilder(resourceProvider: resourceProvider);
+
+  for (ContextRoot contextRoot in contextRoots) {
+    if (!analysisPaths
+        .any((analysisPath) => contextRoot.root.path.endsWith(analysisPath))) {
+      continue;
+    }
+
+    AnalysisSession analysisSession =
+        builder.createContext(contextRoot: contextRoot).currentSession;
+    print('\nCFE tests for ${path.relative(contextRoot.root.path)}:');
+
+    int totalFailingCount = 0;
+
+    for (String analyzedPath in contextRoot.analyzedFiles()) {
+      if (!analyzedPath.endsWith('_test.dart')) {
+        continue;
+      }
+
+      ParseResult result = analysisSession.getParsedAstSync(analyzedPath);
+      CompilationUnit unit = result.unit;
+
+      for (ClassDeclaration member
+          in unit.declarations.where((member) => member is ClassDeclaration)) {
+        String className = member.name.toString();
+        if (!className.endsWith('Test_UseCFE') &&
+            !className.endsWith('Test_Kernel')) {
+          continue;
+        }
+
+        int failingCount = 0;
+
+        for (MethodDeclaration method
+            in member.members.where((member) => member is MethodDeclaration)) {
+          String methodName = method.name.toString();
+          if (!methodName.startsWith('test_')) {
+            continue;
+          }
+
+          if (method.metadata.any((Annotation annotation) =>
+              annotation.name.toString() == 'failingTest')) {
+            failingCount++;
+          }
+        }
+
+        totalFailingCount += failingCount;
+
+        //if (failingCount > 0) {
+        //  print('  ${member.name}, $failingCount failing tests');
+        //}
+      }
+    }
+
+    print('  $totalFailingCount failing tests');
+  }
+
+  // Also count the Fasta '-DuseFastaParser=true' tests.
+  print('\nuseFastaParser=true failures from pkg/pkg.status');
+
+  io.File file = new io.File('pkg/pkg.status');
+  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 ]');
+  if (index == -1) {
+    print('error parsing ${file.path}');
+  }
+
+  lines = lines.sublist(index + 1);
+  lines = lines.sublist(0, lines.indexWhere((line) => line.startsWith('[')));
+
+  print('  ${lines.length} failing tests');
+}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 606e0c3..fa3df1e 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -659,13 +659,6 @@
 class ExitCodesTest_PreviewDart2 extends ExitCodesTest {
   @override
   bool get usePreviewDart2 => true;
-
-  @override
-  @failingTest
-  test_fatalErrors() {
-    // TODO(devoncarew): This test times out when used with @failingTest.
-    return new Future.error('failing test');
-  }
 }
 
 @reflectiveTest
@@ -675,64 +668,7 @@
 
   @override
   @failingTest
-  test_enableAssertInitializer() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_fatalErrors() {
-    // TODO(devoncarew): This test times out when used with @failingTest.
-    return new Future.error('failing test');
-  }
-
-  @override
-  @failingTest
-  test_fatalHints() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_fatalWarnings() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_missingOptionsFile() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_notFatalHints() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_notFatalWarnings() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_partFile() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_partFile_extra() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_partFile_reversed() {
-    fail('Test crashes CFE');
-  }
+  test_fatalWarnings() => callFailingTest(super.test_fatalWarnings);
 }
 
 @reflectiveTest
@@ -841,48 +777,6 @@
 class LinterTest_UseCFE extends LinterTest {
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_defaultLints_generatedLints() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_defaultLints_getsDefaultLints() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_lintsInOptions_generatedLints() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_lintsInOptions_getAnalysisOptions() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_noLints_lintsDisabled() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_noLints_noGeneratedWarnings() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_noLints_noRegisteredLints() {
-    fail('Test times out');
-  }
 }
 
 @reflectiveTest
@@ -1099,75 +993,45 @@
 
   @override
   @failingTest
-  test_analysisOptions_excludes() {
-    fail('Test times out');
-  }
+  test_analysisOptions_excludes() =>
+      callFailingTest(super.test_analysisOptions_excludes);
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() {
-    fail('Test times out');
-  }
+  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() =>
+      callFailingTest(super
+          .test_analysisOptions_excludesRelativeToAnalysisOptions_explicit);
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() {
-    fail('Test times out');
-  }
+  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() =>
+      callFailingTest(super
+          .test_analysisOptions_excludesRelativeToAnalysisOptions_inferred);
 
   @override
   @failingTest
-  test_analyzeFilesInDifferentContexts() {
-    fail('Test times out');
-  }
+  test_basic_filters() => callFailingTest(super.test_basic_filters);
 
   @override
   @failingTest
-  test_basic_filters() {
-    fail('Test times out');
-  }
+  test_basic_language() => callFailingTest(super.test_basic_language);
 
   @override
   @failingTest
-  test_basic_language() {
-    fail('Test times out');
-  }
+  test_basic_strongMode() => callFailingTest(super.test_basic_strongMode);
 
   @override
   @failingTest
-  test_basic_strongMode() {
-    fail('Test times out');
-  }
+  test_includeDirective() => callFailingTest(super.test_includeDirective);
 
   @override
   @failingTest
-  test_includeDirective() {
-    fail('Test times out');
-  }
+  test_previewDart2() => callFailingTest(super.test_previewDart2);
 
   @override
   @failingTest
-  test_previewDart2() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_strongSdk() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_todo() {
-    fail('Test times out');
-  }
-
-  @override
-  @failingTest
-  test_withFlags_overrideFatalWarning() {
-    fail('Test times out');
-  }
+  test_withFlags_overrideFatalWarning() =>
+      callFailingTest(super.test_withFlags_overrideFatalWarning);
 }
 
 class TestSource implements Source {
@@ -1176,3 +1040,32 @@
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+typedef dynamic NoArgFunction();
+
+/**
+ * Call a test that we think will fail.
+ *
+ * Ensure that we return any thrown exception correctly (avoiding the
+ * package:test zone error handler).
+ */
+callFailingTest(NoArgFunction expectedFailingTestFn) {
+  final Completer completer = new Completer();
+
+  try {
+    runZoned(
+      () async => await expectedFailingTestFn(),
+      onError: (error) {
+        completer.completeError(error);
+      },
+    ).then((result) {
+      completer.complete(result);
+    }).catchError((error) {
+      completer.completeError(error);
+    });
+  } catch (error) {
+    completer.completeError(error);
+  }
+
+  return completer.future;
+}
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index cb58f97..a8c5bef 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -1,9 +1,9 @@
 name: build_integration
-version: 0.0.1
-author: Dart Team <misc@dartlang.org>
 description: >
   Libraries for integrating Dart tools with build systems like bazel
   and build_runner.
-homepage: https://github.com/dart-lang/sdk/tree/master/pkg/build_integration
+# This package is not intended to be published - yet
+publish_to: none
+
 dependencies:
   front_end: ^0.1.0
diff --git a/pkg/compiler/lib/compiler.dart b/pkg/compiler/lib/compiler.dart
index 32c8b43..671f426 100644
--- a/pkg/compiler/lib/compiler.dart
+++ b/pkg/compiler/lib/compiler.dart
@@ -109,7 +109,7 @@
     CompilerInputProvider inputProvider, DiagnosticHandler handler,
     [List<String> options = const [],
     CompilerOutputProvider outputProvider,
-    Map<String, dynamic> environment = const {},
+    Map<String, String> environment = const {},
     Uri packageConfig,
     PackagesDiscoveryProvider packagesDiscoveryProvider]) {
   CompilerOptions compilerOptions =
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 4fcea9f..a855925 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -157,6 +157,10 @@
     });
   }
 
+  String _formatMs(int ms) {
+    return (ms / 1000).toStringAsFixed(3) + 's';
+  }
+
   void computeTimings(Duration setupDuration, StringBuffer timings) {
     timings.writeln("Timings:");
     Duration totalDuration = measurer.wallClock.elapsed;
@@ -167,13 +171,13 @@
       Duration duration = task.duration;
       if (duration != Duration.zero) {
         cumulatedDuration += duration;
-        timings.writeln('    $running${task.name} took'
-            ' ${duration.inMilliseconds}msec');
+        timings.writeln('    $running${task.name}:'
+            ' ${_formatMs(duration.inMilliseconds)}');
         for (String subtask in task.subtasks) {
           int subtime = task.getSubtaskTime(subtask);
           String running = task.getSubtaskIsRunning(subtask) ? "*" : "";
           timings.writeln(
-              '    $running${task.name} > $subtask took ${subtime}msec');
+              '    $running${task.name} > $subtask: ${_formatMs(subtime)}');
         }
       }
     }
@@ -181,10 +185,11 @@
         totalDuration - cumulatedDuration - setupDuration - asyncDuration;
     double percent =
         unaccountedDuration.inMilliseconds * 100 / totalDuration.inMilliseconds;
-    timings.write('    Total compile-time ${totalDuration.inMilliseconds}msec;'
-        ' setup ${setupDuration.inMilliseconds}msec;'
-        ' async ${asyncDuration.inMilliseconds}msec;'
-        ' unaccounted ${unaccountedDuration.inMilliseconds}msec'
+    timings.write(
+        '    Total compile-time ${_formatMs(totalDuration.inMilliseconds)};'
+        ' setup ${_formatMs(setupDuration.inMilliseconds)};'
+        ' async ${_formatMs(asyncDuration.inMilliseconds)};'
+        ' unaccounted ${_formatMs(unaccountedDuration.inMilliseconds)}'
         ' (${percent.toStringAsFixed(2)}%)');
   }
 
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/helpers/stats.dart b/pkg/compiler/lib/src/helpers/stats.dart
index c8f6c0da0..935ac8c 100644
--- a/pkg/compiler/lib/src/helpers/stats.dart
+++ b/pkg/compiler/lib/src/helpers/stats.dart
@@ -537,13 +537,13 @@
   }
 
   void recordFrequency(id, value, [example]) {
-    Map<int, List> map = frequencyMaps.putIfAbsent(id, () => {});
+    Map<dynamic, List> map = frequencyMaps.putIfAbsent(id, () => {});
     map.putIfAbsent(value, () => []);
     map[value].add(example);
   }
 
   void recordFrequencies(id, Map<dynamic, Iterable> frequencyMap) {
-    Map<int, List> map = frequencyMaps.putIfAbsent(id, () => {});
+    Map<dynamic, List> map = frequencyMaps.putIfAbsent(id, () => {});
     frequencyMap.forEach((value, examples) {
       map.putIfAbsent(value, () => []);
       map[value].addAll(examples);
@@ -707,7 +707,7 @@
       {int limit, Map dataMap, bool includeCount: true}) {
     if (limit == 0) return;
 
-    Map childData = {};
+    Map<String, dynamic> childData = {};
     Iterable nonNullIterable = iterable.where((e) => e != null);
     if (nonNullIterable.isEmpty && !includeCount) {
       childData['name'] = title;
@@ -748,11 +748,11 @@
 ///
 /// If [isValidKey] is provided, this is used to determine with a value of [map]
 /// is a potential key of the inversion map.
-Map<dynamic, Set> inverseMap(Map map,
-    {bool equals(key1, key2),
-    int hashCode(key),
-    bool isValidKey(potentialKey)}) {
-  Map<dynamic, Set> result = new LinkedHashMap<dynamic, Set>(
+Map<V, Set<K>> inverseMap<K, V>(Map<K, V> map,
+    {bool equals(V key1, V key2),
+    int hashCode(V key),
+    bool isValidKey(V potentialKey)}) {
+  Map<V, Set<K>> result = new LinkedHashMap<V, Set<K>>(
       equals: equals, hashCode: hashCode, isValidKey: isValidKey);
   map.forEach((k, v) {
     if (isValidKey == null || isValidKey(v)) {
@@ -767,11 +767,11 @@
 /// the assumption that all keys are [Comparable].
 /// Otherwise, the keys are sorted as string using their `toString`
 /// representation.
-Map trySortMap(Map map) {
-  Iterable iterable = map.keys.where((k) => k != null);
+Map<K, V> trySortMap<K, V>(Map<K, V> map) {
+  Iterable<K> iterable = map.keys.where((K k) => k != null);
   if (iterable.isEmpty) return map;
   var key = iterable.first;
-  if (key is Comparable) {
+  if (key is Comparable<K>) {
     return sortMap(map);
   }
   return sortMap(map, (a, b) => '$a'.compareTo('$b'));
@@ -779,10 +779,10 @@
 
 /// Returns a new map in which the keys of [map] are sorted using [compare].
 /// If [compare] is null, the keys must be [Comparable].
-Map sortMap(Map map, [int compare(a, b)]) {
-  List keys = map.keys.toList();
+Map<K, V> sortMap<K, V>(Map<K, V> map, [int compare(K a, K b)]) {
+  List<K> keys = map.keys.toList();
   keys.sort(compare);
-  Map sortedMap = new Map();
-  keys.forEach((k) => sortedMap[k] = map[k]);
+  Map<K, V> sortedMap = new Map<K, V>();
+  keys.forEach((K k) => sortedMap[k] = map[k]);
   return sortedMap;
 }
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 52ff120..549c287 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -364,7 +364,8 @@
     addNode(info, 'BoolLiteral\n${info.value}');
   }
 
-  void handleCall(CallSiteTypeInformation info, String text, Map inputs) {
+  void handleCall(CallSiteTypeInformation info, String text,
+      Map<String, TypeInformation> inputs) {
     String sourceCode = shorten('${info.debugName}');
     text = '$text\n$sourceCode';
     if (info.arguments != null) {
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..7311eb2 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -334,23 +334,50 @@
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     FlatTypeMask flatOther = other;
-    if (isEmptyOrNull) {
-      return flatOther.isNullable ? 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);
+
+    ClassEntity otherBase = flatOther.base;
+
+    bool includeNull = isNullable && flatOther.isNullable;
+
+    TypeMask emptyOrNull() {
+      return includeNull
+          ? closedWorld.abstractValueDomain.nullType
+          : closedWorld.abstractValueDomain.emptyType;
     }
+
+    if (isEmptyOrNull || flatOther.isEmptyOrNull) {
+      return emptyOrNull();
+    }
+
+    SubclassResult result = closedWorld.classHierarchy
+        .commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
+
+    FlatTypeMask createSingle(ClassEntity cls) {
+      switch (result.query) {
+        case ClassQuery.EXACT:
+          return includeNull
+              ? new TypeMask.exact(cls, closedWorld)
+              : new TypeMask.nonNullExact(cls, closedWorld);
+        case ClassQuery.SUBCLASS:
+          return includeNull
+              ? new TypeMask.subclass(cls, closedWorld)
+              : new TypeMask.nonNullSubclass(cls, closedWorld);
+        case ClassQuery.SUBTYPE:
+          return includeNull
+              ? new TypeMask.subtype(cls, closedWorld)
+              : new TypeMask.nonNullSubtype(cls, closedWorld);
+      }
+      throw new UnsupportedError("Unexpected ClassQuery: ${result.query}.");
+    }
+
+    List<FlatTypeMask> masks =
+        result.classes.map<FlatTypeMask>(createSingle).toList();
+    if (masks.isEmpty) return emptyOrNull();
+    if (masks.length == 1) return masks.single;
+    if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
+      return UnionTypeMask.flatten(masks, closedWorld);
+    }
+    return new UnionTypeMask._internal(masks);
   }
 
   bool isDisjoint(TypeMask other, JClosedWorld closedWorld) {
@@ -432,54 +459,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()
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 2b6ae66..23752a0 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';
 
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 8b424b6..3b6fc65 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -38,7 +38,7 @@
 import '../ssa/ssa.dart' show SsaFunctionCompiler;
 import '../tracer.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;
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 7069820..0ce6141 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -13,6 +13,7 @@
 import '../js_emitter/code_emitter_task.dart';
 import '../options.dart';
 import '../universe/world_builder.dart';
+import 'allocator_analysis.dart' show JAllocatorAnalysis;
 import 'constant_system_javascript.dart';
 import 'js_backend.dart';
 import 'namer.dart';
@@ -40,6 +41,7 @@
   final CodegenWorldBuilder _worldBuilder;
   final RuntimeTypesNeed _rtiNeed;
   final RuntimeTypesEncoder _rtiEncoder;
+  final JAllocatorAnalysis _allocatorAnalysis;
   final Namer _namer;
   final CodeEmitterTask _task;
   final _ConstantReferenceGenerator constantReferenceGenerator;
@@ -56,6 +58,7 @@
       this._worldBuilder,
       this._rtiNeed,
       this._rtiEncoder,
+      this._allocatorAnalysis,
       this._namer,
       this._task,
       this.constantReferenceGenerator,
@@ -325,7 +328,9 @@
         _emitter.constructorAccess(constant.type.element);
     List<jsAst.Expression> fields = <jsAst.Expression>[];
     _worldBuilder.forEachInstanceField(element, (_, FieldEntity field) {
-      fields.add(constantReferenceGenerator(constant.fields[field]));
+      if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+        fields.add(constantReferenceGenerator(constant.fields[field]));
+      }
     });
     if (_rtiNeed.classNeedsTypeArguments(constant.type.element)) {
       fields.add(_reifiedTypeArguments(constant, constant.type.typeArguments));
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index a438262..b7a388a 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';
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index a449b52..54863e5 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';
@@ -1469,7 +1470,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 +1696,16 @@
                 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);
+
+            for (ClassEntity cls in result.classes) {
+              addClass(cls);
+              if (neededOnAll) 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 +1716,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));
           }
         }
       }
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 407b49e..19692ba 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -166,6 +166,7 @@
         compiler.codegenWorldBuilder,
         _closedWorld.rtiNeed,
         compiler.backend.rtiEncoder,
+        _closedWorld.allocatorAnalysis,
         namer,
         task,
         this.constantReference,
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 edda727..46bce90 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
@@ -83,6 +83,7 @@
         compiler.codegenWorldBuilder,
         _closedWorld.rtiNeed,
         compiler.backend.rtiEncoder,
+        _closedWorld.allocatorAnalysis,
         namer,
         task,
         this.generateConstantReference,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 6b68731..1f4923a 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -289,10 +289,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 =
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 71a8c15..891f792 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -42,6 +42,9 @@
   bool get nativeExtensionExpectsString => false;
 
   @override
+  bool get errorOnUnexactWebIntLiterals => true;
+
+  @override
   void performModularTransformationsOnLibraries(
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<ir.Library> libraries,
       {void logger(String msg)}) {}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index b2584d4..b3e5f49 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';
@@ -439,11 +439,20 @@
     }
     List<DartType> parameterTypes = <DartType>[];
     List<DartType> optionalParameterTypes = <DartType>[];
+
+    DartType getParameterType(ir.VariableDeclaration variable) {
+      if (variable.isCovariant || variable.isGenericCovariantImpl) {
+        // A covariant parameter has type `Object` in the method signature.
+        return commonElements.objectType;
+      }
+      return getDartType(variable.type);
+    }
+
     for (ir.VariableDeclaration variable in node.positionalParameters) {
       if (parameterTypes.length == node.requiredParameterCount) {
-        optionalParameterTypes.add(getDartType(variable.type));
+        optionalParameterTypes.add(getParameterType(variable));
       } else {
-        parameterTypes.add(getDartType(variable.type));
+        parameterTypes.add(getParameterType(variable));
       }
     }
     List<String> namedParameters = <String>[];
@@ -452,7 +461,7 @@
         node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name));
     for (ir.VariableDeclaration variable in sortedNamedParameters) {
       namedParameters.add(variable.name);
-      namedParameterTypes.add(getDartType(variable.type));
+      namedParameterTypes.add(getParameterType(variable));
     }
     List<FunctionTypeVariable> typeVariables;
     if (node.typeParameters.isNotEmpty && options.strongMode) {
@@ -2064,9 +2073,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;
 
@@ -2080,6 +2086,8 @@
 
   final Iterable<MemberEntity> processedMembers;
 
+  final ClassHierarchy classHierarchy;
+
   KClosedWorldImpl(this.elementMap,
       {CompilerOptions options,
       this.elementEnvironment,
@@ -2102,8 +2110,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);
   }
 
@@ -2111,152 +2119,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.
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/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index 7b4f019..c2d2fd0 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -465,10 +465,10 @@
   BazelInputProvider(List<String> searchPaths)
       : dirs = searchPaths.map(_resolve).toList();
 
-  static _resolve(String path) => currentDirectory.resolve(path);
+  static Uri _resolve(String path) => currentDirectory.resolve(path);
 
   @override
-  Future<api.Input> readFromUri(Uri uri,
+  Future<api.Input<List<int>>> readFromUri(Uri uri,
       {InputKind inputKind: InputKind.UTF8}) async {
     var resolvedUri = uri;
     var path = uri.path;
@@ -482,7 +482,8 @@
         }
       }
     }
-    api.Input result = await readBytesFromUri(resolvedUri, inputKind);
+    api.Input<List<int>> result =
+        await readBytesFromUri(resolvedUri, inputKind);
     switch (inputKind) {
       case InputKind.UTF8:
         utf8SourceFiles[uri] = utf8SourceFiles[resolvedUri];
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index be3be29..795ed34 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -620,8 +620,8 @@
         ConstructorBodyEntity constructorBody =
             _elementMap.getConstructorBody(body);
         if (!isCustomElement && // TODO(13836): Fix inlining.
-            _tryInlineMethod(constructorBody, null, null, bodyCallInputs, node,
-                sourceInformation)) {
+            _tryInlineMethod(constructorBody, null, null, bodyCallInputs, null,
+                node, sourceInformation)) {
           pop();
         } else {
           _invokeConstructorBody(body, bodyCallInputs,
@@ -4100,7 +4100,8 @@
       AbstractValue typeMask, List<DartType> typeArguments,
       {SourceInformation sourceInformation, InterfaceType instanceType}) {
     // TODO(redemption): Pass current node if needed.
-    if (_tryInlineMethod(target, null, null, arguments, null, sourceInformation,
+    if (_tryInlineMethod(
+        target, null, null, arguments, typeArguments, null, sourceInformation,
         instanceType: instanceType)) {
       return;
     }
@@ -4170,8 +4171,8 @@
         !(element.isGetter && selector.isCall) &&
         !(element.isFunction && selector.isGetter) &&
         !isOptimizableOperation(selector, element)) {
-      if (_tryInlineMethod(
-          element, selector, mask, arguments, node, sourceInformation)) {
+      if (_tryInlineMethod(element, selector, mask, arguments, typeArguments,
+          node, sourceInformation)) {
         return;
       }
     }
@@ -4988,6 +4989,7 @@
       Selector selector,
       AbstractValue mask,
       List<HInstruction> providedArguments,
+      List<DartType> typeArguments,
       ir.Node currentNode,
       SourceInformation sourceInformation,
       {InterfaceType instanceType}) {
@@ -5149,8 +5151,15 @@
     }
 
     void doInlining() {
-      registry
-          .registerStaticUse(new StaticUse.inlining(function, instanceType));
+      if (function.isConstructor) {
+        registry.registerStaticUse(
+            new StaticUse.constructorInlining(function, instanceType));
+      } else {
+        assert(instanceType == null,
+            "Unexpected instance type for $function: $instanceType");
+        registry.registerStaticUse(
+            new StaticUse.methodInlining(function, typeArguments));
+      }
 
       // Add an explicit null check on the receiver before doing the
       // inlining. We use [element] to get the same name in the
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index b5cd0b2..7f5367c 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -234,21 +234,6 @@
 
   @override
   void visitIntLiteral(ir.IntLiteral literal) {
-    // Check that this value can be precisely represented as a double, and throw
-    // an error if not:
-    if (new BigInt.from(literal.value) !=
-        new BigInt.from(literal.value.toDouble())) {
-      // TODO(efortuna): Switch to error message.
-      reporter.reportWarningMessage(
-          CURRENT_ELEMENT_SPANNABLE, MessageKind.GENERIC, {
-        'text': 'The integer literal '
-            '${new BigInt.from(literal.value)} cannot be represented'
-            ' exactly in JavaScript and will be rounded to '
-            '${new BigInt.from(literal.value.toDouble())}. Use the rounded '
-            'value to avoid this warning.'
-      });
-    }
-
     impactBuilder.registerConstantLiteral(new IntConstantExpression(
         new BigInt.from(literal.value).toUnsigned(64)));
   }
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index cd71861..a0ac620 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -665,7 +665,7 @@
         node.typeArguments,
         node.sourceInformation);
     result.element = method;
-    _registry.registerStaticUse(new StaticUse.inlining(method, null));
+    _registry.registerStaticUse(new StaticUse.methodInlining(method, null));
     return result;
   }
 
@@ -927,7 +927,24 @@
   }
 
   HInstruction visitTypeConversion(HTypeConversion node) {
-    return node.isRedundant(_closedWorld) ? node.checkedInput : node;
+    if (node.isRedundant(_closedWorld)) return node.checkedInput;
+
+    // Simplify 'as T' where T is a simple type.
+    DartType checkedType = node.typeExpression;
+    if (checkedType is TypeVariableType && node.inputs.length == 2) {
+      HInstruction rep = node.typeRepresentation;
+      if (rep is HTypeInfoExpression &&
+          rep.kind == TypeInfoExpressionKind.COMPLETE &&
+          rep.inputs.isEmpty) {
+        DartType type = rep.dartType;
+        if (type.isInterfaceType && type.treatAsRaw) {
+          return node.checkedInput.convertType(_closedWorld, type, node.kind)
+            ..sourceInformation = node.sourceInformation;
+        }
+      }
+    }
+
+    return node;
   }
 
   HInstruction visitTypeKnown(HTypeKnown node) {
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..f19320a
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -0,0 +1,543 @@
+// 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 [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 [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y);
+
+  /// 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 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));
+}
+
+class ClassHierarchyImpl implements ClassHierarchy {
+  final CommonElements _commonElements;
+  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
+  final Map<ClassEntity, ClassSet> _classSets;
+
+  ClassHierarchyImpl(
+      this._commonElements, this._classHierarchyNodes, this._classSets);
+
+  /// 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];
+  }
+
+  /// 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);
+  }
+
+  /// 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 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);
+    }
+  }
+
+  /// 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);
+  }
+
+  /// 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);
+  }
+
+  /// 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);
+  }
+
+  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 const SubclassResult.empty();
+      }
+      return new SubclassResult.exact(cls1);
+    } 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 new SubclassResult.exact(cls1);
+        }
+      } else if (query2 == ClassQuery.SUBTYPE) {
+        // Exact [cls1] must be a subtype of [cls2] to have any classes in
+        // common.
+        if (isSubtypeOf(cls1, cls2)) {
+          return new SubclassResult.exact(cls1);
+        }
+      }
+      return const 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 new SubclassResult.exact(cls2);
+        }
+      } else if (query1 == ClassQuery.SUBTYPE) {
+        // Exact [cls2] must be a subtype of [cls1] to have any classes in
+        // common.
+        if (isSubtypeOf(cls2, cls1)) {
+          return new SubclassResult.exact(cls2);
+        }
+      }
+      return const 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 new SubclassResult.subclass(cls1);
+      } else if (isSubclassOf(cls2, cls1)) {
+        // The subclasses of [cls2] are contained within the subclasses of
+        // [cls1].
+        return new SubclassResult.subclass(cls2);
+      }
+      return const SubclassResult.empty();
+    } else if (query1 == ClassQuery.SUBCLASS) {
+      if (isSubtypeOf(cls1, cls2)) {
+        // The subclasses of [cls1] are all subtypes of [cls2].
+        return new SubclassResult.subclass(cls1);
+      }
+      if (cls1 == _commonElements.objectClass) {
+        // Since [cls1] is `Object` all subtypes of [cls2] are contained within
+        // the subclasses of [cls1].
+        return new SubclassResult.subtype(cls2);
+      }
+      // 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.subclasses(classes);
+    } else if (query2 == ClassQuery.SUBCLASS) {
+      if (isSubtypeOf(cls2, cls1)) {
+        // The subclasses of [cls2] are all subtypes of [cls1].
+        return new SubclassResult.subclass(cls2);
+      }
+      if (cls2 == _commonElements.objectClass) {
+        // Since [cls2] is `Object` all subtypes of [cls1] are contained within
+        // the subclasses of [cls2].
+        return new SubclassResult.subtype(cls1);
+      }
+      // 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.subclasses(classes);
+    } else {
+      if (cls1 == cls2 || isSubtypeOf(cls1, cls2)) {
+        // The subtypes of [cls1] are contained within the subtypes of [cls2].
+        return new SubclassResult.subtype(cls1);
+      } else if (isSubtypeOf(cls2, cls1)) {
+        // The subtypes of [cls2] are contained within the subtypes of [cls1].
+        return new SubclassResult.subtype(cls2);
+      }
+      // 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.subclasses(classes);
+    }
+  }
+}
+
+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);
+}
+
+/// 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 computed in [ClassHierarchy.commonSubclasses].
+class SubclassResult {
+  /// The classes in the result set. The classes are always disjoint wrt. the
+  /// interpretation of [query].
+  final List<ClassEntity> classes;
+
+  /// How [classes] should be interpreted: If `ClassQuery.EXACT`, only the
+  /// classes in [classes] are on the result set. If `ClassQuery.SUBCLASS`,
+  /// non-strict subclasses of the classes in [classes] are in the result set.
+  /// If `ClassQuery.SUBTYPE`, non-strict subtypes of the classes in [classes]
+  /// are in the result set.
+  final ClassQuery query;
+
+  /// Creates the empty result set.
+  const SubclassResult.empty()
+      : query = ClassQuery.EXACT,
+        classes = const <ClassEntity>[];
+
+  /// Creates the single set of [cls].
+  SubclassResult.exact(ClassEntity cls)
+      : query = ClassQuery.EXACT,
+        classes = <ClassEntity>[cls];
+
+  /// Creates the set of subclasses of [cls].
+  SubclassResult.subclass(ClassEntity cls)
+      : query = ClassQuery.SUBCLASS,
+        classes = <ClassEntity>[cls];
+
+  /// Creates the set of subtypes of [cls].
+  SubclassResult.subtype(ClassEntity cls)
+      : query = ClassQuery.SUBTYPE,
+        classes = <ClassEntity>[cls];
+
+  /// Creates the set of classes that are subclasses of a class in [classes].
+  SubclassResult.subclasses(this.classes) : query = ClassQuery.SUBCLASS;
+
+  SubclassResult.internal(this.query, this.classes);
+
+  String toString() => 'SubclassResult($query,$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/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index b0f526e..dc49fe5 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -445,6 +445,7 @@
         }
         break;
       case StaticUseKind.INLINING:
+        registerStaticInvocation(staticUse);
         break;
     }
     if (useSet.isNotEmpty) {
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 8788342..0db511d 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -523,12 +523,18 @@
   }
 
   /// Inlining of [element].
-  factory StaticUse.inlining(
-      FunctionEntity element, InterfaceType instanceType) {
+  factory StaticUse.constructorInlining(
+      ConstructorEntity element, InterfaceType instanceType) {
     return new StaticUse.internal(element, StaticUseKind.INLINING,
         type: instanceType);
   }
 
+  /// Inlining of [element].
+  factory StaticUse.methodInlining(
+      FunctionEntity element, List<DartType> typeArguments) {
+    return new GenericStaticUse.methodInlining(element, typeArguments);
+  }
+
   bool operator ==(other) {
     if (identical(this, other)) return true;
     if (other is! StaticUse) return false;
@@ -540,7 +546,7 @@
   }
 
   String toString() =>
-      'StaticUse($element,$kind,$type,' '$typeArguments,$callStructure)';
+      'StaticUse($element,$kind,$type,$typeArguments,$callStructure)';
 }
 
 class GenericStaticUse extends StaticUse {
@@ -559,6 +565,10 @@
             "${callStructure?.typeArgumentCount ?? 0} but "
             "${typeArguments?.length ?? 0} were passed."));
   }
+
+  GenericStaticUse.methodInlining(FunctionEntity entity, this.typeArguments)
+      : super.internal(entity, StaticUseKind.INLINING,
+            typeArgumentsHash: Hashing.listHash(typeArguments));
 }
 
 enum TypeUseKind {
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..d440deb 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,6 +69,8 @@
 
   Iterable<MemberEntity> get processedMembers;
 
+  ClassHierarchy get classHierarchy;
+
   /// Returns `true` if [cls] is either directly or indirectly instantiated.
   bool isInstantiated(ClassEntity cls);
 
@@ -172,27 +175,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);
 
@@ -355,19 +337,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 +373,8 @@
 
   final Iterable<MemberEntity> processedMembers;
 
+  final ClassHierarchy classHierarchy;
+
   ClosedWorldBase(
       this.elementEnvironment,
       this.dartTypes,
@@ -425,7 +396,9 @@
       AbstractValueStrategy abstractValueStrategy)
       : this._implementedClasses = implementedClasses,
         this._classHierarchyNodes = classHierarchyNodes,
-        this._classSets = classSets {}
+        this._classSets = classSets,
+        classHierarchy = new ClassHierarchyImpl(
+            commonElements, classHierarchyNodes, classSets) {}
 
   bool checkEntity(covariant Entity element);
 
@@ -665,27 +638,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;
@@ -809,38 +761,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) {
@@ -1037,23 +957,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 +973,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/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 33329bb..56f5b5f 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -58,6 +58,9 @@
   bool get nativeExtensionExpectsString => false;
 
   @override
+  bool get errorOnUnexactWebIntLiterals => true;
+
+  @override
   bool get enableNoSuchMethodForwarders => true;
 
   @override
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index c6e5ab7..60f32c8 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -92,18 +92,26 @@
   }
 
   String sdkJsPath;
+  String requirePath;
+  String ddcSdk;
   if (debug) {
     var sdkRoot = path.dirname(path.dirname(ddcPath));
     var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
     var genDir = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc');
-    sdkJsPath = path.join(genDir, kernel ? 'kernel' : 'js', mod);
+    sdkJsPath = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc',
+        kernel ? 'kernel' : 'js', mod);
+    requirePath = path.join(sdkRoot, 'third_party', 'requirejs');
+    ddcSdk = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc',
+        kernel ? path.join('kernel', 'ddc_sdk.dill') : 'ddc_sdk.sum');
   } else {
     var suffix = kernel ? path.join('kernel', mod) : mod;
     sdkJsPath = path.join(dartSdk, 'lib', 'dev_compiler', suffix);
+    requirePath = sdkJsPath;
+    ddcSdk = path.join(
+        dartSdk, 'lib', '_internal', kernel ? 'ddc_sdk.dill' : 'ddc_sdk.sum');
   }
   ProcessResult result;
   if (kernel) {
-    var ddcSdk = path.join(dartSdk, 'lib', '_internal', 'ddc_sdk.dill');
     result = runDdc('dartdevk', [
       '--modules=$mod',
       '--dart-sdk-summary=$ddcSdk',
@@ -114,6 +122,7 @@
   } else {
     result = runDdc('dartdevc', [
       '--modules=$mod',
+      '--dart-sdk-summary=$ddcSdk',
       '--library-root=$libRoot',
       '-o',
       '$libRoot/$basename.js',
@@ -143,7 +152,7 @@
     }
 
     var html = """
-<script src='$sdkJsPath/require.js'></script>
+<script src='$requirePath/require.js'></script>
 <script>
   require.config({
     baseUrl: '$libRoot',
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index 937accd..a34aabb 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -93,6 +93,7 @@
       -o $LIBROOT/$BASENAME.js $*
 fi
 
+export NODE_PATH
 pushd $LIBROOT > /dev/null
 # TODO(jmesserly): we could have this output the same content as the devtool
 # script, so you could debug the output without recompiling?
diff --git a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
index ca27f7f..16fc417 100644
--- a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
@@ -9,7 +9,8 @@
 import 'constructor_reference_builder.dart' show ConstructorReferenceBuilder;
 
 abstract class MetadataBuilder<T extends TypeBuilder> {
-  MetadataBuilder(Declaration parent, int charOffset);
+  final int charOffset;
+  MetadataBuilder(Declaration parent, this.charOffset);
 
   factory MetadataBuilder.fromConstructor(
       ConstructorReferenceBuilder constructorReference,
diff --git a/pkg/front_end/lib/src/fasta/deprecated_problems.dart b/pkg/front_end/lib/src/fasta/deprecated_problems.dart
index fd2e6dd..e197801 100644
--- a/pkg/front_end/lib/src/fasta/deprecated_problems.dart
+++ b/pkg/front_end/lib/src/fasta/deprecated_problems.dart
@@ -126,7 +126,7 @@
       request = await client.postUrl(serverUri);
     } on SocketException {
       // Assume the crash logger isn't running.
-      await client.close(force: true);
+      client.close(force: true);
       return new Future<T>.error(
           new Crash(uri, charOffset, error, trace), trace);
     }
@@ -147,7 +147,7 @@
     await note("\n${safeToString(e)}\n$s\n");
     await note("\n\n\nFE::ERROR::$json\n\n\n");
   }
-  await client.close(force: true);
+  client.close(force: true);
   await note("\n");
   return new Future<T>.error(error, trace);
 }
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 da38ef1..17e0074 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -215,6 +215,96 @@
     message: r"""'await' can only be used in 'async' or 'async*' methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            name2)> templateBoundIssueViaCycleNonSimplicity = const Template<
+        Message Function(String name,
+            String name2)>(
+    messageTemplate:
+        r"""Generic type '#name' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '#name2'.""",
+    tipTemplate:
+        r"""Try providing type arguments to '#name2' here or to some other raw types in the bounds along the reference chain.""",
+    withArguments: _withArgumentsBoundIssueViaCycleNonSimplicity);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeBoundIssueViaCycleNonSimplicity =
+    const Code<Message Function(String name, String name2)>(
+        "BoundIssueViaCycleNonSimplicity",
+        templateBoundIssueViaCycleNonSimplicity,
+        analyzerCode: "STRONG_MODE_NOT_INSTANTIATED_BOUND",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsBoundIssueViaCycleNonSimplicity(
+    String name, String name2) {
+  return new Message(codeBoundIssueViaCycleNonSimplicity,
+      message:
+          """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '${name2}'.""",
+      tip: """Try providing type arguments to '${name2}' here or to some other raw types in the bounds along the reference chain.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateBoundIssueViaLoopNonSimplicity = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Generic type '#name' can't be used without type arguments in the bounds of its own type variables.""",
+    tipTemplate: r"""Try providing type arguments to '#name' here.""",
+    withArguments: _withArgumentsBoundIssueViaLoopNonSimplicity);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeBoundIssueViaLoopNonSimplicity =
+    const Code<Message Function(String name)>("BoundIssueViaLoopNonSimplicity",
+        templateBoundIssueViaLoopNonSimplicity,
+        analyzerCode: "STRONG_MODE_NOT_INSTANTIATED_BOUND",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsBoundIssueViaLoopNonSimplicity(String name) {
+  return new Message(codeBoundIssueViaLoopNonSimplicity,
+      message:
+          """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables.""",
+      tip: """Try providing type arguments to '${name}' here.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateBoundIssueViaRawTypeWithNonSimpleBounds =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Generic type '#name' can't be used without type arguments in a type variable bound.""",
+        tipTemplate: r"""Try providing type arguments to '#name' here.""",
+        withArguments: _withArgumentsBoundIssueViaRawTypeWithNonSimpleBounds);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeBoundIssueViaRawTypeWithNonSimpleBounds =
+    const Code<Message Function(String name)>(
+        "BoundIssueViaRawTypeWithNonSimpleBounds",
+        templateBoundIssueViaRawTypeWithNonSimpleBounds,
+        analyzerCode: "STRONG_MODE_NOT_INSTANTIATED_BOUND",
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsBoundIssueViaRawTypeWithNonSimpleBounds(String name) {
+  return new Message(codeBoundIssueViaRawTypeWithNonSimpleBounds,
+      message:
+          """Generic type '${name}' can't be used without type arguments in a type variable bound.""",
+      tip: """Try providing type arguments to '${name}' here.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeBreakOutsideOfLoop = messageBreakOutsideOfLoop;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1001,6 +1091,32 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        String
+            string)> templateConstEvalNonConstantVariableGet = const Template<
+        Message Function(String string)>(
+    messageTemplate:
+        r"""The variable '#string' is not a constant, only constant expressions are allowed.""",
+    withArguments: _withArgumentsConstEvalNonConstantVariableGet);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+    codeConstEvalNonConstantVariableGet =
+    const Code<Message Function(String string)>(
+        "ConstEvalNonConstantVariableGet",
+        templateConstEvalNonConstantVariableGet,
+        analyzerCode: "NON_CONSTANT_VALUE_IN_INITIALIZER");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalNonConstantVariableGet(String string) {
+  return new Message(codeConstEvalNonConstantVariableGet,
+      message:
+          """The variable '${string}' is not a constant, only constant expressions are allowed.""",
+      arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         String string,
         String
             string2)> templateConstEvalZeroDivisor = const Template<
@@ -4541,6 +4657,51 @@
         r"""Try removing the other directives, or moving them to the library for which this is a part.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateNonSimpleBoundViaReference =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Bound of this variable references raw type '#name'.""",
+        withArguments: _withArgumentsNonSimpleBoundViaReference);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNonSimpleBoundViaReference =
+    const Code<Message Function(String name)>(
+        "NonSimpleBoundViaReference", templateNonSimpleBoundViaReference,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonSimpleBoundViaReference(String name) {
+  return new Message(codeNonSimpleBoundViaReference,
+      message: """Bound of this variable references raw type '${name}'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String
+            name)> templateNonSimpleBoundViaVariable = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Bound of this variable references variable '#name' from the same declaration.""",
+    withArguments: _withArgumentsNonSimpleBoundViaVariable);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNonSimpleBoundViaVariable =
+    const Code<Message Function(String name)>(
+        "NonSimpleBoundViaVariable", templateNonSimpleBoundViaVariable,
+        severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonSimpleBoundViaVariable(String name) {
+  return new Message(codeNonSimpleBoundViaVariable,
+      message:
+          """Bound of this variable references variable '${name}' from the same declaration.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String name,
@@ -6326,6 +6487,38 @@
         r"""Try removing the keyword 'var', or replacing it with the name of the return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String string,
+        String
+            string2)> templateWebLiteralCannotBeRepresentedExactly = const Template<
+        Message Function(String string, String string2)>(
+    messageTemplate:
+        r"""The integer literal #string can't be represented exactly in JavaScript.""",
+    tipTemplate:
+        r"""Try changing the literal to something that can be represented in Javascript. In Javascript #string2 is the nearest value that can be represented exactly.""",
+    withArguments: _withArgumentsWebLiteralCannotBeRepresentedExactly);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+    codeWebLiteralCannotBeRepresentedExactly =
+    const Code<Message Function(String string, String string2)>(
+        "WebLiteralCannotBeRepresentedExactly",
+        templateWebLiteralCannotBeRepresentedExactly,
+        dart2jsCode: "*fatal*",
+        severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsWebLiteralCannotBeRepresentedExactly(
+    String string, String string2) {
+  return new Message(codeWebLiteralCannotBeRepresentedExactly,
+      message:
+          """The integer literal ${string} can't be represented exactly in JavaScript.""",
+      tip: """Try changing the literal to something that can be represented in Javascript. In Javascript ${string2} is the nearest value that can be represented exactly.""",
+      arguments: {'string': string, 'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeWithBeforeExtends = messageWithBeforeExtends;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index a1382d0..4bdff1a 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -171,7 +171,7 @@
       }
 
       Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
-      if (fullComponent) {
+      if (data.includeUserLoadedLibraries || fullComponent) {
         invalidatedUris.add(entryPoint);
       }
 
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 1a6e1f0..c72cfab 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6,8 +6,6 @@
 
 import 'dart:core' hide MapEntry;
 
-import 'package:kernel/ast.dart' as kernel show Expression, Statement;
-
 import '../constant_context.dart' show ConstantContext;
 
 import '../fasta_codes.dart' as fasta;
@@ -107,7 +105,7 @@
 
 import 'kernel_api.dart';
 
-import 'kernel_ast_api.dart' hide Expression, Statement;
+import 'kernel_ast_api.dart';
 
 import 'kernel_builder.dart';
 
@@ -118,9 +116,8 @@
 // TODO(ahe): Remove this and ensure all nodes have a location.
 const noLocation = null;
 
-abstract class BodyBuilder<Expression, Statement, Arguments>
-    extends ScopeListener<JumpTarget<Statement>>
-    implements ExpressionGeneratorHelper<Expression, Statement, Arguments> {
+abstract class BodyBuilder extends ScopeListener<JumpTarget>
+    implements ExpressionGeneratorHelper {
   // TODO(ahe): Rename [library] to 'part'.
   @override
   final KernelLibraryBuilder library;
@@ -141,6 +138,8 @@
 
   final bool stringExpectedAfterNative;
 
+  final bool errorOnUnexactWebIntLiterals;
+
   /// Whether to ignore an unresolved reference to `main` within the body of
   /// `_getMainClosure` when compiling the current library.
   ///
@@ -203,9 +202,9 @@
 
   int functionNestingLevel = 0;
 
-  kernel.Statement compileTimeErrorInTry;
+  Statement compileTimeErrorInTry;
 
-  kernel.Statement compileTimeErrorInLoopOrSwitch;
+  Statement compileTimeErrorInLoopOrSwitch;
 
   Scope switchScope;
 
@@ -238,6 +237,8 @@
             library.loader.target.backendTarget.enableNative(library.uri),
         stringExpectedAfterNative =
             library.loader.target.backendTarget.nativeExtensionExpectsString,
+        errorOnUnexactWebIntLiterals =
+            library.loader.target.backendTarget.errorOnUnexactWebIntLiterals,
         ignoreMainInGetMainClosure = library.uri.scheme == 'dart' &&
             (library.uri.path == "_builtin" || library.uri.path == "ui"),
         needsImplicitSuperInitializer =
@@ -294,7 +295,7 @@
 
   @override
   Expression toValue(Object node) {
-    if (node is Generator<Expression, Statement, Arguments>) {
+    if (node is Generator) {
       return node.buildSimpleRead();
     } else if (node is Expression) {
       return node;
@@ -312,8 +313,7 @@
   }
 
   Expression toEffect(Object node) {
-    if (node is Generator<Expression, Statement, Arguments>)
-      return node.buildForEffect();
+    if (node is Generator) return node.buildForEffect();
     return toValue(node);
   }
 
@@ -359,11 +359,11 @@
       switchScope.unclaimedForwardDeclarations
           .forEach((String name, Declaration declaration) {
         if (outerSwitchScope == null) {
-          JumpTarget<Statement> target = declaration;
+          JumpTarget target = declaration;
           for (Statement statement in target.users) {
-            toKernelStatement(statement).parent.replaceChild(
-                toKernelStatement(statement),
-                wrapInCompileTimeErrorStatement(toKernelStatement(statement),
+            statement.parent.replaceChild(
+                statement,
+                wrapInCompileTimeErrorStatement(statement,
                     fasta.templateLabelNotFound.withArguments(name)));
           }
         } else {
@@ -382,14 +382,13 @@
     int offset = variable.fileOffset;
     Message message = template.withArguments(name);
     if (variable.initializer == null) {
-      variable.initializer = toKernelExpression(
-          buildCompileTimeError(message, offset, name.length, context: context))
-        ..parent = variable;
+      variable.initializer =
+          buildCompileTimeError(message, offset, name.length, context: context)
+            ..parent = variable;
     } else {
-      variable.initializer = toKernelExpression(wrapInLocatedCompileTimeError(
-          toExpression(variable.initializer),
-          message.withLocation(uri, offset, name.length),
-          context: context))
+      variable.initializer = wrapInLocatedCompileTimeError(
+          variable.initializer, message.withLocation(uri, offset, name.length),
+          context: context)
         ..parent = variable;
     }
   }
@@ -426,9 +425,8 @@
   }
 
   @override
-  JumpTarget<Statement> createJumpTarget(JumpTargetKind kind, int charOffset) {
-    return new JumpTarget<Statement>(
-        kind, functionNestingLevel, member, charOffset);
+  JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) {
+    return new JumpTarget(kind, functionNestingLevel, member, charOffset);
   }
 
   @override
@@ -459,7 +457,7 @@
       }
       if (name?.isNotEmpty ?? false) {
         Token period = periodBeforeName ?? beginToken.next;
-        Generator<Expression, Statement, Arguments> generator = expression;
+        Generator generator = expression;
         expression = generator.buildPropertyAccess(
             new IncompletePropertyAccessGenerator(
                 this, period.next, new Name(name, library.library)),
@@ -468,8 +466,7 @@
       }
 
       ConstantContext savedConstantContext = pop();
-      if (expression
-          is! StaticAccessGenerator<Expression, Statement, Arguments>) {
+      if (expression is! StaticAccessGenerator) {
         push(wrapInCompileTimeError(
             toValue(expression), fasta.messageExpressionNotMetadata));
       } else {
@@ -529,7 +526,7 @@
             this,
             factory,
             field.hasTypeInferredFromInitializer ? null : field.builtType,
-            toKernelExpression(initializer));
+            initializer);
       }
     }
     pop(); // Type.
@@ -544,7 +541,7 @@
         field = fields[i].target;
         cloner ??= new CloneVisitor();
         for (Expression annotation in annotations) {
-          field.addAnnotation(cloner.clone(toKernelExpression(annotation)));
+          field.addAnnotation(cloner.clone(annotation));
         }
       }
     }
@@ -588,11 +585,8 @@
                       formal.charOffset),
                   formal.charOffset);
             } else {
-              initializer = buildFieldInitializer(
-                  true,
-                  formal.name,
-                  formal.charOffset,
-                  toExpression(new VariableGet(formal.declaration)),
+              initializer = buildFieldInitializer(true, formal.name,
+                  formal.charOffset, new VariableGet(formal.declaration),
                   formalType: formal.declaration.type);
             }
             member.addInitializer(initializer, _typeInferrer);
@@ -642,11 +636,11 @@
     Initializer initializer;
     if (node is Initializer) {
       initializer = node;
-    } else if (node is Generator<Expression, Statement, Arguments>) {
+    } else if (node is Generator) {
       initializer = node.buildFieldInitializer(initializedFields);
     } else if (node is ConstructorInvocation) {
       initializer = buildSuperInitializer(
-          false, node.target, unchecked(node.arguments), token.charOffset);
+          false, node.target, node.arguments, token.charOffset);
     } else {
       Expression value = toValue(node);
       if (node is! Throw) {
@@ -678,7 +672,7 @@
       List<Object> annotations,
       FormalParameters<Expression, Statement, Arguments> formals,
       AsyncMarker asyncModifier,
-      kernel.Statement body) {
+      Statement body) {
     debugEvent("finishFunction");
     typePromoter.finished();
 
@@ -694,10 +688,9 @@
             // TODO(ahe): Should store: realParameter.fileOffset
             // https://github.com/dart-lang/sdk/issues/32289
             null);
-        realParameter.initializer = toKernelExpression(initializer)
-          ..parent = realParameter;
+        realParameter.initializer = initializer..parent = realParameter;
         _typeInferrer.inferParameterInitializer(
-            this, factory, toKernelExpression(initializer), realParameter.type);
+            this, factory, initializer, realParameter.type);
       }
     }
 
@@ -719,11 +712,10 @@
           // Add them as local variable to put them in scope of the body.
           List<Statement> statements = <Statement>[];
           for (KernelFormalParameterBuilder parameter in builder.formals) {
-            statements.add(toStatement(parameter.target));
+            statements.add(parameter.target);
           }
-          statements.add(toStatement(body));
-          body = toKernelStatement(
-              storeOffset(forest.block(null, statements, null), charOffset));
+          statements.add(body);
+          body = forest.block(null, statements, null)..fileOffset = charOffset;
         }
         body = wrapInCompileTimeErrorStatement(
             body, fasta.messageSetterWithWrongNumberOfFormals);
@@ -744,7 +736,7 @@
     Member target = builder.target;
     _typeInferrer.inferMetadata(this, factory, annotations);
     for (Expression annotation in annotations ?? const []) {
-      target.addAnnotation(toKernelExpression(annotation));
+      target.addAnnotation(annotation);
     }
     if (builder is KernelConstructorBuilder) {
       finishConstructor(builder, asyncModifier);
@@ -757,8 +749,8 @@
   }
 
   @override
-  List<kernel.Expression> finishMetadata() {
-    List<kernel.Expression> expressions = pop();
+  List<Expression> finishMetadata() {
+    List<Expression> expressions = pop();
     _typeInferrer.inferMetadata(this, factory, expressions);
     return expressions;
   }
@@ -792,13 +784,12 @@
               .withLocation(uri, eof.charOffset, eof.length));
     }
 
-    ReturnJudgment fakeReturn =
-        new ReturnJudgment(toKernelExpression(expression));
+    ReturnJudgment fakeReturn = new ReturnJudgment(null, null, expression);
 
     _typeInferrer.inferFunctionBody(
         this, factory, const DynamicType(), AsyncMarker.Sync, fakeReturn);
 
-    return toExpression(fakeReturn.expression);
+    return fakeReturn.expression;
   }
 
   Expression parseFieldInitializer(Token token) {
@@ -882,8 +873,8 @@
         if (i > firstNamedArgumentIndex) {
           arguments[i] = new NamedExpression(
               "#$i",
-              toKernelExpression(deprecated_buildCompileTimeError(
-                  "Expected named argument.", forest.readOffset(argument))))
+              deprecated_buildCompileTimeError(
+                  "Expected named argument.", forest.readOffset(argument)))
             ..fileOffset = beginToken.charOffset;
         }
       }
@@ -898,9 +889,9 @@
           named = <NamedExpression>[
             new NamedExpression(
                 named[1].name,
-                toKernelExpression(deprecated_buildCompileTimeError(
+                deprecated_buildCompileTimeError(
                     "Duplicated named argument '${named[1].name}'.",
-                    named[1].fileOffset)))
+                    named[1].fileOffset))
           ];
         }
       } else if (named.length > 2) {
@@ -910,10 +901,9 @@
           if (seenNames.containsKey(expression.name)) {
             hasProblem = true;
             NamedExpression prevNamedExpression = seenNames[expression.name];
-            prevNamedExpression.value = toKernelExpression(
-                deprecated_buildCompileTimeError(
-                    "Duplicated named argument '${expression.name}'.",
-                    expression.fileOffset))
+            prevNamedExpression.value = deprecated_buildCompileTimeError(
+                "Duplicated named argument '${expression.name}'.",
+                expression.fileOffset)
               ..parent = prevNamedExpression;
           } else {
             seenNames[expression.name] = expression;
@@ -941,7 +931,7 @@
   void handleParenthesizedExpression(Token token) {
     debugEvent("ParenthesizedExpression");
     push(new ParenthesizedExpressionGenerator(
-        this, token.endGroup, toKernelExpression(popForValue())));
+        this, token.endGroup, popForValue()));
   }
 
   @override
@@ -973,7 +963,7 @@
 
   @override
   finishSend(Object receiver, Arguments arguments, int charOffset) {
-    if (receiver is Generator<Expression, Statement, Arguments>) {
+    if (receiver is Generator) {
       return receiver.doInvocation(charOffset, arguments);
     } else {
       return buildMethodInvocation(
@@ -986,17 +976,15 @@
   void beginCascade(Token token) {
     debugEvent("beginCascade");
     Expression expression = popForValue();
-    if (expression is ShadowCascadeExpression) {
+    if (expression is CascadeJudgment) {
       push(expression);
-      push(new VariableUseGenerator<Expression, Statement, Arguments>(
-          this, token, expression.variable));
+      push(new VariableUseGenerator(this, token, expression.variable));
       expression.extend();
     } else {
       VariableDeclaration variable = new VariableDeclarationJudgment.forValue(
-          toKernelExpression(expression), functionNestingLevel);
-      push(new ShadowCascadeExpression(variable));
-      push(new VariableUseGenerator<Expression, Statement, Arguments>(
-          this, token, variable));
+          expression, functionNestingLevel);
+      push(new CascadeJudgment(variable));
+      push(new VariableUseGenerator(this, token, variable));
     }
   }
 
@@ -1004,8 +992,8 @@
   void endCascade() {
     debugEvent("endCascade");
     Expression expression = popForEffect();
-    ShadowCascadeExpression cascadeReceiver = pop();
-    cascadeReceiver.finalize(toKernelExpression(expression));
+    CascadeJudgment cascadeReceiver = pop();
+    cascadeReceiver.finalize(expression);
     push(cascadeReceiver);
   }
 
@@ -1028,8 +1016,7 @@
   void beginBinaryExpression(Token token) {
     if (optional("&&", token) || optional("||", token)) {
       Expression lhs = popForValue();
-      typePromoter.enterLogicalExpression(
-          toKernelExpression(lhs), token.stringValue);
+      typePromoter.enterLogicalExpression(lhs, token.stringValue);
       push(lhs);
     }
   }
@@ -1083,8 +1070,7 @@
     Expression receiver = pop();
     Expression logicalExpression =
         forest.logicalExpression(receiver, token, argument);
-    typePromoter.exitLogicalExpression(
-        toKernelExpression(argument), toKernelExpression(logicalExpression));
+    typePromoter.exitLogicalExpression(argument, logicalExpression);
     push(logicalExpression);
   }
 
@@ -1092,17 +1078,16 @@
   void doIfNull(Token token) {
     Expression b = popForValue();
     Expression a = popForValue();
-    VariableDeclaration variable =
-        new VariableDeclaration.forValue(toKernelExpression(a));
-    push(new ShadowIfNullExpression(
+    VariableDeclaration variable = new VariableDeclaration.forValue(a);
+    push(new IfNullJudgment(
         variable,
-        toKernelExpression(forest.conditionalExpression(
-            toExpression(buildIsNull(
-                new VariableGet(variable), offsetForToken(token), this)),
+        token,
+        forest.conditionalExpression(
+            buildIsNull(new VariableGet(variable), offsetForToken(token), this),
             token,
             b,
             null,
-            toExpression(new VariableGet(variable)))))
+            new VariableGet(variable)))
       ..fileOffset = offsetForToken(token));
   }
 
@@ -1124,7 +1109,7 @@
     Object send = pop();
     if (send is IncompleteSendGenerator) {
       Object receiver = optional(".", token) ? pop() : popForValue();
-      if (receiver is TypeUseGenerator<dynamic, dynamic, dynamic>) {
+      if (receiver is TypeUseGenerator) {
         _typeInferrer.storeTypeUse(receiver);
       }
       push(send.withReceiver(receiver, token.charOffset));
@@ -1200,16 +1185,14 @@
       return buildCompileTimeError(message, charOffset, noLength,
           context: context);
     } else {
-      Expression error = toExpression(library.loader
-          .instantiateNoSuchMethodError(toKernelExpression(receiver), name,
-              forest.castArguments(arguments), charOffset,
-              isMethod: !isGetter && !isSetter,
-              isGetter: isGetter,
-              isSetter: isSetter,
-              isStatic: isStatic,
-              isTopLevel: !isStatic && !isSuper));
-      return toExpression(
-          new ShadowSyntheticExpression(new Throw(toKernelExpression(error))));
+      Expression error = library.loader.instantiateNoSuchMethodError(
+          receiver, name, forest.castArguments(arguments), charOffset,
+          isMethod: !isGetter && !isSetter,
+          isGetter: isGetter,
+          isSetter: isSetter,
+          isStatic: isStatic,
+          isTopLevel: !isStatic && !isSuper);
+      return new SyntheticExpressionJudgment(new Throw(error));
     }
   }
 
@@ -1425,13 +1408,12 @@
         if (constantContext != ConstantContext.none || member.isField) {
           return new UnresolvedNameGenerator(this, token, n);
         }
-        return new ThisPropertyAccessGenerator<Expression, Statement,
-                Arguments>(this, token, n, lookupInstanceMember(n),
-            lookupInstanceMember(n, isSetter: true));
+        return new ThisPropertyAccessGenerator(this, token, n,
+            lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
       } else if (ignoreMainInGetMainClosure &&
           name == "main" &&
           member?.name == "_getMainClosure") {
-        return storeOffset(forest.literalNull(null), charOffset);
+        return forest.literalNull(null)..fileOffset = charOffset;
       } else {
         return new UnresolvedNameGenerator(this, token, n);
       }
@@ -1442,12 +1424,10 @@
         deprecated_addCompileTimeError(
             charOffset, "Not a constant expression.");
       }
-      TypeUseGenerator<Expression, Statement, Arguments> generator =
-          new TypeUseGenerator<Expression, Statement, Arguments>(
-              this, token, prefix, charOffset, declaration, name);
+      TypeUseGenerator generator = new TypeUseGenerator(
+          this, token, prefix, charOffset, declaration, name);
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator<Expression, Statement, Arguments>(
-              this, token, prefix, generator)
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
           : generator;
     } else if (declaration.isLocal) {
       if (constantContext != ConstantContext.none &&
@@ -1464,16 +1444,14 @@
         Object fact = typePromoter.getFactForAccess(
             declaration.target, functionNestingLevel);
         Object scope = typePromoter.currentScope;
-        return new ReadOnlyAccessGenerator<Expression, Statement, Arguments>(
+        return new ReadOnlyAccessGenerator(
             this,
             token,
-            toExpression(
-                new VariableGetJudgment(declaration.target, fact, scope)
-                  ..fileOffset = charOffset),
+            new VariableGetJudgment(declaration.target, fact, scope)
+              ..fileOffset = charOffset,
             name);
       } else {
-        return new VariableUseGenerator<Expression, Statement, Arguments>(
-            this, token, declaration.target);
+        return new VariableUseGenerator(this, token, declaration.target);
       }
     } else if (declaration.isInstanceMember) {
       if (constantContext != ConstantContext.none &&
@@ -1496,16 +1474,13 @@
         getter = declaration.target;
         setter = lookupInstanceMember(n, isSetter: true);
       }
-      return new ThisPropertyAccessGenerator<Expression, Statement, Arguments>(
-          this, token, n, getter, setter);
+      return new ThisPropertyAccessGenerator(this, token, n, getter, setter);
     } else if (declaration.isRegularMethod) {
       assert(declaration.isStatic || declaration.isTopLevel);
-      StaticAccessGenerator<Expression, Statement, Arguments> generator =
-          new StaticAccessGenerator<Expression, Statement, Arguments>(
-              this, token, declaration.target, null);
+      StaticAccessGenerator generator =
+          new StaticAccessGenerator(this, token, declaration.target, null);
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator<Expression, Statement, Arguments>(
-              this, token, prefix, generator)
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
           : generator;
     } else if (declaration is PrefixBuilder) {
       if (constantContext != ConstantContext.none && declaration.deferred) {
@@ -1520,8 +1495,7 @@
       _typeInferrer.storePrefix(token, declaration);
       return declaration;
     } else if (declaration is LoadLibraryBuilder) {
-      return new LoadLibraryGenerator<Expression, Statement, Arguments>(
-          this, token, declaration);
+      return new LoadLibraryGenerator(this, token, declaration);
     } else {
       if (declaration.hasProblem && declaration is! AccessErrorBuilder)
         return declaration;
@@ -1533,9 +1507,8 @@
       } else if (declaration.isField && !declaration.isFinal) {
         setter = declaration;
       }
-      StaticAccessGenerator<Expression, Statement, Arguments> generator =
-          new StaticAccessGenerator<Expression, Statement,
-              Arguments>.fromBuilder(this, declaration, token, setter);
+      StaticAccessGenerator generator = new StaticAccessGenerator.fromBuilder(
+          this, declaration, token, setter);
       if (constantContext != ConstantContext.none) {
         Member readTarget = generator.readTarget;
         if (!(readTarget is Field && readTarget.isConst ||
@@ -1546,8 +1519,7 @@
         }
       }
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator<Expression, Statement, Arguments>(
-              this, token, prefix, generator)
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
           : generator;
     }
   }
@@ -1642,8 +1614,8 @@
         if (expressions == null) {
           expressions = parts.sublist(0, i);
         }
-        for (kernel.Expression expression in part.expressions) {
-          expressions.add(toExpression(expression));
+        for (Expression expression in part.expressions) {
+          expressions.add(expression);
         }
       } else {
         if (expressions != null) {
@@ -1659,9 +1631,11 @@
     debugEvent("LiteralInt");
     int value = int.parse(token.lexeme, onError: (_) => null);
     if (value == null) {
-      push(new LargeIntAccessGenerator<Expression, Statement, Arguments>(
-          this, token));
+      push(new LargeIntAccessGenerator(this, token));
     } else {
+      if (errorOnUnexactWebIntLiterals) {
+        checkWebIntLiteralsErrorIfUnexact(value, token);
+      }
       push(forest.literalInt(value, token));
     }
   }
@@ -1749,7 +1723,7 @@
     bool isFinal = (currentLocalVariableModifiers & finalMask) != 0;
     assert(isConst == (constantContext == ConstantContext.inferred));
     push(new VariableDeclarationJudgment(identifier.name, functionNestingLevel,
-        initializer: toKernelExpression(initializer),
+        initializer: initializer,
         type: currentLocalVariableType,
         isFinal: isFinal,
         isConst: isConst)
@@ -1811,7 +1785,7 @@
       List<Expression> annotations = pop();
       if (annotations != null) {
         for (Expression annotation in annotations) {
-          variable.addAnnotation(toKernelExpression(annotation));
+          variable.addAnnotation(annotation);
         }
       }
       push(variable);
@@ -1825,7 +1799,7 @@
       if (annotations != null) {
         for (VariableDeclaration variable in variables) {
           for (Expression annotation in annotations) {
-            variable.addAnnotation(toKernelExpression(annotation));
+            variable.addAnnotation(annotation);
           }
         }
       }
@@ -1852,19 +1826,19 @@
     debugEvent("AssignmentExpression");
     Expression value = popForValue();
     Object generator = pop();
-    if (generator is! Generator<Expression, Statement, Arguments>) {
+    if (generator is! Generator) {
       push(buildCompileTimeError(fasta.messageNotAnLvalue,
           offsetForToken(token), lengthForToken(token)));
     } else {
-      push(new DelayedAssignment(this, token, generator,
-          toKernelExpression(value), token.stringValue));
+      push(new DelayedAssignment(
+          this, token, generator, value, token.stringValue));
     }
   }
 
   @override
   void enterLoop(int charOffset) {
-    if (peek() is LabelTarget<Statement>) {
-      LabelTarget<Statement> target = peek();
+    if (peek() is LabelTarget) {
+      LabelTarget target = peek();
       enterBreakTarget(charOffset, target.breakTarget);
       enterContinueTarget(charOffset, target.continueTarget);
     } else {
@@ -1882,27 +1856,17 @@
     }
   }
 
-  List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
-    if (variableOrExpression is Generator<Expression, Statement, Arguments>) {
-      variableOrExpression = variableOrExpression.buildForEffect();
-    }
+  List<VariableDeclaration> buildForInitVariableDeclarations(
+      variableOrExpression) {
     if (variableOrExpression is VariableDeclaration) {
       return <VariableDeclaration>[variableOrExpression];
-    } else if (variableOrExpression is Expression) {
-      VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
-          toKernelExpression(variableOrExpression), functionNestingLevel);
-      return <VariableDeclaration>[variable];
-    } else if (variableOrExpression is ExpressionStatement) {
-      VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
-          variableOrExpression.expression, functionNestingLevel);
-      return <VariableDeclaration>[variable];
     } else if (forest.isVariablesDeclaration(variableOrExpression)) {
       return forest
           .variablesDeclarationExtractDeclarations(variableOrExpression);
     } else if (variableOrExpression is List<Object>) {
       List<VariableDeclaration> variables = <VariableDeclaration>[];
       for (Object v in variableOrExpression) {
-        variables.addAll(buildVariableDeclarations(v));
+        variables.addAll(buildForInitVariableDeclarations(v));
       }
       return variables;
     } else if (variableOrExpression == null) {
@@ -1911,6 +1875,15 @@
     return null;
   }
 
+  List<ExpressionJudgment> buildForInitExpressions(variableOrExpression) {
+    if (variableOrExpression is ExpressionJudgment) {
+      return <ExpressionJudgment>[variableOrExpression];
+    } else if (variableOrExpression is ExpressionStatementJudgment) {
+      return <ExpressionJudgment>[variableOrExpression.expression];
+    }
+    return null;
+  }
+
   @override
   void endForStatement(Token forKeyword, Token leftParen, Token leftSeparator,
       int updateExpressionCount, Token endToken) {
@@ -1919,15 +1892,19 @@
     List<Expression> updates = popListForEffect(updateExpressionCount);
     Statement conditionStatement = popStatement();
     Object variableOrExpression = pop();
-    List<VariableDeclaration> variables =
-        buildVariableDeclarations(variableOrExpression);
-    if (variables == null) {
-      return unhandled("${variableOrExpression.runtimeType}", "endForStatement",
-          forKeyword.charOffset, uri);
-    }
+
+    variableOrExpression = variableOrExpression is Generator
+        ? variableOrExpression.buildForEffect()
+        : variableOrExpression;
+    List<ExpressionJudgment> initializers =
+        buildForInitExpressions(variableOrExpression);
+    List<VariableDeclaration> variableList = initializers == null
+        ? buildForInitVariableDeclarations(variableOrExpression)
+        : null;
+
     exitLocalScope();
-    JumpTarget<Statement> continueTarget = exitContinueTarget();
-    JumpTarget<Statement> breakTarget = exitBreakTarget();
+    JumpTarget continueTarget = exitContinueTarget();
+    JumpTarget breakTarget = exitBreakTarget();
     if (continueTarget.hasUsers) {
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
@@ -1942,8 +1919,8 @@
     Statement result = forest.forStatement(
         forKeyword,
         leftParen,
-        variables,
-        variables,
+        variableList,
+        initializers,
         leftSeparator,
         condition,
         conditionStatement,
@@ -2109,8 +2086,7 @@
       if (prefix is PrefixBuilder) {
         name = scopeLookup(prefix.exportScope, suffix.name, beginToken,
             isQualified: true, prefix: prefix);
-      } else if (prefix
-          is ErroneousExpressionGenerator<Expression, Statement, Arguments>) {
+      } else if (prefix is ErroneousExpressionGenerator) {
         push(prefix.buildErroneousTypeNotAPrefix(suffix));
         return;
       } else {
@@ -2121,7 +2097,7 @@
         return;
       }
     }
-    if (name is Generator<Expression, Statement, Arguments>) {
+    if (name is Generator) {
       push(name.buildTypeWithBuiltArguments(arguments));
     } else if (name is TypeBuilder) {
       push(name.build(library));
@@ -2200,8 +2176,8 @@
     bool isInverted = not != null;
     Expression isExpression = forest.isExpression(operand, operator, not, type);
     if (operand is VariableGet) {
-      typePromoter.handleIsCheck(toKernelExpression(isExpression), isInverted,
-          operand.variable, type, functionNestingLevel);
+      typePromoter.handleIsCheck(isExpression, isInverted, operand.variable,
+          type, functionNestingLevel);
     }
     if (constantContext != ConstantContext.none) {
       push(deprecated_buildCompileTimeError(
@@ -2214,7 +2190,7 @@
   @override
   void beginConditionalExpression(Token question) {
     Expression condition = popForValue();
-    typePromoter.enterThen(toKernelExpression(condition));
+    typePromoter.enterThen(condition);
     push(condition);
     super.beginConditionalExpression(question);
   }
@@ -2309,11 +2285,10 @@
     }
     if (annotations != null) {
       if (functionNestingLevel == 0) {
-        _typeInferrer.inferMetadata(
-            this, factory, toKernelExpressionList(annotations));
+        _typeInferrer.inferMetadata(this, factory, annotations);
       }
       for (Expression annotation in annotations) {
-        variable.addAnnotation(toKernelExpression(annotation));
+        variable.addAnnotation(annotation);
       }
     }
     push(variable);
@@ -2372,8 +2347,7 @@
     debugEvent("ValuedFormalParameter");
     Expression initializer = popForValue();
     Identifier name = pop();
-    push(
-        new InitializedIdentifier(name.token, toKernelExpression(initializer)));
+    push(new InitializedIdentifier(name.token, initializer));
   }
 
   @override
@@ -2455,9 +2429,9 @@
         body = forest.block(
             catchKeyword,
             <Statement>[
-              toStatement(compileTimeErrorInTry ??=
+              compileTimeErrorInTry ??=
                   deprecated_buildCompileTimeErrorStatement(
-                      "Invalid catch arguments.", catchKeyword.next.charOffset))
+                      "Invalid catch arguments.", catchKeyword.next.charOffset)
             ],
             null);
       }
@@ -2494,14 +2468,14 @@
     Expression index = popForValue();
     Object receiver = pop();
     if (receiver is ThisAccessGenerator && receiver.isSuper) {
-      push(new SuperIndexedAccessGenerator<Expression, Statement, Arguments>(
+      push(new SuperIndexedAccessGenerator(
           this,
           openSquareBracket,
           index,
           lookupInstanceMember(indexGetName, isSuper: true),
           lookupInstanceMember(indexSetName, isSuper: true)));
     } else {
-      push(IndexedAccessGenerator.make<Expression, Statement, Arguments>(
+      push(IndexedAccessGenerator.make(
           this, openSquareBracket, toValue(receiver), index, null, null));
     }
   }
@@ -2518,11 +2492,13 @@
       if (optional("-", token)) {
         operator = "unary-";
 
-        if (receiver
-            is LargeIntAccessGenerator<Expression, Statement, Arguments>) {
+        if (receiver is LargeIntAccessGenerator) {
           int value = int.tryParse("-" + receiver.token.lexeme);
           if (value != null) {
             receiverValue = forest.literalInt(value, token);
+            if (errorOnUnexactWebIntLiterals) {
+              checkWebIntLiteralsErrorIfUnexact(value, token);
+            }
           }
         }
       }
@@ -2554,7 +2530,7 @@
   void handleUnaryPrefixAssignmentExpression(Token token) {
     debugEvent("UnaryPrefixAssignmentExpression");
     Object generator = pop();
-    if (generator is Generator<Expression, Statement, Arguments>) {
+    if (generator is Generator) {
       push(generator.buildPrefixIncrement(incrementOperator(token),
           offset: token.charOffset));
     } else {
@@ -2567,7 +2543,7 @@
   void handleUnaryPostfixAssignmentExpression(Token token) {
     debugEvent("UnaryPostfixAssignmentExpression");
     Object generator = pop();
-    if (generator is Generator<Expression, Statement, Arguments>) {
+    if (generator is Generator) {
       push(new DelayedPostfixIncrement(
           this, token, generator, incrementOperator(token), null));
     } else {
@@ -2630,9 +2606,9 @@
             prefix.exportScope, identifier.name, identifier.token,
             isQualified: true, prefix: prefix);
         identifier = null;
-      } else if (prefix is TypeUseGenerator<Expression, Statement, Arguments>) {
+      } else if (prefix is TypeUseGenerator) {
         type = prefix;
-      } else if (prefix is Generator<Expression, Statement, Arguments>) {
+      } else if (prefix is Generator) {
         String name = suffix == null
             ? "${prefix.plainNameForRead}.${identifier.name}"
             : "${prefix.plainNameForRead}.${identifier.name}.$suffix";
@@ -2675,7 +2651,7 @@
         target.function, arguments, charOffset, typeParameters);
     if (argMessage != null) {
       return throwNoSuchMethodError(
-          storeOffset(forest.literalNull(null), charOffset),
+          forest.literalNull(null)..fileOffset = charOffset,
           target.name.name,
           arguments,
           charOffset,
@@ -2690,10 +2666,10 @@
         return deprecated_buildCompileTimeError(
             "Not a const constructor.", charOffset);
       }
-      return toExpression(new ShadowConstructorInvocation(target,
-          targetTypeArguments, initialTarget, forest.castArguments(arguments),
+      return new ConstructorInvocationJudgment(target, targetTypeArguments,
+          initialTarget, forest.castArguments(arguments),
           isConst: isConst)
-        ..fileOffset = charOffset);
+        ..fileOffset = charOffset;
     } else {
       Procedure procedure = target;
       if (procedure.isFactory) {
@@ -2704,15 +2680,15 @@
           return deprecated_buildCompileTimeError(
               "Not a const factory.", charOffset);
         }
-        return toExpression(new ShadowFactoryConstructorInvocation(target,
+        return new FactoryConstructorInvocationJudgment(target,
             targetTypeArguments, initialTarget, forest.castArguments(arguments),
             isConst: isConst)
-          ..fileOffset = charOffset);
+          ..fileOffset = charOffset;
       } else {
-        return toExpression(new ShadowStaticInvocation(
+        return new StaticInvocationJudgment(
             target, forest.castArguments(arguments),
             isConst: isConst)
-          ..fileOffset = charOffset);
+          ..fileOffset = charOffset;
       }
     }
   }
@@ -2848,16 +2824,15 @@
     Object type = pop();
     PrefixBuilder deferredPrefix;
     int checkOffset;
-    if (type is DeferredAccessGenerator<Expression, Statement, Arguments>) {
-      DeferredAccessGenerator<Expression, Statement, Arguments> generator =
-          type;
+    if (type is DeferredAccessGenerator) {
+      DeferredAccessGenerator generator = type;
       type = generator.generator;
       deferredPrefix = generator.builder;
       checkOffset = generator.token.charOffset;
     }
 
-    if (type is TypeUseGenerator<Expression, Statement, Arguments>) {
-      TypeUseGenerator<Expression, Statement, Arguments> generator = type;
+    if (type is TypeUseGenerator) {
+      TypeUseGenerator generator = type;
       _typeInferrer.storeTypeUse(generator);
       if (generator.prefix != null) {
         nameToken = nameToken.next.next;
@@ -2872,11 +2847,10 @@
       push(deferredPrefix != null
           ? wrapInDeferredCheck(expression, deferredPrefix, checkOffset)
           : expression);
-    } else if (type
-        is ErroneousExpressionGenerator<Expression, Statement, Arguments>) {
+    } else if (type is ErroneousExpressionGenerator) {
       push(type.buildError(arguments));
     } else {
-      push(throwNoSuchMethodError(storeOffset(forest.literalNull(null), offset),
+      push(throwNoSuchMethodError(forest.literalNull(null)..fileOffset = offset,
           debugName(getNodeName(type), name), arguments, nameToken.charOffset));
     }
     constantContext = savedConstantContext;
@@ -2924,14 +2898,13 @@
       } else if (b.isConstructor) {
         initialTarget = b.target;
         if (type.isAbstract) {
-          return toExpression(new ShadowSyntheticExpression(toKernelExpression(
-              evaluateArgumentsBefore(
-                  arguments,
-                  buildAbstractClassInstantiationError(
-                      fasta.templateAbstractClassInstantiation
-                          .withArguments(type.name),
-                      type.name,
-                      nameToken.charOffset)))));
+          return new SyntheticExpressionJudgment(evaluateArgumentsBefore(
+              arguments,
+              buildAbstractClassInstantiationError(
+                  fasta.templateAbstractClassInstantiation
+                      .withArguments(type.name),
+                  type.name,
+                  nameToken.charOffset)));
         } else {
           target = initialTarget;
         }
@@ -2947,14 +2920,13 @@
               "Cyclic definition of factory '${name}'.", nameToken.charOffset);
         }
         if (target is Constructor && target.enclosingClass.isAbstract) {
-          return toExpression(new ShadowSyntheticExpression(toKernelExpression(
-              evaluateArgumentsBefore(
-                  arguments,
-                  buildAbstractClassInstantiationError(
-                      fasta.templateAbstractRedirectedClassInstantiation
-                          .withArguments(target.enclosingClass.name),
-                      target.enclosingClass.name,
-                      nameToken.charOffset)))));
+          return new SyntheticExpressionJudgment(evaluateArgumentsBefore(
+              arguments,
+              buildAbstractClassInstantiationError(
+                  fasta.templateAbstractRedirectedClassInstantiation
+                      .withArguments(target.enclosingClass.name),
+                  target.enclosingClass.name,
+                  nameToken.charOffset)));
         }
         RedirectingFactoryBody body = getRedirectingFactoryBody(target);
         if (body != null) {
@@ -2980,8 +2952,12 @@
       errorName = debugName(getNodeName(type), name);
     }
     errorName ??= name;
+    if (nameToken.lexeme == type.name && name.isNotEmpty) {
+      nameToken = nameToken.next.next;
+    }
+
     return throwNoSuchMethodError(
-        storeOffset(forest.literalNull(null), charOffset),
+        forest.literalNull(null)..fileOffset = charOffset,
         errorName,
         arguments,
         nameToken.charOffset);
@@ -3030,7 +3006,7 @@
     debugEvent("NamedArgument");
     Expression value = popForValue();
     Identifier identifier = pop();
-    push(new NamedExpressionJudgment(identifier.name, toKernelExpression(value))
+    push(new NamedExpressionJudgment(identifier.token, colon, value)
       ..fileOffset = offsetForToken(identifier.token));
   }
 
@@ -3046,7 +3022,7 @@
       deprecated_addCompileTimeError(offsetForToken(name.token),
           "'${variable.name}' already declared in this scope.");
     }
-    push(new ShadowFunctionDeclaration(
+    push(new FunctionDeclarationJudgment(
         variable,
         // The function node is created later.
         null)
@@ -3111,8 +3087,7 @@
     if (!isFunctionExpression) {
       annotations = pop(); // Metadata.
     }
-    FunctionNode function = formals.addToFunction(new FunctionNode(
-        toKernelStatement(body),
+    FunctionNode function = formals.addToFunction(new FunctionNodeJudgment(body,
         typeParameters: typeParameters,
         asyncMarker: asyncModifier,
         returnType: returnType)
@@ -3123,30 +3098,28 @@
       VariableDeclaration variable = declaration.variable;
       if (annotations != null) {
         for (Expression annotation in annotations) {
-          variable.addAnnotation(toKernelExpression(annotation));
+          variable.addAnnotation(annotation);
         }
       }
-      ShadowFunctionDeclaration.setHasImplicitReturnType(
+      FunctionDeclarationJudgment.setHasImplicitReturnType(
           declaration, hasImplicitReturnType);
 
       variable.type = function.functionType;
       if (isFunctionExpression) {
-        Expression oldInitializer = toExpression(variable.initializer);
-        variable.initializer = new ShadowFunctionExpression(function)
+        Expression oldInitializer = variable.initializer;
+        variable.initializer = new FunctionExpressionJudgment(function)
           ..parent = variable
           ..fileOffset = formals.charOffset;
         exitLocalScope();
-        Expression expression =
-            toExpression(new ShadowNamedFunctionExpression(variable));
+        Expression expression = new NamedFunctionExpressionJudgment(variable);
         if (oldInitializer != null) {
           // This must have been a compile-time error.
-          assert(isErroneousNode(toKernelExpression(oldInitializer)));
+          assert(isErroneousNode(oldInitializer));
 
-          push(new ShadowSyntheticExpression(new Let(
-              new VariableDeclaration.forValue(
-                  toKernelExpression(oldInitializer))
+          push(new SyntheticExpressionJudgment(new Let(
+              new VariableDeclaration.forValue(oldInitializer)
                 ..fileOffset = forest.readOffset(expression),
-              toKernelExpression(expression))
+              expression)
             ..fileOffset = forest.readOffset(expression)));
         } else {
           push(expression);
@@ -3158,16 +3131,14 @@
           // This must have been a compile-time error.
           assert(isErroneousNode(variable.initializer));
 
-          push(storeOffset(
-              forest.block(
-                  null,
-                  <Statement>[
-                    forest.expressionStatement(
-                        toExpression(variable.initializer), token),
-                    toStatement(declaration)
-                  ],
-                  null),
-              declaration.fileOffset));
+          push(forest.block(
+              null,
+              <Statement>[
+                forest.expressionStatement(variable.initializer, token),
+                declaration
+              ],
+              null)
+            ..fileOffset = declaration.fileOffset);
           variable.initializer = null;
         } else {
           push(declaration);
@@ -3200,17 +3171,15 @@
     FormalParameters<Expression, Statement, Arguments> formals = pop();
     exitFunction();
     List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
-    FunctionNode function = formals.addToFunction(new FunctionNode(
-        toKernelStatement(body),
-        typeParameters: typeParameters,
-        asyncMarker: asyncModifier)
+    FunctionNode function = formals.addToFunction(new FunctionNodeJudgment(body,
+        typeParameters: typeParameters, asyncMarker: asyncModifier)
       ..fileOffset = beginToken.charOffset
       ..fileEndOffset = token.charOffset);
     if (constantContext != ConstantContext.none) {
       push(deprecated_buildCompileTimeError(
           "Not a constant expression.", formals.charOffset));
     } else {
-      push(new ShadowFunctionExpression(function)
+      push(new FunctionExpressionJudgment(function)
         ..fileOffset = offsetForToken(beginToken));
     }
   }
@@ -3221,8 +3190,8 @@
     debugEvent("DoWhileStatement");
     Expression condition = popForValue();
     Statement body = popStatement();
-    JumpTarget<Statement> continueTarget = exitContinueTarget();
-    JumpTarget<Statement> breakTarget = exitBreakTarget();
+    JumpTarget continueTarget = exitContinueTarget();
+    JumpTarget breakTarget = exitBreakTarget();
     if (continueTarget.hasUsers) {
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
@@ -3257,16 +3226,16 @@
     Expression expression = popForValue();
     Object lvalue = pop();
     exitLocalScope();
-    JumpTarget<Statement> continueTarget = exitContinueTarget();
-    JumpTarget<Statement> breakTarget = exitBreakTarget();
-    kernel.Statement kernelBody = toKernelStatement(body);
+    JumpTarget continueTarget = exitContinueTarget();
+    JumpTarget breakTarget = exitBreakTarget();
+    Statement kernelBody = body;
     if (continueTarget.hasUsers) {
       kernelBody = new LabeledStatementJudgment(kernelBody);
-      continueTarget.resolveContinues(forest, toStatement(kernelBody));
+      continueTarget.resolveContinues(forest, kernelBody);
     }
     VariableDeclaration variable;
     bool declaresVariable = false;
-    ShadowSyntheticExpression syntheticAssignment;
+    SyntheticExpressionJudgment syntheticAssignment;
     if (lvalue is VariableDeclaration) {
       declaresVariable = true;
       variable = lvalue;
@@ -3274,7 +3243,7 @@
         deprecated_addCompileTimeError(
             variable.fileOffset, "A for-in loop-variable can't be 'const'.");
       }
-    } else if (lvalue is Generator<Expression, Statement, Arguments>) {
+    } else if (lvalue is Generator) {
       /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
       ///
       ///     for (lvalue in expression) body
@@ -3290,24 +3259,26 @@
       TypePromotionFact fact =
           typePromoter.getFactForAccess(variable, functionNestingLevel);
       TypePromotionScope scope = typePromoter.currentScope;
-      syntheticAssignment = toKernelExpression(lvalue.buildAssignment(
-          toExpression(new VariableGetJudgment(variable, fact, scope)
-            ..fileOffset = inKeyword.offset),
-          voidContext: true));
-      kernelBody = combineStatements(
-          new ShadowLoopAssignmentStatement(syntheticAssignment), kernelBody);
+      syntheticAssignment = lvalue.buildAssignment(
+          new VariableGetJudgment(variable, fact, scope)
+            ..fileOffset = inKeyword.offset,
+          voidContext: true);
     } else {
       Message message = forest.isVariablesDeclaration(lvalue)
           ? fasta.messageForInLoopExactlyOneVariable
           : fasta.messageForInLoopNotAssignable;
       Token token = forToken.next.next;
-      variable = new VariableDeclaration.forValue(toKernelExpression(
-          buildCompileTimeError(
-              message, offsetForToken(token), lengthForToken(token))));
+      variable = new VariableDeclaration.forValue(buildCompileTimeError(
+          message, offsetForToken(token), lengthForToken(token)));
     }
-    kernel.Statement result = new ShadowForInStatement(
+    Statement result = new ForInJudgment(
+        awaitToken,
+        forToken,
+        leftParenthesis,
         variable,
-        toKernelExpression(expression),
+        inKeyword,
+        expression,
+        leftParenthesis.endGroup,
         kernelBody,
         declaresVariable,
         syntheticAssignment,
@@ -3316,9 +3287,9 @@
       ..bodyOffset = kernelBody.fileOffset;
     if (breakTarget.hasUsers) {
       result = new LabeledStatementJudgment(result);
-      breakTarget.resolveBreaks(forest, toStatement(result));
+      breakTarget.resolveBreaks(forest, result);
     }
-    exitLoopOrSwitch(toStatement(result));
+    exitLoopOrSwitch(result);
   }
 
   @override
@@ -3335,8 +3306,8 @@
         new List<Object>.filled(labelCount, null, growable: true);
     popList(labelCount, labels);
     enterLocalScope(null, scope.createNestedLabelScope());
-    LabelTarget<Statement> target = new LabelTarget<Statement>(
-        labels, member, functionNestingLevel, token.charOffset);
+    LabelTarget target =
+        new LabelTarget(labels, member, functionNestingLevel, token.charOffset);
     for (Object label in labels) {
       scope.declareLabel(forest.getLabelName(label), target);
     }
@@ -3347,7 +3318,7 @@
   void endLabeledStatement(int labelCount) {
     debugEvent("LabeledStatement");
     Statement statement = popStatement();
-    LabelTarget<Statement> target = pop();
+    LabelTarget target = pop();
     exitLocalScope();
     if (target.breakTarget.hasUsers) {
       if (statement is! LabeledStatement) {
@@ -3388,8 +3359,8 @@
     debugEvent("WhileStatement");
     Statement body = popStatement();
     Expression condition = popForValue();
-    JumpTarget<Statement> continueTarget = exitContinueTarget();
-    JumpTarget<Statement> breakTarget = exitBreakTarget();
+    JumpTarget continueTarget = exitContinueTarget();
+    JumpTarget breakTarget = exitBreakTarget();
     if (continueTarget.hasUsers) {
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
@@ -3517,8 +3488,8 @@
     for (Expression expression in expressions) {
       expressionOffsets.add(forest.readOffset(expression));
     }
-    push(new SwitchCaseJudgment(toKernelExpressionList(expressions),
-        expressionOffsets, toKernelStatement(block),
+    push(new SwitchCaseJudgment(defaultKeyword, expressions, expressionOffsets,
+        colonAfterDefault, block,
         isDefault: defaultKeyword != null)
       ..fileOffset = firstToken.charOffset);
     push(labels);
@@ -3529,18 +3500,20 @@
     debugEvent("SwitchStatement");
 
     List<SwitchCase> cases = pop();
-    JumpTarget<Statement> target = exitBreakTarget();
+    JumpTarget target = exitBreakTarget();
     exitSwitchScope();
     exitLocalScope();
     Expression expression = popForValue();
-    kernel.Statement result =
-        new SwitchStatementJudgment(toKernelExpression(expression), cases)
-          ..fileOffset = switchKeyword.charOffset;
+    // TODO(brianwilkerson): Plumb through the left and right parentheses and
+    // the left and right curly braces.
+    Statement result = new SwitchStatementJudgment(
+        switchKeyword, null, expression, null, null, cases, null)
+      ..fileOffset = switchKeyword.charOffset;
     if (target.hasUsers) {
       result = new LabeledStatementJudgment(result);
-      target.resolveBreaks(forest, toStatement(result));
+      target.resolveBreaks(forest, result);
     }
-    exitLoopOrSwitch(toStatement(result));
+    exitLoopOrSwitch(result);
   }
 
   @override
@@ -3552,8 +3525,7 @@
       List<Object> labels = pop();
       SwitchCase current = cases[i] = pop();
       for (Object label in labels) {
-        JumpTarget<Statement> target =
-            switchScope.lookupLabel(forest.getLabelName(label));
+        JumpTarget target = switchScope.lookupLabel(forest.getLabelName(label));
         if (target != null) {
           target.resolveGotos(forest, current);
         }
@@ -3580,8 +3552,8 @@
           lastNode is! Rethrow &&
           lastNode is! ReturnStatement &&
           lastNode is! Throw) {
-        block.addStatement(new ExpressionStatement(
-            toKernelExpression(buildFallThroughError(current.fileOffset))));
+        block.addStatement(
+            new ExpressionStatement(buildFallThroughError(current.fileOffset)));
       }
     }
 
@@ -3598,7 +3570,7 @@
   void handleBreakStatement(
       bool hasTarget, Token breakKeyword, Token endToken) {
     debugEvent("BreakStatement");
-    JumpTarget<Statement> target = breakTarget;
+    JumpTarget target = breakTarget;
     Identifier identifier;
     String name;
     if (hasTarget) {
@@ -3611,7 +3583,7 @@
           deprecated_buildCompileTimeErrorStatement(
               "No target of break.", breakKeyword.charOffset));
     } else if (target == null ||
-        target is! JumpTarget<Statement> ||
+        target is! JumpTarget ||
         !target.isBreakTarget) {
       push(compileTimeErrorInLoopOrSwitch =
           deprecated_buildCompileTimeErrorStatement(
@@ -3633,14 +3605,14 @@
   void handleContinueStatement(
       bool hasTarget, Token continueKeyword, Token endToken) {
     debugEvent("ContinueStatement");
-    JumpTarget<Statement> target = continueTarget;
+    JumpTarget target = continueTarget;
     Identifier identifier;
     String name;
     if (hasTarget) {
       identifier = pop();
       name = identifier.name;
       Declaration namedTarget = scope.lookupLabel(identifier.name);
-      if (namedTarget != null && namedTarget is! JumpTarget<Statement>) {
+      if (namedTarget != null && namedTarget is! JumpTarget) {
         push(compileTimeErrorInLoopOrSwitch =
             deprecated_buildCompileTimeErrorStatement(
                 "Target of continue must be a label.",
@@ -3659,9 +3631,10 @@
       }
       if (target.isGotoTarget &&
           target.functionNestingLevel == functionNestingLevel) {
-        ContinueSwitchStatement statement = new ContinueSwitchJudgment(null)
-          ..fileOffset = continueKeyword.charOffset;
-        target.addGoto(toStatement(statement));
+        ContinueSwitchStatement statement =
+            new ContinueSwitchJudgment(continueKeyword, null, endToken)
+              ..fileOffset = continueKeyword.charOffset;
+        target.addGoto(statement);
         push(statement);
         return;
       }
@@ -3690,6 +3663,11 @@
   @override
   void beginTypeVariables(Token token) {
     debugEvent("beginTypeVariables");
+
+    // TODO(danrubel): Now that the type variable events have been reordered,
+    // we should be able to cleanup body builder type variable declaration
+    // handling and remove this hack.
+
     OutlineBuilder listener = new OutlineBuilder(library);
     // TODO(dmitryas):  [ClassMemberParser] shouldn't be used to parse and build
     // the type variables for the local function.  It also causes the unresolved
@@ -3713,26 +3691,14 @@
   }
 
   @override
-  void beginTypeVariable(Token name) {
+  void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
-  }
-
-  @override
-  void handleNoTypeVariables(Token token) {
-    debugEvent("NoTypeVariables");
-    enterFunctionTypeScope(null);
-    push(NullValue.TypeVariables);
-  }
-
-  @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
-    debugEvent("TypeVariable");
-    DartType bound = pop();
     Identifier name = pop();
     List<Expression> annotations = pop();
+
     KernelTypeVariableBuilder variable;
     Object inScope = scopeLookup(scope, name.name, token);
-    if (inScope is TypeUseGenerator<Expression, Statement, Arguments>) {
+    if (inScope is TypeUseGenerator) {
       _typeInferrer.storeTypeUse(inScope);
       variable = inScope.declaration;
     } else {
@@ -3741,51 +3707,76 @@
       variable = new KernelTypeVariableBuilder(
           name.name, library, offsetForToken(name.token), null);
     }
-    variable.parameter.bound = bound;
     if (annotations != null) {
-      _typeInferrer.inferMetadata(
-          this, factory, toKernelExpressionList(annotations));
+      _typeInferrer.inferMetadata(this, factory, annotations);
       for (Expression annotation in annotations) {
-        variable.parameter.addAnnotation(toKernelExpression(annotation));
+        variable.parameter.addAnnotation(annotation);
       }
     }
     push(variable);
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
+  void handleTypeVariablesDefined(Token token, int count) {
+    debugEvent("handleTypeVariablesDefined");
+    assert(count > 0);
+    List<KernelTypeVariableBuilder> typeVariables =
+        popList(count, new List<KernelTypeVariableBuilder>(count));
+
+    // TODO(danrubel): Call enterFunctionScope here
+    // once the hack in beginTypeVariables has been removed.
+    //enterFunctionTypeScope(typeVariables);
+    push(typeVariables);
+  }
+
+  @override
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    debugEvent("TypeVariable");
+    DartType bound = pop();
+    // Peek to leave type parameters on top of stack.
+    List<KernelTypeVariableBuilder> typeVariables = peek();
+
+    KernelTypeVariableBuilder variable = typeVariables[index];
+    variable.parameter.bound = bound;
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
     debugEvent("TypeVariables");
-    List<KernelTypeVariableBuilder> typeVariables = popList(
-        count,
-        new List<KernelTypeVariableBuilder>.filled(count, null,
-            growable: true));
-    if (typeVariables != null) {
-      if (library.loader.target.strongMode) {
-        List<KernelTypeBuilder> calculatedBounds = calculateBounds(
-            typeVariables,
-            library.loader.target.dynamicType,
-            library.loader.target.bottomType,
-            library.loader.target.objectClassBuilder);
-        for (int i = 0; i < typeVariables.length; ++i) {
-          typeVariables[i].defaultType = calculatedBounds[i];
-          typeVariables[i].defaultType.resolveIn(scope,
-              typeVariables[i].charOffset, typeVariables[i].fileUri, library);
-          typeVariables[i].finish(
-              library,
-              library.loader.target.objectClassBuilder,
-              library.loader.target.dynamicType);
-        }
-      } else {
-        for (int i = 0; i < typeVariables.length; ++i) {
-          typeVariables[i].defaultType = library.loader.target.dynamicType;
-          typeVariables[i].finish(
-              library,
-              library.loader.target.objectClassBuilder,
-              library.loader.target.dynamicType);
-        }
+    // Peek to leave type parameters on top of stack.
+    List<KernelTypeVariableBuilder> typeVariables = peek();
+
+    if (library.loader.target.strongMode) {
+      List<KernelTypeBuilder> calculatedBounds = calculateBounds(
+          typeVariables,
+          library.loader.target.dynamicType,
+          library.loader.target.bottomType,
+          library.loader.target.objectClassBuilder);
+      for (int i = 0; i < typeVariables.length; ++i) {
+        typeVariables[i].defaultType = calculatedBounds[i];
+        typeVariables[i].defaultType.resolveIn(scope,
+            typeVariables[i].charOffset, typeVariables[i].fileUri, library);
+        typeVariables[i].finish(
+            library,
+            library.loader.target.objectClassBuilder,
+            library.loader.target.dynamicType);
+      }
+    } else {
+      for (int i = 0; i < typeVariables.length; ++i) {
+        typeVariables[i].defaultType = library.loader.target.dynamicType;
+        typeVariables[i].finish(
+            library,
+            library.loader.target.objectClassBuilder,
+            library.loader.target.dynamicType);
       }
     }
-    push(typeVariables ?? NullValue.TypeVariables);
+  }
+
+  @override
+  void handleNoTypeVariables(Token token) {
+    debugEvent("NoTypeVariables");
+    enterFunctionTypeScope(null);
+    push(NullValue.TypeVariables);
   }
 
   List<TypeParameter> typeVariableBuildersToKernel(
@@ -3827,7 +3818,7 @@
 
   @override
   void handleInvalidStatement(Token token, Message message) {
-    kernel.Statement statement = pop();
+    Statement statement = pop();
     push(wrapInCompileTimeErrorStatement(statement, message));
   }
 
@@ -3843,9 +3834,9 @@
       {List<LocatedMessage> context}) {
     library.addCompileTimeError(message, charOffset, length, uri,
         wasHandled: true, context: context);
-    return toExpression(new ShadowSyntheticExpression(library.loader
+    return new SyntheticExpressionJudgment(library.loader
         .throwCompileConstantError(library.loader
-            .buildCompileTimeError(message, charOffset, length, uri))));
+            .buildCompileTimeError(message, charOffset, length, uri)));
   }
 
   Expression wrapInCompileTimeError(Expression expression, Message message,
@@ -3860,19 +3851,18 @@
       {List<LocatedMessage> context}) {
     // TODO(askesc): Produce explicit error expression wrapping the original.
     // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
-    return toExpression(new ShadowSyntheticExpression(new Let(
-        new VariableDeclaration.forValue(toKernelExpression(
-            buildCompileTimeError(
-                message.messageObject, message.charOffset, message.length,
-                context: context)))
+    return new SyntheticExpressionJudgment(new Let(
+        new VariableDeclaration.forValue(buildCompileTimeError(
+            message.messageObject, message.charOffset, message.length,
+            context: context))
           ..fileOffset = forest.readOffset(expression),
         new Let(
-            new VariableDeclaration.forValue(toKernelExpression(expression))
+            new VariableDeclaration.forValue(expression)
               ..fileOffset = forest.readOffset(expression),
-            toKernelExpression(storeOffset(
-                forest.literalNull(null), forest.readOffset(expression))))
+            forest.literalNull(null)
+              ..fileOffset = forest.readOffset(expression))
           ..fileOffset = forest.readOffset(expression))
-      ..fileOffset = forest.readOffset(expression)));
+      ..fileOffset = forest.readOffset(expression));
   }
 
   Expression buildFallThroughError(int charOffset) {
@@ -3884,14 +3874,14 @@
     // TODO(ahe): Compute a LocatedMessage above instead?
     Location location = messages.getLocationFromUri(uri, charOffset);
 
-    return toExpression(new Throw(toKernelExpression(buildStaticInvocation(
+    return new Throw(buildStaticInvocation(
         library.loader.coreTypes.fallThroughErrorUrlAndLineConstructor,
         forest.arguments(<Expression>[
-          storeOffset(forest.literalString("${location?.file ?? uri}", null),
-              charOffset),
-          storeOffset(forest.literalInt(location?.line ?? 0, null), charOffset),
+          forest.literalString("${location?.file ?? uri}", null)
+            ..fileOffset = charOffset,
+          forest.literalInt(location?.line ?? 0, null)..fileOffset = charOffset,
         ], noLocation),
-        charOffset: charOffset))));
+        charOffset: charOffset));
   }
 
   Expression buildAbstractClassInstantiationError(
@@ -3901,29 +3891,28 @@
     // TODO(ahe): The following doesn't make sense to Analyzer AST.
     Declaration constructor =
         library.loader.getAbstractClassInstantiationError();
-    return toExpression(new Throw(toKernelExpression(buildStaticInvocation(
+    return new Throw(buildStaticInvocation(
         constructor.target,
         forest.arguments(<Expression>[
-          storeOffset(forest.literalString(className, null), charOffset)
-        ], noLocation)))));
+          forest.literalString(className, null)..fileOffset = charOffset
+        ], noLocation)));
   }
 
-  kernel.Statement deprecated_buildCompileTimeErrorStatement(error,
+  Statement deprecated_buildCompileTimeErrorStatement(error,
       [int charOffset = -1]) {
-    return new ExpressionStatementJudgment(toKernelExpression(
-        deprecated_buildCompileTimeError(error, charOffset)));
+    return new ExpressionStatementJudgment(
+        deprecated_buildCompileTimeError(error, charOffset), null);
   }
 
-  kernel.Statement buildCompileTimeErrorStatement(
-      Message message, int charOffset,
+  Statement buildCompileTimeErrorStatement(Message message, int charOffset,
       {List<LocatedMessage> context}) {
-    return new ExpressionStatementJudgment(toKernelExpression(
-        buildCompileTimeError(message, charOffset, noLength,
-            context: context)));
+    return new ExpressionStatementJudgment(
+        buildCompileTimeError(message, charOffset, noLength, context: context),
+        null);
   }
 
-  kernel.Statement wrapInCompileTimeErrorStatement(
-      kernel.Statement statement, Message message) {
+  Statement wrapInCompileTimeErrorStatement(
+      Statement statement, Message message) {
     // TODO(askesc): Produce explicit error statement wrapping the original.
     // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
     return buildCompileTimeErrorStatement(message, statement.fileOffset);
@@ -3934,7 +3923,7 @@
       [int charOffset = -1]) {
     needsImplicitSuperInitializer = false;
     return new ShadowInvalidInitializer(
-        new VariableDeclaration.forValue(toKernelExpression(expression)))
+        new VariableDeclaration.forValue(expression))
       ..fileOffset = charOffset;
   }
 
@@ -3987,12 +3976,12 @@
         Declaration constructor =
             library.loader.getDuplicatedFieldInitializerError();
         return buildInvalidInitializer(
-            toExpression(new Throw(toKernelExpression(buildStaticInvocation(
+            new Throw(buildStaticInvocation(
                 constructor.target,
                 forest.arguments(<Expression>[
-                  storeOffset(forest.literalString(name, null), offset)
+                  forest.literalString(name, null)..fileOffset = offset
                 ], noLocation),
-                charOffset: offset)))),
+                charOffset: offset)),
             offset);
       } else {
         if (library.loader.target.strongMode &&
@@ -4010,8 +3999,7 @@
                     .withLocation(builder.fileUri, builder.charOffset, noLength)
               ]);
         }
-        return new ShadowFieldInitializer(
-            builder.field, toKernelExpression(expression))
+        return new ShadowFieldInitializer(builder.field, expression)
           ..fileOffset = offset
           ..isSynthetic = isSynthetic;
       }
@@ -4034,8 +4022,10 @@
           charOffset);
     }
     needsImplicitSuperInitializer = false;
-    return new ShadowSuperInitializer(
-        constructor, forest.castArguments(arguments))
+    // TODO(brianwilkerson): Plumb through the `super`, period, and constructor
+    // name tokens.
+    return new SuperInitializerJudgment(
+        null, null, null, constructor, forest.castArguments(arguments))
       ..fileOffset = charOffset
       ..isSynthetic = isSynthetic;
   }
@@ -4045,7 +4035,7 @@
       Constructor constructor, Arguments arguments,
       [int charOffset = -1]) {
     needsImplicitSuperInitializer = false;
-    return new ShadowRedirectingInitializer(
+    return new RedirectingInitializerJudgment(
         constructor, forest.castArguments(arguments))
       ..fileOffset = charOffset;
   }
@@ -4089,8 +4079,8 @@
       push(forest.block(
           token,
           <Statement>[
-            toStatement(deprecated_buildCompileTimeErrorStatement(
-                "Expected '{'.", token.charOffset))
+            deprecated_buildCompileTimeErrorStatement(
+                "Expected '{'.", token.charOffset)
           ],
           null));
     }
@@ -4123,13 +4113,12 @@
     List<Expression> expressions =
         new List<Expression>.from(forest.argumentsPositional(arguments));
     for (NamedExpression named in forest.argumentsNamed(arguments)) {
-      expressions.add(toExpression(named.value));
+      expressions.add(named.value);
     }
     for (Expression argument in expressions.reversed) {
-      expression = toExpression(new Let(
-          new VariableDeclaration.forValue(toKernelExpression(argument),
-              isFinal: true),
-          toKernelExpression(expression)));
+      expression = new Let(
+          new VariableDeclaration.forValue(argument, isFinal: true),
+          expression);
     }
     return expression;
   }
@@ -4165,43 +4154,38 @@
               offset,
               name.name.length);
         }
-        return toExpression(new ShadowSuperMethodInvocation(
+        return new SuperMethodInvocationJudgment(
             name, forest.castArguments(arguments), target)
-          ..fileOffset = offset);
+          ..fileOffset = offset;
       }
 
-      receiver = toExpression(
-          new SuperPropertyGetJudgment(name, target)..fileOffset = offset);
-      return toExpression(new ShadowMethodInvocation(
-          toKernelExpression(receiver),
-          callName,
-          forest.castArguments(arguments),
+      receiver = new SuperPropertyGetJudgment(name, target)
+        ..fileOffset = offset;
+      return new MethodInvocationJudgment(
+          receiver, callName, forest.castArguments(arguments),
           isImplicitCall: true)
-        ..fileOffset = forest.readOffset(arguments));
+        ..fileOffset = forest.readOffset(arguments);
     }
 
     if (isNullAware) {
-      VariableDeclaration variable =
-          new VariableDeclaration.forValue(toKernelExpression(receiver));
-      return toExpression(new ShadowNullAwareMethodInvocation(
+      VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
+      return new NullAwareMethodInvocationJudgment(
           variable,
-          toKernelExpression(storeOffset(
-              forest.conditionalExpression(
-                  toExpression(
-                      buildIsNull(new VariableGet(variable), offset, this)),
-                  null,
-                  storeOffset(forest.literalNull(null), offset),
-                  null,
-                  toExpression(new MethodInvocation(new VariableGet(variable),
-                      name, forest.castArguments(arguments), interfaceTarget)
-                    ..fileOffset = offset)),
-              offset)))
-        ..fileOffset = offset);
+          forest.conditionalExpression(
+              buildIsNull(new VariableGet(variable), offset, this),
+              null,
+              forest.literalNull(null)..fileOffset = offset,
+              null,
+              new MethodInvocation(new VariableGet(variable), name,
+                  forest.castArguments(arguments), interfaceTarget)
+                ..fileOffset = offset)
+            ..fileOffset = offset)
+        ..fileOffset = offset;
     } else {
-      return toExpression(new ShadowMethodInvocation(
-          toKernelExpression(receiver), name, forest.castArguments(arguments),
+      return new MethodInvocationJudgment(
+          receiver, name, forest.castArguments(arguments),
           isImplicitCall: isImplicitCall, interfaceTarget: interfaceTarget)
-        ..fileOffset = offset);
+        ..fileOffset = offset;
     }
   }
 
@@ -4246,42 +4230,9 @@
   Expression wrapInDeferredCheck(
       Expression expression, KernelPrefixBuilder prefix, int charOffset) {
     Object check = new VariableDeclaration.forValue(
-        toKernelExpression(forest.checkLibraryIsLoaded(prefix.dependency)))
+        forest.checkLibraryIsLoaded(prefix.dependency))
       ..fileOffset = charOffset;
-    return toExpression(
-        new ShadowDeferredCheck(check, toKernelExpression(expression)));
-  }
-
-  // TODO(ahe): Remove this method once Forest API is complete.
-  @override
-  T storeOffset<T>(T object, int offset) {
-    TreeNode node = unchecked(object);
-    node.fileOffset = offset;
-    return object;
-  }
-
-  // TODO(ahe): Remove this method once Forest API is complete.
-  kernel.Expression toKernelExpression(Expression expression) {
-    return unchecked(expression);
-  }
-
-  // TODO(ahe): Remove this method once Forest API is complete.
-  Expression toExpression(kernel.Expression expression) {
-    return unchecked(expression);
-  }
-
-  List<kernel.Expression> toKernelExpressionList(List<Expression> expressions) {
-    return unchecked(expressions);
-  }
-
-  // TODO(ahe): Remove this method once Forest API is complete.
-  kernel.Statement toKernelStatement(Statement statement) {
-    return unchecked(statement);
-  }
-
-  // TODO(ahe): Remove this method once Forest API is complete.
-  Statement toStatement(kernel.Statement statement) {
-    return unchecked(statement);
+    return new DeferredCheckJudgment(check, expression);
   }
 
   /// TODO(ahe): This method is temporarily implemented by subclasses. Once type
@@ -4292,6 +4243,26 @@
     return library.loader.handledErrors.isNotEmpty &&
         forest.isErroneousNode(node);
   }
+
+  void checkWebIntLiteralsErrorIfUnexact(int value, Token token) {
+    BigInt asInt = new BigInt.from(value).toUnsigned(64);
+    BigInt asDouble = new BigInt.from(asInt.toDouble());
+    if (asInt != asDouble) {
+      String nearest;
+      if (token.lexeme.startsWith("0x") || token.lexeme.startsWith("0X")) {
+        nearest = '0x${asDouble.toRadixString(16)}';
+      } else {
+        nearest = '$asDouble';
+      }
+      library.addCompileTimeError(
+          fasta.templateWebLiteralCannotBeRepresentedExactly
+              .withArguments(token.lexeme, nearest),
+          token.charOffset,
+          token.charCount,
+          uri,
+          wasHandled: true);
+    }
+  }
 }
 
 class Identifier {
@@ -4300,7 +4271,7 @@
 
   Identifier(this.token);
 
-  kernel.Expression get initializer => null;
+  Expression get initializer => null;
 
   String toString() => "identifier($name)";
 }
@@ -4317,14 +4288,14 @@
 }
 
 class InitializedIdentifier extends Identifier {
-  final kernel.Expression initializer;
+  final Expression initializer;
 
   InitializedIdentifier(Token token, this.initializer) : super(token);
 
   String toString() => "initialized-identifier($name, $initializer)";
 }
 
-class JumpTarget<Statement> extends Declaration {
+class JumpTarget extends Declaration {
   final List<Statement> users = <Statement>[];
 
   final JumpTargetKind kind;
@@ -4366,8 +4337,7 @@
     users.add(statement);
   }
 
-  void resolveBreaks(
-      Forest<Object, Statement, Object, Object> forest, Statement target) {
+  void resolveBreaks(Forest forest, Statement target) {
     assert(isBreakTarget);
     for (Statement user in users) {
       forest.resolveBreak(target, user);
@@ -4375,8 +4345,7 @@
     users.clear();
   }
 
-  void resolveContinues(
-      Forest<Object, Statement, Object, Object> forest, Statement target) {
+  void resolveContinues(Forest forest, Statement target) {
     assert(isContinueTarget);
     for (Statement user in users) {
       forest.resolveContinue(target, user);
@@ -4384,8 +4353,7 @@
     users.clear();
   }
 
-  void resolveGotos(
-      Forest<Object, Statement, Object, Object> forest, Object target) {
+  void resolveGotos(Forest forest, Object target) {
     assert(isGotoTarget);
     for (Statement user in users) {
       forest.resolveContinueInSwitch(target, user);
@@ -4397,16 +4365,15 @@
   String get fullNameForErrors => "<jump-target>";
 }
 
-class LabelTarget<Statement> extends Declaration
-    implements JumpTarget<Statement> {
+class LabelTarget extends Declaration implements JumpTarget {
   final List<Object> labels;
 
   @override
   final MemberBuilder parent;
 
-  final JumpTarget<Statement> breakTarget;
+  final JumpTarget breakTarget;
 
-  final JumpTarget<Statement> continueTarget;
+  final JumpTarget continueTarget;
 
   final int functionNestingLevel;
 
@@ -4415,9 +4382,9 @@
 
   LabelTarget(
       this.labels, this.parent, this.functionNestingLevel, this.charOffset)
-      : breakTarget = new JumpTarget<Statement>(
+      : breakTarget = new JumpTarget(
             JumpTargetKind.Break, functionNestingLevel, parent, charOffset),
-        continueTarget = new JumpTarget<Statement>(
+        continueTarget = new JumpTarget(
             JumpTargetKind.Continue, functionNestingLevel, parent, charOffset);
 
   @override
@@ -4447,18 +4414,15 @@
     unsupported("addGoto", charOffset, fileUri);
   }
 
-  void resolveBreaks(
-      Forest<Object, Statement, Object, Object> forest, Statement target) {
+  void resolveBreaks(Forest forest, Statement target) {
     breakTarget.resolveBreaks(forest, target);
   }
 
-  void resolveContinues(
-      Forest<Object, Statement, Object, Object> forest, Statement target) {
+  void resolveContinues(Forest forest, Statement target) {
     continueTarget.resolveContinues(forest, target);
   }
 
-  void resolveGotos(
-      Forest<Object, Statement, Object, Object> forest, Object target) {
+  void resolveGotos(Forest forest, Object target) {
     unsupported("resolveGotos", charOffset, fileUri);
   }
 
@@ -4525,8 +4489,8 @@
         typeParameters: typeParameters);
   }
 
-  Scope computeFormalParameterScope(Scope parent, Declaration declaration,
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper) {
+  Scope computeFormalParameterScope(
+      Scope parent, Declaration declaration, ExpressionGeneratorHelper helper) {
     if (required.length == 0 && optional == null) return parent;
     Map<String, Declaration> local = <String, Declaration>{};
 
@@ -4560,13 +4524,13 @@
 ///     }
 ///
 /// If [body] is a [Block], it's returned with [statement] prepended to it.
-Block combineStatements(kernel.Statement statement, kernel.Statement body) {
+Block combineStatements(Statement statement, Statement body) {
   if (body is Block) {
     body.statements.insert(0, statement);
     statement.parent = body;
     return body;
   } else {
-    return new Block(<kernel.Statement>[statement, body]);
+    return new Block(<Statement>[statement, body]);
   }
 }
 
@@ -4582,7 +4546,7 @@
     return node.fullNameForErrors;
   } else if (node is ThisAccessGenerator) {
     return node.isSuper ? "super" : "this";
-  } else if (node is Generator<Object, Object, Object>) {
+  } else if (node is Generator) {
     return node.plainNameForRead;
   } else {
     return unhandled("${node.runtimeType}", "getNodeName", -1, null);
@@ -4609,6 +4573,3 @@
         asyncToken.charOffset, null);
   }
 }
-
-// TODO(ahe): Remove this method when all AST nodes have moved to [Forest].
-dynamic unchecked(Object o) => o;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 24aedf5..e24dd18 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -53,8 +53,10 @@
 
 import 'kernel_ast_api.dart'
     show
+        Arguments,
         DartType,
         DynamicType,
+        Expression,
         Initializer,
         InvalidType,
         Member,
@@ -86,7 +88,7 @@
         ThisAccessGenerator,
         buildIsNull;
 
-abstract class ExpressionGenerator<Expression, Statement, Arguments> {
+abstract class ExpressionGenerator {
   /// Builds a [Expression] representing a read from the generator.
   Expression buildSimpleRead();
 
@@ -159,15 +161,14 @@
 /// generate an invocation of `operator[]` or `operator[]=`, so we create a
 /// [Generator] object.  Later, after `= b` is parsed, [buildAssignment] will
 /// be called.
-abstract class Generator<Expression, Statement, Arguments>
-    implements ExpressionGenerator<Expression, Statement, Arguments> {
-  final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
+abstract class Generator implements ExpressionGenerator {
+  final ExpressionGeneratorHelper helper;
 
   final Token token;
 
   Generator(this.helper, this.token);
 
-  Forest<Expression, Statement, Token, Arguments> get forest => helper.forest;
+  Forest get forest => helper.forest;
 
   String get plainNameForRead;
 
@@ -179,11 +180,6 @@
 
   bool get isInitializer => false;
 
-  // TODO(ahe): Remove this method.
-  T storeOffset<T>(T node, int offset) {
-    return helper.storeOffset(node, offset);
-  }
-
   Expression buildForEffect() => buildSimpleRead();
 
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
@@ -212,14 +208,8 @@
         helper.deprecated_addCompileTimeError(
             offsetForToken(token), "Not a constant expression.");
       }
-      return PropertyAccessGenerator.make<Expression, Statement, Arguments>(
-          helper,
-          send.token,
-          buildSimpleRead(),
-          send.name,
-          null,
-          null,
-          isNullAware);
+      return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
+          send.name, null, null, isNullAware);
     }
   }
 
@@ -264,11 +254,8 @@
   }
 }
 
-abstract class VariableUseGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory VariableUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
+abstract class VariableUseGenerator implements Generator {
+  factory VariableUseGenerator(ExpressionGeneratorHelper helper, Token token,
       VariableDeclaration variable,
       [DartType promotedType]) {
     return helper.forest
@@ -279,10 +266,9 @@
   String get debugName => "VariableUseGenerator";
 }
 
-abstract class PropertyAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
+abstract class PropertyAccessGenerator implements Generator {
   factory PropertyAccessGenerator.internal(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression receiver,
       Name name,
@@ -292,23 +278,21 @@
         .propertyAccessGenerator(helper, token, receiver, name, getter, setter);
   }
 
-  static Generator<Expression, Statement, Arguments>
-      make<Expression, Statement, Arguments>(
-          ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-          Token token,
-          Expression receiver,
-          Name name,
-          Member getter,
-          Member setter,
-          bool isNullAware) {
+  static Generator make(
+      ExpressionGeneratorHelper helper,
+      Token token,
+      Expression receiver,
+      Name name,
+      Member getter,
+      Member setter,
+      bool isNullAware) {
     if (helper.forest.isThisExpression(receiver)) {
       return unsupported("ThisExpression", offsetForToken(token), helper.uri);
     } else {
       return isNullAware
-          ? new NullAwarePropertyAccessGenerator<Expression, Statement,
-              Arguments>(helper, token, receiver, name, getter, setter, null)
-          : new PropertyAccessGenerator<Expression, Statement,
-                  Arguments>.internal(
+          ? new NullAwarePropertyAccessGenerator(
+              helper, token, receiver, name, getter, setter, null)
+          : new PropertyAccessGenerator.internal(
               helper, token, receiver, name, getter, setter);
     }
   }
@@ -322,14 +306,9 @@
 
 /// Special case of [PropertyAccessGenerator] to avoid creating an indirect
 /// access to 'this'.
-abstract class ThisPropertyAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory ThisPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Name name,
-      Member getter,
-      Member setter) {
+abstract class ThisPropertyAccessGenerator implements Generator {
+  factory ThisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, Name name, Member getter, Member setter) {
     return helper.forest
         .thisPropertyAccessGenerator(helper, token, name, getter, setter);
   }
@@ -341,10 +320,9 @@
   bool get isThisPropertyAccess => true;
 }
 
-abstract class NullAwarePropertyAccessGenerator<Expression, Statement,
-    Arguments> implements Generator<Expression, Statement, Arguments> {
+abstract class NullAwarePropertyAccessGenerator implements Generator {
   factory NullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression receiverExpression,
       Name name,
@@ -359,14 +337,9 @@
   String get debugName => "NullAwarePropertyAccessGenerator";
 }
 
-abstract class SuperPropertyAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory SuperPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Name name,
-      Member getter,
-      Member setter) {
+abstract class SuperPropertyAccessGenerator implements Generator {
+  factory SuperPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, Name name, Member getter, Member setter) {
     return helper.forest
         .superPropertyAccessGenerator(helper, token, name, getter, setter);
   }
@@ -375,10 +348,9 @@
   String get debugName => "SuperPropertyAccessGenerator";
 }
 
-abstract class IndexedAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
+abstract class IndexedAccessGenerator implements Generator {
   factory IndexedAccessGenerator.internal(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression receiver,
       Expression index,
@@ -388,20 +360,19 @@
         .indexedAccessGenerator(helper, token, receiver, index, getter, setter);
   }
 
-  static Generator<Expression, Statement, Arguments>
-      make<Expression, Statement, Arguments>(
-          ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-          Token token,
-          Expression receiver,
-          Expression index,
-          Procedure getter,
-          Procedure setter) {
+  static Generator make(
+      ExpressionGeneratorHelper helper,
+      Token token,
+      Expression receiver,
+      Expression index,
+      Procedure getter,
+      Procedure setter) {
     if (helper.forest.isThisExpression(receiver)) {
-      return new ThisIndexedAccessGenerator<Expression, Statement, Arguments>(
+      return new ThisIndexedAccessGenerator(
           helper, token, index, getter, setter);
     } else {
-      return new IndexedAccessGenerator<Expression, Statement,
-          Arguments>.internal(helper, token, receiver, index, getter, setter);
+      return new IndexedAccessGenerator.internal(
+          helper, token, receiver, index, getter, setter);
     }
   }
 
@@ -417,14 +388,9 @@
 
 /// Special case of [IndexedAccessGenerator] to avoid creating an indirect
 /// access to 'this'.
-abstract class ThisIndexedAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory ThisIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression index,
-      Procedure getter,
-      Procedure setter) {
+abstract class ThisIndexedAccessGenerator implements Generator {
+  factory ThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, Expression index, Procedure getter, Procedure setter) {
     return helper.forest
         .thisIndexedAccessGenerator(helper, token, index, getter, setter);
   }
@@ -439,14 +405,9 @@
   String get debugName => "ThisIndexedAccessGenerator";
 }
 
-abstract class SuperIndexedAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory SuperIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression index,
-      Member getter,
-      Member setter) {
+abstract class SuperIndexedAccessGenerator implements Generator {
+  factory SuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, Expression index, Member getter, Member setter) {
     return helper.forest
         .superIndexedAccessGenerator(helper, token, index, getter, setter);
   }
@@ -458,22 +419,15 @@
   String get debugName => "SuperIndexedAccessGenerator";
 }
 
-abstract class StaticAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory StaticAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Member readTarget,
-      Member writeTarget) {
+abstract class StaticAccessGenerator implements Generator {
+  factory StaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      Member readTarget, Member writeTarget) {
     return helper.forest
         .staticAccessGenerator(helper, token, readTarget, writeTarget);
   }
 
-  factory StaticAccessGenerator.fromBuilder(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Declaration declaration,
-      Token token,
-      Declaration builderSetter) {
+  factory StaticAccessGenerator.fromBuilder(ExpressionGeneratorHelper helper,
+      Declaration declaration, Token token, Declaration builderSetter) {
     if (declaration is AccessErrorBuilder) {
       AccessErrorBuilder error = declaration;
       declaration = error.builder;
@@ -494,8 +448,7 @@
         setter = builderSetter.target;
       }
     }
-    return new StaticAccessGenerator<Expression, Statement, Arguments>(
-        helper, token, getter, setter);
+    return new StaticAccessGenerator(helper, token, getter, setter);
   }
 
   Member get readTarget;
@@ -504,11 +457,8 @@
   String get debugName => "StaticAccessGenerator";
 }
 
-abstract class LoadLibraryGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory LoadLibraryGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
+abstract class LoadLibraryGenerator implements Generator {
+  factory LoadLibraryGenerator(ExpressionGeneratorHelper helper, Token token,
       LoadLibraryBuilder builder) {
     return helper.forest.loadLibraryGenerator(helper, token, builder);
   }
@@ -520,20 +470,16 @@
   String get debugName => "LoadLibraryGenerator";
 }
 
-abstract class DeferredAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory DeferredAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      PrefixBuilder builder,
-      Generator<Expression, Statement, Arguments> generator) {
+abstract class DeferredAccessGenerator implements Generator {
+  factory DeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      PrefixBuilder builder, Generator generator) {
     return helper.forest
         .deferredAccessGenerator(helper, token, builder, generator);
   }
 
   PrefixBuilder get builder;
 
-  Generator<Expression, Statement, Arguments> get generator;
+  Generator get generator;
 
   @override
   buildPropertyAccess(
@@ -541,7 +487,7 @@
     var propertyAccess =
         generator.buildPropertyAccess(send, operatorOffset, isNullAware);
     if (propertyAccess is Generator) {
-      return new DeferredAccessGenerator<Expression, Statement, Arguments>(
+      return new DeferredAccessGenerator(
           helper, token, builder, propertyAccess);
     } else {
       Expression expression = propertyAccess;
@@ -586,10 +532,9 @@
   }
 }
 
-abstract class TypeUseGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
+abstract class TypeUseGenerator implements Generator {
   factory TypeUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       PrefixBuilder prefix,
       int declarationReferenceOffset,
@@ -666,13 +611,9 @@
   }
 }
 
-abstract class ReadOnlyAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory ReadOnlyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Expression expression,
-      String plainNameForRead) {
+abstract class ReadOnlyAccessGenerator implements Generator {
+  factory ReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      Expression expression, String plainNameForRead) {
     return helper.forest
         .readOnlyAccessGenerator(helper, token, expression, plainNameForRead);
   }
@@ -681,11 +622,9 @@
   String get debugName => "ReadOnlyAccessGenerator";
 }
 
-abstract class LargeIntAccessGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
+abstract class LargeIntAccessGenerator implements Generator {
   factory LargeIntAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token) {
+      ExpressionGeneratorHelper helper, Token token) {
     return helper.forest.largeIntAccessGenerator(helper, token);
   }
 
@@ -715,8 +654,7 @@
   }
 }
 
-abstract class ErroneousExpressionGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
+abstract class ErroneousExpressionGenerator implements Generator {
   /// Pass [arguments] that must be evaluated before throwing an error.  At
   /// most one of [isGetter] and [isSetter] should be true and they're passed
   /// to [ExpressionGeneratorHelper.buildThrowNoSuchMethodError] if it is used.
@@ -785,7 +723,7 @@
     // increment node that wraps an error.
     return buildError(
         forest.arguments(
-            <Expression>[storeOffset(forest.literalInt(1, null), offset)],
+            <Expression>[forest.literalInt(1, null)..fileOffset = offset],
             token),
         isGetter: true);
   }
@@ -797,7 +735,7 @@
     // node that wraps an error.
     return buildError(
         forest.arguments(
-            <Expression>[storeOffset(forest.literalInt(1, null), offset)],
+            <Expression>[forest.literalInt(1, null)..fileOffset = offset],
             token),
         isGetter: true);
   }
@@ -825,12 +763,9 @@
   }
 }
 
-abstract class UnresolvedNameGenerator<Expression, Statement, Arguments>
-    implements ErroneousExpressionGenerator<Expression, Statement, Arguments> {
+abstract class UnresolvedNameGenerator implements ErroneousExpressionGenerator {
   factory UnresolvedNameGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Name name) {
+      ExpressionGeneratorHelper helper, Token token, Name name) {
     return helper.forest.unresolvedNameGenerator(helper, token, name);
   }
 
@@ -855,7 +790,7 @@
       {bool isGetter: false, bool isSetter: false, int offset}) {
     offset ??= offsetForToken(this.token);
     return helper.throwNoSuchMethodError(
-        storeOffset(forest.literalNull(null), offset),
+        forest.literalNull(null)..fileOffset = offset,
         plainNameForRead,
         arguments,
         offset,
@@ -864,11 +799,8 @@
   }
 }
 
-abstract class UnlinkedGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  factory UnlinkedGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
+abstract class UnlinkedGenerator implements Generator {
+  factory UnlinkedGenerator(ExpressionGeneratorHelper helper, Token token,
       UnlinkedDeclaration declaration) {
     return helper.forest.unlinkedGenerator(helper, token, declaration);
   }
@@ -888,9 +820,8 @@
   }
 }
 
-abstract class ContextAwareGenerator<Expression, Statement, Arguments>
-    implements Generator<Expression, Statement, Arguments> {
-  Generator<Expression, Statement, Arguments> get generator;
+abstract class ContextAwareGenerator implements Generator {
+  Generator get generator;
 
   @override
   String get plainNameForRead {
@@ -948,14 +879,9 @@
   }
 }
 
-abstract class DelayedAssignment<Expression, Statement, Arguments>
-    implements ContextAwareGenerator<Expression, Statement, Arguments> {
-  factory DelayedAssignment(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Generator<Expression, Statement, Arguments> generator,
-      Expression value,
-      String assignmentOperator) {
+abstract class DelayedAssignment implements ContextAwareGenerator {
+  factory DelayedAssignment(ExpressionGeneratorHelper helper, Token token,
+      Generator generator, Expression value, String assignmentOperator) {
     return helper.forest
         .delayedAssignment(helper, token, generator, value, assignmentOperator);
   }
@@ -1038,14 +964,9 @@
   }
 }
 
-abstract class DelayedPostfixIncrement<Expression, Statement, Arguments>
-    implements ContextAwareGenerator<Expression, Statement, Arguments> {
-  factory DelayedPostfixIncrement(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Generator<Expression, Statement, Arguments> generator,
-      Name binaryOperator,
-      Procedure interfaceTarget) {
+abstract class DelayedPostfixIncrement implements ContextAwareGenerator {
+  factory DelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
+      Generator generator, Name binaryOperator, Procedure interfaceTarget) {
     return helper.forest.delayedPostfixIncrement(
         helper, token, generator, binaryOperator, interfaceTarget);
   }
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 3589b1c..57df1bb 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
@@ -26,8 +26,10 @@
 
 import 'kernel_ast_api.dart'
     show
+        Arguments,
         Constructor,
         DartType,
+        Expression,
         FunctionNode,
         FunctionType,
         Initializer,
@@ -45,8 +47,7 @@
         PrefixBuilder,
         TypeDeclarationBuilder;
 
-abstract class ExpressionGeneratorHelper<Expression, Statement, Arguments>
-    implements InferenceHelper<Expression, Statement, Arguments> {
+abstract class ExpressionGeneratorHelper implements InferenceHelper {
   LibraryBuilder get library;
 
   Uri get uri;
@@ -57,7 +58,7 @@
 
   ConstantContext get constantContext;
 
-  Forest<Expression, Statement, Token, Arguments> get forest;
+  Forest get forest;
 
   Constructor lookupConstructor(Name name, {bool isSuper});
 
@@ -152,6 +153,4 @@
   Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
 
   void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
-
-  T storeOffset<T>(T node, int offset);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/factory.dart b/pkg/front_end/lib/src/fasta/kernel/factory.dart
index ebae116..9995d68 100644
--- a/pkg/front_end/lib/src/fasta/kernel/factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/factory.dart
@@ -2,14 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:front_end/src/scanner/token.dart' show Token;
-
 import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
+import '../../scanner/token.dart' show Token;
+
 import 'kernel_shadow_ast.dart'
-    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+    show
+        ExpressionJudgment,
+        InitializerJudgment,
+        StatementJudgment,
+        SwitchCaseJudgment;
 
 /// Abstract base class for factories that can construct trees of expressions,
 /// statements, initializers, and literal types based on tokens, inferred types,
@@ -53,8 +57,13 @@
   Expression boolLiteral(ExpressionJudgment judgment, int fileOffset,
       Token literal, bool value, DartType inferredType);
 
-  Statement breakStatement(StatementJudgment judgment, int fileOffset,
-      Token breakKeyword, Expression label, Token semicolon);
+  Statement breakStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token breakKeyword,
+      Expression label,
+      Token semicolon,
+      covariant Object labelBinder);
 
   Expression cascadeExpression(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType);
@@ -72,9 +81,9 @@
       Token rightParenthesis,
       Statement body,
       DartType guardType,
-      int exceptionOffset,
+      covariant Object exceptionBinder,
       DartType exceptionType,
-      int stackTraceOffset,
+      covariant Object stackTraceBinder,
       DartType stackTraceType);
 
   Expression conditionalExpression(
@@ -90,11 +99,21 @@
   Expression constructorInvocation(ExpressionJudgment judgment, int fileOffset,
       Node expressionTarget, DartType inferredType);
 
-  Statement continueStatement(StatementJudgment judgment, int fileOffset,
-      Token continueKeyword, Expression label, Token semicolon);
+  Statement continueStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token continueKeyword,
+      Expression label,
+      Token semicolon,
+      covariant Object labelBinder);
 
-  Statement continueSwitchStatement(StatementJudgment judgment, int fileOffset,
-      Token continueKeyword, Expression label, Token semicolon);
+  Statement continueSwitchStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token continueKeyword,
+      Expression label,
+      Token semicolon,
+      covariant Object labelBinder);
 
   Expression deferredCheck(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType);
@@ -113,6 +132,8 @@
   Expression doubleLiteral(ExpressionJudgment judgment, int fileOffset,
       Token literal, double value, DartType inferredType);
 
+  Statement emptyStatement(Token semicolon);
+
   Statement expressionStatement(StatementJudgment judgment, int fileOffset,
       Expression expression, Token semicolon);
 
@@ -129,17 +150,41 @@
   Statement forInStatement(
       StatementJudgment judgment,
       int fileOffset,
-      int variableOffset,
-      DartType variableType,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      covariant Object loopVariable,
+      Token identifier,
+      Token inKeyword,
+      Expression iterator,
+      Token rightParenthesis,
+      Statement body,
+      covariant Object loopVariableBinder,
+      DartType loopVariableType,
       int writeOffset,
       DartType writeVariableType,
       int writeVariableDeclarationOffset,
       Node writeTarget);
 
-  Statement forStatement(StatementJudgment judgment, int fileOffset);
+  Statement forStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token forKeyword,
+      Token leftParenthesis,
+      covariant Object variableDeclarationList,
+      Expression initialization,
+      Token leftSeparator,
+      Expression condition,
+      Token rightSeparator,
+      List<Expression> updaters,
+      Token rightParenthesis,
+      Statement body);
 
   Statement functionDeclaration(
-      StatementJudgment judgment, int fileOffset, FunctionType inferredType);
+      covariant Object binder, FunctionType inferredType);
+
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name);
 
   Expression functionExpression(
       ExpressionJudgment judgment, int fileOffset, DartType inferredType);
@@ -190,10 +235,22 @@
       DartType testedType,
       DartType inferredType);
 
-  Statement labeledStatement(StatementJudgment judgment, int fileOffset);
+  Statement labeledStatement(List<Object> labels, Statement statement);
+
+  Object statementLabel(covariant Object binder, Token label, Token colon);
+
+  Object binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name);
 
   Expression listLiteral(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token constKeyword,
+      covariant Object typeArguments,
+      Token leftBracket,
+      List<Expression> elements,
+      Token rightBracket,
+      DartType inferredType);
 
   Expression logicalExpression(
       ExpressionJudgment judgment,
@@ -204,7 +261,17 @@
       DartType inferredType);
 
   Expression mapLiteral(
-      ExpressionJudgment judgment, int fileOffset, DartType typeContext);
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token constKeyword,
+      covariant Object typeArguments,
+      Token leftBracket,
+      List<Object> entries,
+      Token rightBracket,
+      DartType inferredType);
+
+  Object mapLiteralEntry(Object judgment, int fileOffset, Expression key,
+      Token separator, Expression value);
 
   Expression methodInvocation(
       ExpressionJudgment judgment,
@@ -225,8 +292,8 @@
       Substitution substitution,
       DartType inferredType);
 
-  Expression namedFunctionExpression(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+  Expression namedFunctionExpression(ExpressionJudgment judgment,
+      covariant Object binder, DartType inferredType);
 
   Expression not(ExpressionJudgment judgment, int fileOffset, Token operator,
       Expression operand, DartType inferredType);
@@ -300,7 +367,29 @@
       Token constructorName,
       covariant Object argumentList);
 
-  Statement switchStatement(StatementJudgment judgment, int fileOffset);
+  Object switchCase(
+      SwitchCaseJudgment judgment,
+      List<Object> labels,
+      Token keyword,
+      Expression expression,
+      Token colon,
+      List<Statement> statements);
+
+  Object switchLabel(covariant Object binder, Token label, Token colon);
+
+  Object binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name);
+
+  Statement switchStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token switchKeyword,
+      Token leftParenthesis,
+      Expression expression,
+      Token rightParenthesis,
+      Token leftBracket,
+      List<Object> members,
+      Token rightBracket);
 
   Expression symbolLiteral(
       ExpressionJudgment judgment,
@@ -318,7 +407,14 @@
 
   Statement tryCatch(StatementJudgment judgment, int fileOffset);
 
-  Statement tryFinally(StatementJudgment judgment, int fileOffset);
+  Statement tryFinally(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token tryKeyword,
+      Statement body,
+      List<Object> catchClauses,
+      Token finallyKeyword,
+      Statement finallyBlock);
 
   Expression typeLiteral(ExpressionJudgment judgment, int fileOffset,
       Node expressionType, DartType inferredType);
@@ -331,18 +427,14 @@
       Node combiner,
       DartType inferredType);
 
-  Statement variableDeclaration(StatementJudgment judgment, int fileOffset,
-      DartType statementType, DartType inferredType);
+  Statement variableDeclaration(
+      covariant Object binder, DartType statementType, DartType inferredType);
 
-  Expression variableGet(
-      ExpressionJudgment judgment,
-      int fileOffset,
-      bool isInCascade,
-      int expressionVariableDeclarationOffset,
-      DartType inferredType);
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name);
 
-  Expression variableSet(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+  Expression variableGet(ExpressionJudgment judgment, int fileOffset,
+      bool isInCascade, covariant Object variableBinder, DartType inferredType);
 
   Statement whileStatement(
       StatementJudgment judgment,
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 0c4014e..b091616 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -81,32 +81,33 @@
         DoJudgment,
         DoubleJudgment,
         EmptyStatementJudgment,
+        ExpressionStatementJudgment,
+        ForJudgment,
+        IfJudgment,
         IntJudgment,
         IsJudgment,
         IsNotJudgment,
         LabeledStatementJudgment,
+        ListLiteralJudgment,
         LoadLibraryJudgment,
+        LogicalJudgment,
+        MapEntryJudgment,
+        MapLiteralJudgment,
+        NotJudgment,
         NullJudgment,
-        ExpressionStatementJudgment,
-        ShadowForStatement,
-        IfJudgment,
-        ShadowListLiteral,
-        ShadowLogicalExpression,
-        ShadowMapLiteral,
-        ShadowNot,
-        ShadowRethrow,
+        RethrowJudgment,
         ReturnJudgment,
-        ShadowStringConcatenation,
-        ShadowStringLiteral,
-        ShadowSymbolLiteral,
-        ShadowSyntheticExpression,
-        TryCatchJudgment,
-        ShadowTryFinally,
-        WhileJudgment,
-        YieldJudgment,
+        StringConcatenationJudgment,
+        StringLiteralJudgment,
+        SymbolLiteralJudgment,
+        SyntheticExpressionJudgment,
         ThisJudgment,
         ThrowJudgment,
-        TypeLiteralJudgment;
+        TryCatchJudgment,
+        TryFinallyJudgment,
+        TypeLiteralJudgment,
+        WhileJudgment,
+        YieldJudgment;
 
 import 'forest.dart'
     show
@@ -119,7 +120,7 @@
         UnlinkedDeclaration;
 
 /// A shadow tree factory.
-class Fangorn extends Forest<Expression, Statement, Token, Arguments> {
+class Fangorn extends Forest {
   const Fangorn();
 
   @override
@@ -155,25 +156,25 @@
   }
 
   @override
-  ShadowStringLiteral asLiteralString(Expression value) => value;
+  StringLiteralJudgment asLiteralString(Expression value) => value;
 
   @override
   BoolJudgment literalBool(bool value, Token token) {
-    return new BoolJudgment(value)..fileOffset = offsetForToken(token);
+    return new BoolJudgment(token, value)..fileOffset = offsetForToken(token);
   }
 
   @override
   DoubleJudgment literalDouble(double value, Token token) {
-    return new DoubleJudgment(value)..fileOffset = offsetForToken(token);
+    return new DoubleJudgment(token, value)..fileOffset = offsetForToken(token);
   }
 
   @override
   IntJudgment literalInt(int value, Token token) {
-    return new IntJudgment(value)..fileOffset = offsetForToken(token);
+    return new IntJudgment(token, value)..fileOffset = offsetForToken(token);
   }
 
   @override
-  ShadowListLiteral literalList(
+  ListLiteralJudgment literalList(
       Token constKeyword,
       bool isConst,
       Object typeArgument,
@@ -183,13 +184,14 @@
       Token rightBracket) {
     // TODO(brianwilkerson): The file offset computed below will not be correct
     // if there are type arguments but no `const` keyword.
-    return new ShadowListLiteral(expressions,
+    return new ListLiteralJudgment(
+        constKeyword, leftBracket, expressions, rightBracket,
         typeArgument: typeArgument, isConst: isConst)
       ..fileOffset = offsetForToken(constKeyword ?? leftBracket);
   }
 
   @override
-  ShadowMapLiteral literalMap(
+  MapLiteralJudgment literalMap(
       Token constKeyword,
       bool isConst,
       DartType keyType,
@@ -200,29 +202,31 @@
       Token rightBracket) {
     // TODO(brianwilkerson): The file offset computed below will not be correct
     // if there are type arguments but no `const` keyword.
-    return new ShadowMapLiteral(entries,
+    return new MapLiteralJudgment(
+        constKeyword, leftBracket, entries, rightBracket,
         keyType: keyType, valueType: valueType, isConst: isConst)
       ..fileOffset = offsetForToken(constKeyword ?? leftBracket);
   }
 
   @override
   NullJudgment literalNull(Token token) {
-    return new NullJudgment()..fileOffset = offsetForToken(token);
+    return new NullJudgment(token)..fileOffset = offsetForToken(token);
   }
 
   @override
-  ShadowStringLiteral literalString(String value, Token token) {
-    return new ShadowStringLiteral(value)..fileOffset = offsetForToken(token);
+  StringLiteralJudgment literalString(String value, Token token) {
+    return new StringLiteralJudgment(token, value)
+      ..fileOffset = offsetForToken(token);
   }
 
   @override
-  ShadowSymbolLiteral literalSymbolMultiple(String value, Token hash, _) {
-    return new ShadowSymbolLiteral(value)..fileOffset = offsetForToken(hash);
+  SymbolLiteralJudgment literalSymbolMultiple(String value, Token hash, _) {
+    return new SymbolLiteralJudgment(value)..fileOffset = offsetForToken(hash);
   }
 
   @override
-  ShadowSymbolLiteral literalSymbolSingluar(String value, Token hash, _) {
-    return new ShadowSymbolLiteral(value)..fileOffset = offsetForToken(hash);
+  SymbolLiteralJudgment literalSymbolSingluar(String value, Token hash, _) {
+    return new SymbolLiteralJudgment(value)..fileOffset = offsetForToken(hash);
   }
 
   @override
@@ -232,12 +236,12 @@
 
   @override
   MapEntry mapEntry(Expression key, Token colon, Expression value) {
-    return new MapEntry(key, value)..fileOffset = offsetForToken(colon);
+    return new MapEntryJudgment(key, value)..fileOffset = offsetForToken(colon);
   }
 
   @override
   List<MapEntry> mapEntryList(int length) {
-    return new List<MapEntry>.filled(length, null, growable: true);
+    return new List<MapEntryJudgment>.filled(length, null, growable: true);
   }
 
   @override
@@ -261,7 +265,8 @@
 
   @override
   Expression asExpression(Expression expression, covariant type, Token token) {
-    return new AsJudgment(expression, type)..fileOffset = offsetForToken(token);
+    return new AsJudgment(expression, token, type)
+      ..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -271,8 +276,13 @@
       Expression condition,
       Token comma,
       Expression message) {
-    return new AssertInitializerJudgment(assertStatement(
-        assertKeyword, leftParenthesis, condition, comma, message, null));
+    return new AssertInitializerJudgment(
+        assertStatement(
+            assertKeyword, leftParenthesis, condition, comma, message, null),
+        assertKeyword,
+        leftParenthesis,
+        comma,
+        leftParenthesis.endGroup);
   }
 
   @override
@@ -311,7 +321,8 @@
         endOffset = conditionLastToken.offset + conditionLastToken.length;
       }
     }
-    return new AssertStatementJudgment(condition,
+    return new AssertStatementJudgment(assertKeyword, leftParenthesis,
+        condition, comma, leftParenthesis.endGroup, semicolon,
         conditionStartOffset: startOffset,
         conditionEndOffset: endOffset,
         message: message);
@@ -319,7 +330,8 @@
 
   @override
   Expression awaitExpression(Expression operand, Token token) {
-    return new AwaitJudgment(operand)..fileOffset = offsetForToken(token);
+    return new AwaitJudgment(token, operand)
+      ..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -335,13 +347,14 @@
         copy.add(statement);
       }
     }
-    return new BlockJudgment(copy ?? statements)
+    return new BlockJudgment(openBrace, copy ?? statements, closeBrace)
       ..fileOffset = offsetForToken(openBrace);
   }
 
   @override
   Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
-    return new BreakJudgment(null)..fileOffset = breakKeyword.charOffset;
+    return new BreakJudgment(breakKeyword, null, semicolon)
+      ..fileOffset = breakKeyword.charOffset;
   }
 
   @override
@@ -354,7 +367,9 @@
       DartType stackTraceType,
       Statement body) {
     exceptionType ??= const DynamicType();
-    return new CatchJudgment(exceptionParameter, body,
+    // TODO(brianwilkerson) Get the left and right parentheses and the comma.
+    return new CatchJudgment(
+        onKeyword, catchKeyword, null, exceptionParameter, null, null, body,
         guard: exceptionType, stackTrace: stackTraceParameter)
       ..fileOffset = offsetForToken(onKeyword ?? catchKeyword);
   }
@@ -362,29 +377,34 @@
   @override
   Expression conditionalExpression(Expression condition, Token question,
       Expression thenExpression, Token colon, Expression elseExpression) {
-    return new ConditionalJudgment(condition, thenExpression, elseExpression)
+    return new ConditionalJudgment(
+        condition, question, thenExpression, colon, elseExpression)
       ..fileOffset = offsetForToken(question);
   }
 
   @override
   Statement continueStatement(
       Token continueKeyword, Object label, Token semicolon) {
-    return new ContinueJudgment(null)..fileOffset = continueKeyword.charOffset;
+    return new ContinueJudgment(continueKeyword, null, semicolon)
+      ..fileOffset = continueKeyword.charOffset;
   }
 
   @override
   Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
       Expression condition, Token semicolon) {
-    return new DoJudgment(body, condition)..fileOffset = doKeyword.charOffset;
+    // TODO(brianwilkerson): Plumb through the left-and right parentheses.
+    return new DoJudgment(
+        doKeyword, body, whileKeyword, null, condition, null, semicolon)
+      ..fileOffset = doKeyword.charOffset;
   }
 
   Statement expressionStatement(Expression expression, Token semicolon) {
-    return new ExpressionStatementJudgment(expression);
+    return new ExpressionStatementJudgment(expression, semicolon);
   }
 
   @override
   Statement emptyStatement(Token semicolon) {
-    return new EmptyStatementJudgment();
+    return new EmptyStatementJudgment(semicolon);
   }
 
   @override
@@ -392,21 +412,34 @@
       Token forKeyword,
       Token leftParenthesis,
       List<VariableDeclaration> variableList,
-      covariant initialization,
+      List<Expression> initializers,
       Token leftSeparator,
       Expression condition,
       Statement conditionStatement,
       List<Expression> updaters,
       Token rightParenthesis,
       Statement body) {
-    return new ShadowForStatement(variableList, condition, updaters, body)
+    // TODO(brianwilkerson): Plumb through the right separator.
+    return new ForJudgment(
+        forKeyword,
+        leftParenthesis,
+        variableList,
+        initializers,
+        leftSeparator,
+        condition,
+        null,
+        updaters,
+        leftParenthesis.endGroup,
+        body)
       ..fileOffset = forKeyword.charOffset;
   }
 
   @override
   Statement ifStatement(Token ifKeyword, Expression condition,
       Statement thenStatement, Token elseKeyword, Statement elseStatement) {
-    return new IfJudgment(condition, thenStatement, elseStatement)
+    // TODO(brianwilkerson) Plumb through the left and right parentheses.
+    return new IfJudgment(ifKeyword, null, condition, null, thenStatement,
+        elseKeyword, elseStatement)
       ..fileOffset = ifKeyword.charOffset;
   }
 
@@ -415,9 +448,9 @@
       Expression operand, isOperator, Token notOperator, covariant type) {
     int offset = offsetForToken(isOperator);
     if (notOperator != null) {
-      return new IsNotJudgment(operand, type, offset);
+      return new IsNotJudgment(operand, isOperator, notOperator, type, offset);
     }
-    return new IsJudgment(operand, type)..fileOffset = offset;
+    return new IsJudgment(operand, isOperator, type)..fileOffset = offset;
   }
 
   @override
@@ -426,21 +459,19 @@
   }
 
   @override
-  Statement labeledStatement(
-          LabelTarget<Statement> target, Statement statement) =>
+  Statement labeledStatement(LabelTarget target, Statement statement) =>
       statement;
 
   @override
   Expression logicalExpression(
       Expression leftOperand, Token operator, Expression rightOperand) {
-    return new ShadowLogicalExpression(
-        leftOperand, operator.stringValue, rightOperand)
+    return new LogicalJudgment(leftOperand, operator, rightOperand)
       ..fileOffset = offsetForToken(operator);
   }
 
   @override
   Expression notExpression(Expression operand, Token token) {
-    return new ShadowNot(operand)..fileOffset = offsetForToken(token);
+    return new NotJudgment(token, operand)..fileOffset = offsetForToken(token);
   }
 
   @override
@@ -452,20 +483,22 @@
   @override
   Statement rethrowStatement(Token rethrowKeyword, Token semicolon) {
     return new ExpressionStatementJudgment(
-        new ShadowRethrow()..fileOffset = offsetForToken(rethrowKeyword));
+        new RethrowJudgment(rethrowKeyword)
+          ..fileOffset = offsetForToken(rethrowKeyword),
+        semicolon);
   }
 
   @override
   Statement returnStatement(
       Token returnKeyword, Expression expression, Token semicolon) {
-    return new ReturnJudgment(expression)
+    return new ReturnJudgment(returnKeyword, semicolon, expression)
       ..fileOffset = returnKeyword.charOffset;
   }
 
   @override
   Expression stringConcatenationExpression(
       List<Expression> expressions, Token token) {
-    return new ShadowStringConcatenation(expressions)
+    return new StringConcatenationJudgment(expressions)
       ..fileOffset = offsetForToken(token);
   }
 
@@ -476,26 +509,23 @@
 
   @override
   Expression thisExpression(Token token) {
-    return new ThisJudgment()..fileOffset = offsetForToken(token);
+    return new ThisJudgment(token)..fileOffset = offsetForToken(token);
   }
 
   @override
   Expression throwExpression(Token throwKeyword, Expression expression) {
-    return new ThrowJudgment(expression)
+    return new ThrowJudgment(throwKeyword, expression)
       ..fileOffset = offsetForToken(throwKeyword);
   }
 
   @override
   Statement tryStatement(Token tryKeyword, Statement body,
       List<Catch> catchClauses, Token finallyKeyword, Statement finallyBlock) {
-    Statement tryStatement = body;
-    if (catchClauses != null) {
-      tryStatement = new TryCatchJudgment(tryStatement, catchClauses);
-    }
     if (finallyBlock != null) {
-      tryStatement = new ShadowTryFinally(tryStatement, finallyBlock);
+      return new TryFinallyJudgment(
+          tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
     }
-    return tryStatement;
+    return new TryCatchJudgment(body, catchClauses ?? const <CatchJudgment>[]);
   }
 
   @override
@@ -513,10 +543,10 @@
   @override
   Statement wrapVariables(Statement statement) {
     if (statement is _VariablesDeclaration) {
-      return new BlockJudgment(statement.declarations)
+      return new BlockJudgment(null, statement.declarations, null)
         ..fileOffset = statement.fileOffset;
     } else if (statement is VariableDeclaration) {
-      return new BlockJudgment(<Statement>[statement])
+      return new BlockJudgment(null, <Statement>[statement], null)
         ..fileOffset = statement.fileOffset;
     } else {
       return statement;
@@ -526,14 +556,15 @@
   @override
   Statement whileStatement(
       Token whileKeyword, Expression condition, Statement body) {
-    return new WhileJudgment(condition, body)
+    // TODO(brianwilkerson) Plumb through the left and right parentheses.
+    return new WhileJudgment(whileKeyword, null, condition, null, body)
       ..fileOffset = whileKeyword.charOffset;
   }
 
   @override
   Statement yieldStatement(
       Token yieldKeyword, Token star, Expression expression, Token semicolon) {
-    return new YieldJudgment(expression, isYieldStar: star != null)
+    return new YieldJudgment(yieldKeyword, star, expression, semicolon)
       ..fileOffset = yieldKeyword.charOffset;
   }
 
@@ -569,8 +600,8 @@
       VariableDeclaration variable = node;
       node = variable.initializer;
     }
-    if (node is ShadowSyntheticExpression) {
-      ShadowSyntheticExpression synth = node;
+    if (node is SyntheticExpressionJudgment) {
+      SyntheticExpressionJudgment synth = node;
       node = synth.desugared;
     }
     if (node is Let) {
@@ -616,7 +647,7 @@
 
   @override
   KernelVariableUseGenerator variableUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       VariableDeclaration variable,
       DartType promotedType) {
@@ -626,7 +657,7 @@
 
   @override
   KernelPropertyAccessGenerator propertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression receiver,
       Name name,
@@ -638,7 +669,7 @@
 
   @override
   KernelThisPropertyAccessGenerator thisPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Name name,
       Member getter,
@@ -649,7 +680,7 @@
 
   @override
   KernelNullAwarePropertyAccessGenerator nullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression receiverExpression,
       Name name,
@@ -662,7 +693,7 @@
 
   @override
   KernelSuperPropertyAccessGenerator superPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Name name,
       Member getter,
@@ -673,7 +704,7 @@
 
   @override
   KernelIndexedAccessGenerator indexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression receiver,
       Expression index,
@@ -685,7 +716,7 @@
 
   @override
   KernelThisIndexedAccessGenerator thisIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression index,
       Procedure getter,
@@ -696,7 +727,7 @@
 
   @override
   KernelSuperIndexedAccessGenerator superIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression index,
       Member getter,
@@ -707,7 +738,7 @@
 
   @override
   KernelStaticAccessGenerator staticAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Member getter,
       Member setter) {
@@ -716,7 +747,7 @@
 
   @override
   KernelLoadLibraryGenerator loadLibraryGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       LoadLibraryBuilder builder) {
     return new KernelLoadLibraryGenerator(helper, token, builder);
@@ -724,16 +755,16 @@
 
   @override
   KernelDeferredAccessGenerator deferredAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       PrefixBuilder builder,
-      Generator<Expression, Statement, Arguments> generator) {
+      Generator generator) {
     return new KernelDeferredAccessGenerator(helper, token, builder, generator);
   }
 
   @override
   KernelTypeUseGenerator typeUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       PrefixBuilder prefix,
       int declarationReferenceOffset,
@@ -745,7 +776,7 @@
 
   @override
   KernelReadOnlyAccessGenerator readOnlyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       Expression expression,
       String plainNameForRead) {
@@ -755,32 +786,27 @@
 
   @override
   KernelLargeIntAccessGenerator largeIntAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token) {
+      ExpressionGeneratorHelper helper, Token token) {
     return new KernelLargeIntAccessGenerator(helper, token);
   }
 
   @override
   KernelUnresolvedNameGenerator unresolvedNameGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Name name) {
+      ExpressionGeneratorHelper helper, Token token, Name name) {
     return new KernelUnresolvedNameGenerator(helper, token, name);
   }
 
   @override
-  KernelUnlinkedGenerator unlinkedGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      UnlinkedDeclaration declaration) {
+  KernelUnlinkedGenerator unlinkedGenerator(ExpressionGeneratorHelper helper,
+      Token token, UnlinkedDeclaration declaration) {
     return new KernelUnlinkedGenerator(helper, token, declaration);
   }
 
   @override
   KernelDelayedAssignment delayedAssignment(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
-      Generator<Expression, Statement, Arguments> generator,
+      Generator generator,
       Expression value,
       String assignmentOperator) {
     return new KernelDelayedAssignment(
@@ -789,9 +815,9 @@
 
   @override
   KernelDelayedPostfixIncrement delayedPostfixIncrement(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
-      Generator<Expression, Statement, Arguments> generator,
+      Generator generator,
       Name binaryOperator,
       Procedure interfaceTarget) {
     return new KernelDelayedPostfixIncrement(
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 4d80798..0325d02 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -4,13 +4,15 @@
 
 library fasta.forest;
 
-import 'package:kernel/ast.dart' as kernel
+import 'package:kernel/ast.dart'
     show
         Arguments, // TODO(ahe): Remove this import.
         DartType,
+        Expression,
         Member,
         Name,
-        Procedure;
+        Procedure,
+        Statement;
 
 import 'body_builder.dart' show Identifier, LabelTarget;
 
@@ -25,6 +27,8 @@
         TypeDeclarationBuilder,
         UnlinkedDeclaration;
 
+import '../scanner.dart' show Token;
+
 export 'body_builder.dart' show Identifier, Operator;
 
 export 'expression_generator.dart' show Generator;
@@ -39,15 +43,13 @@
         UnlinkedDeclaration;
 
 /// A tree factory.
-///
-/// For now, the [Location] is always a token.
-abstract class Forest<Expression, Statement, Location, Arguments> {
+abstract class Forest {
   const Forest();
 
-  Arguments arguments(List<Expression> positional, Location location,
+  Arguments arguments(List<Expression> positional, Token location,
       {covariant List types, covariant List named});
 
-  Arguments argumentsEmpty(Location location);
+  Arguments argumentsEmpty(Token location);
 
   List argumentsNamed(Arguments arguments);
 
@@ -61,15 +63,15 @@
 
   /// Return a representation of a boolean literal at the given [location]. The
   /// literal has the given [value].
-  Expression literalBool(bool value, Location location);
+  Expression literalBool(bool value, Token location);
 
   /// Return a representation of a double literal at the given [location]. The
   /// literal has the given [value].
-  Expression literalDouble(double value, Location location);
+  Expression literalDouble(double value, Token location);
 
   /// Return a representation of an integer literal at the given [location]. The
   /// literal has the given [value].
-  Expression literalInt(int value, Location location);
+  Expression literalInt(int value, Token location);
 
   /// Return a representation of a list literal. The [constKeyword] is the
   /// location of the `const` keyword, or `null` if there is no keyword. The
@@ -83,13 +85,13 @@
   /// [expressions] is a list of the representations of the list elements. The
   /// [rightBracket] is the location of the `]`.
   Expression literalList(
-      Location constKeyword,
+      Token constKeyword,
       bool isConst,
       Object typeArgument,
       Object typeArguments,
-      Location leftBracket,
+      Token leftBracket,
       List<Expression> expressions,
-      Location rightBracket);
+      Token rightBracket);
 
   /// Return a representation of a map literal. The [constKeyword] is the
   /// location of the `const` keyword, or `null` if there is no keyword. The
@@ -105,41 +107,40 @@
   /// of the `{`. The list of [entries] is a list of the representations of the
   /// map entries. The [rightBracket] is the location of the `}`.
   Expression literalMap(
-      Location constKeyword,
+      Token constKeyword,
       bool isConst,
       covariant keyType,
       covariant valueType,
       Object typeArguments,
-      Location leftBracket,
+      Token leftBracket,
       covariant List entries,
-      Location rightBracket);
+      Token rightBracket);
 
   /// Return a representation of a null literal at the given [location].
-  Expression literalNull(Location location);
+  Expression literalNull(Token location);
 
   /// Return a representation of a simple string literal at the given
   /// [location]. The literal has the given [value]. This does not include
   /// either adjacent strings or interpolated strings.
-  Expression literalString(String value, Location location);
+  Expression literalString(String value, Token location);
 
   /// Return a representation of a symbol literal defined by the [hash] and the
   /// list of [components]. The [value] is the string value of the symbol.
   Expression literalSymbolMultiple(
-      String value, Location hash, List<Identifier> components);
+      String value, Token hash, List<Identifier> components);
 
   /// Return a representation of a symbol literal defined by the [hash] and the
   /// single [component]. The component can be either an [Identifier] or an
   /// [Operator]. The [value] is the string value of the symbol.
-  Expression literalSymbolSingluar(
-      String value, Location hash, Object component);
+  Expression literalSymbolSingluar(String value, Token hash, Object component);
 
-  Expression literalType(covariant type, Location location);
+  Expression literalType(covariant type, Token location);
 
   /// Return a representation of a key/value pair in a literal map. The [key] is
   /// the representation of the expression used to compute the key. The [colon]
   /// is the location of the colon separating the key and the value. The [value]
   /// is the representation of the expression used to compute the value.
-  Object mapEntry(Expression key, Location colon, Expression value);
+  Object mapEntry(Expression key, Token colon, Expression value);
 
   /// Return a list that can hold [length] representations of map entries, as
   /// returned from [mapEntry].
@@ -153,45 +154,40 @@
 
   /// Given a representation of a list of [typeArguments], return the type
   /// associated with the argument at the given [index].
-  kernel.DartType getTypeAt(covariant typeArguments, int index);
+  DartType getTypeAt(covariant typeArguments, int index);
 
   Expression loadLibrary(covariant dependency);
 
   Expression checkLibraryIsLoaded(covariant dependency);
 
   Expression asExpression(
-      Expression expression, covariant type, Location location);
+      Expression expression, covariant type, Token location);
 
   /// Return a representation of an assert that appears in a constructor's
   /// initializer list.
-  Object assertInitializer(Location assertKeyword, Location leftParenthesis,
-      Expression condition, Location comma, Expression message);
+  Object assertInitializer(Token assertKeyword, Token leftParenthesis,
+      Expression condition, Token comma, Expression message);
 
   /// Return a representation of an assert that appears as a statement.
-  Statement assertStatement(
-      Location assertKeyword,
-      Location leftParenthesis,
-      Expression condition,
-      Location comma,
-      Expression message,
-      Location semicolon);
+  Statement assertStatement(Token assertKeyword, Token leftParenthesis,
+      Expression condition, Token comma, Expression message, Token semicolon);
 
-  Expression awaitExpression(Expression operand, Location location);
+  Expression awaitExpression(Expression operand, Token location);
 
   /// Return a representation of a block of [statements] enclosed between the
   /// [openBracket] and [closeBracket].
   Statement block(
-      Location openBrace, List<Statement> statements, Location closeBrace);
+      Token openBrace, List<Statement> statements, Token closeBrace);
 
   /// Return a representation of a break statement.
   Statement breakStatement(
-      Location breakKeyword, Identifier label, Location semicolon);
+      Token breakKeyword, Identifier label, Token semicolon);
 
   /// Return a representation of a catch clause.
   Object catchClause(
-      Location onKeyword,
+      Token onKeyword,
       covariant exceptionType,
-      Location catchKeyword,
+      Token catchKeyword,
       covariant exceptionParameter,
       covariant stackTraceParameter,
       covariant stackTraceType,
@@ -202,95 +198,90 @@
   /// [thenExpression] is the expression following the question mark. The
   /// [colon] is the `:`. The [elseExpression] is the expression following the
   /// colon.
-  Expression conditionalExpression(Expression condition, Location question,
-      Expression thenExpression, Location colon, Expression elseExpression);
+  Expression conditionalExpression(Expression condition, Token question,
+      Expression thenExpression, Token colon, Expression elseExpression);
 
   /// Return a representation of a continue statement.
   Statement continueStatement(
-      Location continueKeyword, Identifier label, Location semicolon);
+      Token continueKeyword, Identifier label, Token semicolon);
 
   /// Return a representation of a do statement.
-  Statement doStatement(
-      Location doKeyword,
-      Statement body,
-      Location whileKeyword,
-      covariant Expression condition,
-      Location semicolon);
+  Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
+      covariant Expression condition, Token semicolon);
 
   /// Return a representation of an expression statement composed from the
   /// [expression] and [semicolon].
-  Statement expressionStatement(Expression expression, Location semicolon);
+  Statement expressionStatement(Expression expression, Token semicolon);
 
   /// Return a representation of an empty statement consisting of the given
   /// [semicolon].
-  Statement emptyStatement(Location semicolon);
+  Statement emptyStatement(Token semicolon);
 
   /// Return a representation of a for statement.
   Statement forStatement(
-      Location forKeyword,
-      Location leftParenthesis,
+      Token forKeyword,
+      Token leftParenthesis,
       covariant variableList,
-      covariant initialization,
-      Location leftSeparator,
+      covariant initializers,
+      Token leftSeparator,
       Expression condition,
       Statement conditionStatement,
       List<Expression> updaters,
-      Location rightParenthesis,
+      Token rightParenthesis,
       Statement body);
 
   /// Return a representation of an `if` statement.
-  Statement ifStatement(Location ifKeyword, covariant Expression condition,
-      Statement thenStatement, Location elseKeyword, Statement elseStatement);
+  Statement ifStatement(Token ifKeyword, covariant Expression condition,
+      Statement thenStatement, Token elseKeyword, Statement elseStatement);
 
   /// Return a representation of an `is` expression. The [operand] is the
   /// representation of the left operand. The [isOperator] is the `is` operator.
   /// The [notOperator] is either the `!` or `null` if the test is not negated.
   /// The [type] is a representation of the type that is the right operand.
-  Expression isExpression(Expression operand, Location isOperator,
-      Location notOperator, covariant type);
+  Expression isExpression(
+      Expression operand, Token isOperator, Token notOperator, covariant type);
 
   /// Return a representation of the label consisting of the given [identifer]
   /// followed by the given [colon].
-  Object label(Location identifier, Location colon);
+  Object label(Token identifier, Token colon);
 
   /// Return a representation of a [statement] that has one or more labels (from
   /// the [target]) associated with it.
-  Statement labeledStatement(
-      LabelTarget<Statement> target, Statement statement);
+  Statement labeledStatement(LabelTarget target, Statement statement);
 
   /// Return a representation of a logical expression having the [leftOperand],
   /// [rightOperand] and the [operator] (either `&&` or `||`).
   Expression logicalExpression(
-      Expression leftOperand, Location operator, Expression rightOperand);
+      Expression leftOperand, Token operator, Expression rightOperand);
 
-  Expression notExpression(Expression operand, Location location);
+  Expression notExpression(Expression operand, Token location);
 
   /// Return a representation of a parenthesized condition consisting of the
   /// given [expression] between the [leftParenthesis] and [rightParenthesis].
-  Object parenthesizedCondition(Location leftParenthesis, Expression expression,
-      Location rightParenthesis);
+  Object parenthesizedCondition(
+      Token leftParenthesis, Expression expression, Token rightParenthesis);
 
   /// Return a representation of a rethrow statement consisting of the
   /// [rethrowKeyword] followed by the [semicolon].
-  Statement rethrowStatement(Location rethrowKeyword, Location semicolon);
+  Statement rethrowStatement(Token rethrowKeyword, Token semicolon);
 
   /// Return a representation of a return statement.
   Statement returnStatement(
-      Location returnKeyword, Expression expression, Location semicolon);
+      Token returnKeyword, Expression expression, Token semicolon);
 
   Expression stringConcatenationExpression(
-      List<Expression> expressions, Location location);
+      List<Expression> expressions, Token location);
 
   /// The given [statement] is being used as the target of either a break or
   /// continue statement. Return the statement that should be used as the actual
   /// target.
   Statement syntheticLabeledStatement(Statement statement);
 
-  Expression thisExpression(Location location);
+  Expression thisExpression(Token location);
 
   /// Return a representation of a throw expression consisting of the
   /// [throwKeyword].
-  Expression throwExpression(Location throwKeyword, Expression expression);
+  Expression throwExpression(Token throwKeyword, Expression expression);
 
   /// Return a representation of a try statement. The statement is introduced by
   /// the [tryKeyword] and the given [body]. If catch clauses were included,
@@ -300,8 +291,8 @@
   /// was an error in some part of the try statement, then an [errorReplacement]
   /// might be provided, in which case it could be returned instead of the
   /// representation of the try statement.
-  Statement tryStatement(Location tryKeyword, Statement body,
-      covariant catchClauses, Location finallyKeyword, Statement finallyBlock);
+  Statement tryStatement(Token tryKeyword, Statement body,
+      covariant catchClauses, Token finallyKeyword, Statement finallyBlock);
 
   Statement variablesDeclaration(covariant List declarations, Uri uri);
 
@@ -313,13 +304,13 @@
   /// Return a representation of a while statement introduced by the
   /// [whileKeyword] and consisting of the given [condition] and [body].
   Statement whileStatement(
-      Location whileKeyword, covariant Expression condition, Statement body);
+      Token whileKeyword, covariant Expression condition, Statement body);
 
   /// Return a representation of a yield statement consisting of the
   /// [yieldKeyword], [star], [expression], and [semicolon]. The [star] is null
   /// when no star was included in the source code.
-  Statement yieldStatement(Location yieldKeyword, Location star,
-      Expression expression, Location semicolon);
+  Statement yieldStatement(
+      Token yieldKeyword, Token star, Expression expression, Token semicolon);
 
   /// Return the expression from the given expression [statement].
   Expression getExpressionFromExpressionStatement(Statement statement);
@@ -368,127 +359,87 @@
   /// Set the type of the [parameter] to the given [type].
   void setParameterType(covariant parameter, covariant type);
 
-  Generator<Expression, Statement, Arguments> variableUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      covariant variable,
-      kernel.DartType promotedType);
+  Generator variableUseGenerator(ExpressionGeneratorHelper helper,
+      Token location, covariant variable, DartType promotedType);
 
-  Generator<Expression, Statement, Arguments> propertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
+  Generator propertyAccessGenerator(
+      ExpressionGeneratorHelper helper,
+      Token location,
       Expression receiver,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter);
+      Name name,
+      Member getter,
+      Member setter);
 
-  Generator<Expression, Statement, Arguments> thisPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter);
+  Generator thisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Name name, Member getter, Member setter);
 
-  Generator<Expression, Statement, Arguments> nullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
+  Generator nullAwarePropertyAccessGenerator(
+      ExpressionGeneratorHelper helper,
+      Token location,
       Expression receiverExpression,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter,
-      kernel.DartType type);
+      Name name,
+      Member getter,
+      Member setter,
+      DartType type);
 
-  Generator<Expression, Statement, Arguments> superPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      kernel.Name name,
-      kernel.Member getter,
-      kernel.Member setter);
+  Generator superPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Name name, Member getter, Member setter);
 
-  Generator<Expression, Statement, Arguments> indexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
+  Generator indexedAccessGenerator(
+      ExpressionGeneratorHelper helper,
+      Token location,
       Expression receiver,
       Expression index,
-      kernel.Procedure getter,
-      kernel.Procedure setter);
+      Procedure getter,
+      Procedure setter);
 
-  Generator<Expression, Statement, Arguments> thisIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      Expression index,
-      kernel.Procedure getter,
-      kernel.Procedure setter);
+  Generator thisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Expression index, Procedure getter, Procedure setter);
 
-  Generator<Expression, Statement, Arguments> superIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      Expression index,
-      kernel.Member getter,
-      kernel.Member setter);
+  Generator superIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Expression index, Member getter, Member setter);
 
-  Generator<Expression, Statement, Arguments> staticAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      kernel.Member getter,
-      kernel.Member setter);
+  Generator staticAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Member getter, Member setter);
 
-  Generator<Expression, Statement, Arguments> loadLibraryGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      LoadLibraryBuilder builder);
+  Generator loadLibraryGenerator(ExpressionGeneratorHelper helper,
+      Token location, LoadLibraryBuilder builder);
 
-  Generator<Expression, Statement, Arguments> deferredAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      PrefixBuilder builder,
-      Generator<Expression, Statement, Arguments> generator);
+  Generator deferredAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, PrefixBuilder builder, Generator generator);
 
-  Generator<Expression, Statement, Arguments> typeUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
+  Generator typeUseGenerator(
+      ExpressionGeneratorHelper helper,
+      Token location,
       PrefixBuilder prefix,
       int declarationReferenceOffset,
       TypeDeclarationBuilder declaration,
       String plainNameForRead);
 
-  Generator<Expression, Statement, Arguments> readOnlyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      Expression expression,
-      String plainNameForRead);
+  Generator readOnlyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token location, Expression expression, String plainNameForRead);
 
-  Generator<Expression, Statement, Arguments> largeIntAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location);
+  Generator largeIntAccessGenerator(
+      ExpressionGeneratorHelper helper, Token location);
 
-  Generator<Expression, Statement, Arguments> unresolvedNameGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      kernel.Name name);
+  Generator unresolvedNameGenerator(
+      ExpressionGeneratorHelper helper, Token location, Name name);
 
-  Generator<Expression, Statement, Arguments> unlinkedGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
+  Generator unlinkedGenerator(ExpressionGeneratorHelper helper, Token location,
       UnlinkedDeclaration declaration);
 
-  Generator<Expression, Statement, Arguments> delayedAssignment(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      Generator<Expression, Statement, Arguments> generator,
-      Expression value,
-      String assignmentOperator);
+  Generator delayedAssignment(ExpressionGeneratorHelper helper, Token location,
+      Generator generator, Expression value, String assignmentOperator);
 
-  Generator<Expression, Statement, Arguments> delayedPostfixIncrement(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Location location,
-      Generator<Expression, Statement, Arguments> generator,
-      kernel.Name binaryOperator,
-      kernel.Procedure interfaceTarget);
+  Generator delayedPostfixIncrement(
+      ExpressionGeneratorHelper helper,
+      Token location,
+      Generator generator,
+      Name binaryOperator,
+      Procedure interfaceTarget);
 
   // TODO(ahe): Remove this method when all users are moved here.
-  kernel.Arguments castArguments(Arguments arguments) {
-    dynamic a = arguments;
-    return a;
+  Arguments castArguments(Arguments arguments) {
+    return arguments;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index 35a714d..40e1263 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
@@ -8,6 +8,7 @@
 
 export 'package:kernel/ast.dart'
     show
+        Arguments,
         AssertStatement,
         AsyncMarker,
         Block,
@@ -64,45 +65,47 @@
 
 export 'kernel_shadow_ast.dart'
     show
+        ArgumentsJudgment,
         AssertInitializerJudgment,
         AssertStatementJudgment,
         BreakJudgment,
-        ShadowCascadeExpression,
-        ShadowComplexAssignment,
-        ShadowConstructorInvocation,
+        CascadeJudgment,
+        ComplexAssignmentJudgment,
+        ConstructorInvocationJudgment,
         ContinueSwitchJudgment,
-        ShadowDeferredCheck,
+        DeferredCheckJudgment,
+        ExpressionJudgment,
         ExpressionStatementJudgment,
-        ShadowFactoryConstructorInvocation,
+        FactoryConstructorInvocationJudgment,
         ShadowFieldInitializer,
-        ShadowForInStatement,
-        ShadowFunctionDeclaration,
-        ShadowFunctionExpression,
-        ShadowIfNullExpression,
+        ForInJudgment,
+        FunctionDeclarationJudgment,
+        FunctionExpressionJudgment,
+        FunctionNodeJudgment,
+        IfNullJudgment,
         IfJudgment,
-        ShadowIllegalAssignment,
-        ShadowIndexAssign,
+        IllegalAssignmentJudgment,
+        IndexAssignmentJudgment,
         ShadowInvalidInitializer,
         LabeledStatementJudgment,
-        ShadowLogicalExpression,
-        ShadowLoopAssignmentStatement,
-        ShadowMethodInvocation,
-        ShadowNamedFunctionExpression,
-        ShadowNullAwareMethodInvocation,
+        LogicalJudgment,
+        MethodInvocationJudgment,
+        NamedFunctionExpressionJudgment,
+        NullAwareMethodInvocationJudgment,
         NullAwarePropertyGetJudgment,
-        ShadowPropertyAssign,
+        PropertyAssignmentJudgment,
         PropertyGetJudgment,
-        ShadowRedirectingInitializer,
+        RedirectingInitializerJudgment,
         ReturnJudgment,
-        ShadowStaticAssignment,
+        StaticAssignmentJudgment,
         StaticGetJudgment,
-        ShadowStaticInvocation,
-        ShadowSuperInitializer,
-        ShadowSuperMethodInvocation,
+        StaticInvocationJudgment,
+        SuperInitializerJudgment,
+        SuperMethodInvocationJudgment,
         SuperPropertyGetJudgment,
         SwitchCaseJudgment,
         SwitchStatementJudgment,
-        ShadowSyntheticExpression,
+        SyntheticExpressionJudgment,
         VariableAssignmentJudgment,
         VariableDeclarationJudgment,
         VariableGetJudgment,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
index a1c93b1..3be83dc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
@@ -4,9 +4,7 @@
 
 library fasta.kernel_body_builder;
 
-import 'package:kernel/ast.dart' show Arguments, Expression, Statement;
-
-import '../scanner.dart' show Token;
+import 'package:kernel/ast.dart' show Expression;
 
 import '../type_inference/type_inferrer.dart' show TypeInferrer;
 
@@ -21,10 +19,9 @@
 import 'kernel_builder.dart'
     show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;
 
-class KernelBodyBuilder extends BodyBuilder<Expression, Statement, Arguments> {
+class KernelBodyBuilder extends BodyBuilder {
   @override
-  final Forest<Expression, Statement, Token, Arguments> forest =
-      const Fangorn();
+  final Forest forest = const Fangorn();
 
   KernelBodyBuilder(
       KernelLibraryBuilder library,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index 0964665..617e6f3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -84,9 +84,10 @@
       this.objectType,
       this.stringType,
       LibraryBuilder parent,
+      int startCharOffset,
       int charOffset)
       : super(metadata, 0, name, null, null, null, scope, constructors, parent,
-            null, charOffset, TreeNode.noOffset, cls);
+            null, startCharOffset, charOffset, TreeNode.noOffset, cls);
 
   factory KernelEnumBuilder(
       MetadataCollector metadataCollector,
@@ -140,6 +141,7 @@
         parent,
         charOffset,
         charOffset,
+        charOffset,
         charEndOffset);
     constructors[""] = constructorBuilder;
     KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(null, listType,
@@ -156,6 +158,7 @@
         parent,
         charOffset,
         charOffset,
+        charOffset,
         charEndOffset);
     members["toString"] = toStringBuilder;
     String className = name;
@@ -192,6 +195,8 @@
           fieldBuilder.target, documentationComment);
       members[name] = fieldBuilder;
     }
+    final int startCharOffset =
+        metadata == null ? charOffset : metadata.first.charOffset;
     KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal(
         metadata,
         name,
@@ -206,6 +211,7 @@
         objectType,
         stringType,
         parent,
+        startCharOffset,
         charOffset);
     // TODO(sigmund): dynamic should be `covariant MemberBuilder`.
     void setParent(String name, dynamic b) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 51f22e3..1343555 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart'
-    show Arguments, Expression, InvalidExpression, Node, Statement;
+    show Arguments, Expression, InvalidExpression, Node;
 
 import '../../scanner/token.dart' show Token;
 
@@ -74,18 +74,18 @@
         Name,
         Procedure,
         PropertySet,
-        ShadowComplexAssignment,
-        ShadowIllegalAssignment,
-        ShadowIndexAssign,
-        ShadowMethodInvocation,
+        ComplexAssignmentJudgment,
+        IllegalAssignmentJudgment,
+        IndexAssignmentJudgment,
+        MethodInvocationJudgment,
         NullAwarePropertyGetJudgment,
-        ShadowPropertyAssign,
+        PropertyAssignmentJudgment,
         PropertyGetJudgment,
-        ShadowStaticAssignment,
-        ShadowSuperMethodInvocation,
+        StaticAssignmentJudgment,
+        SuperMethodInvocationJudgment,
         SuperPropertyGetJudgment,
         VariableAssignmentJudgment,
-        ShadowSyntheticExpression,
+        SyntheticExpressionJudgment,
         VariableDeclarationJudgment,
         VariableGetJudgment,
         StaticSet,
@@ -109,13 +109,12 @@
 
 part 'kernel_expression_generator_impl.dart';
 
-abstract class KernelExpressionGenerator
-    implements ExpressionGenerator<Expression, Statement, Arguments> {
-  ExpressionGeneratorHelper<Expression, Statement, Arguments> get helper;
+abstract class KernelExpressionGenerator implements ExpressionGenerator {
+  ExpressionGeneratorHelper get helper;
 
   Token get token;
 
-  Forest<Expression, Statement, Token, Arguments> get forest;
+  Forest get forest;
 
   @override
   Expression buildSimpleRead() {
@@ -135,26 +134,24 @@
       {bool voidContext: false}) {
     var complexAssignment = startComplexAssignment(value);
     if (voidContext) {
-      var nullAwareCombiner = helper.storeOffset(
-          forest.conditionalExpression(
-              buildIsNull(_makeRead(complexAssignment), offset, helper),
-              null,
-              _makeWrite(value, false, complexAssignment),
-              null,
-              helper.storeOffset(forest.literalNull(null), offset)),
-          offset);
+      var nullAwareCombiner = forest.conditionalExpression(
+          buildIsNull(_makeRead(complexAssignment), offset, helper),
+          null,
+          _makeWrite(value, false, complexAssignment),
+          null,
+          forest.literalNull(null)..fileOffset = offset)
+        ..fileOffset = offset;
       complexAssignment?.nullAwareCombiner = nullAwareCombiner;
       return _finish(nullAwareCombiner, complexAssignment);
     }
     var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
-    var nullAwareCombiner = helper.storeOffset(
-        forest.conditionalExpression(
-            buildIsNull(new VariableGet(tmp), offset, helper),
-            null,
-            _makeWrite(value, false, complexAssignment),
-            null,
-            new VariableGet(tmp)),
-        offset);
+    var nullAwareCombiner = forest.conditionalExpression(
+        buildIsNull(new VariableGet(tmp), offset, helper),
+        null,
+        _makeWrite(value, false, complexAssignment),
+        null,
+        new VariableGet(tmp))
+      ..fileOffset = offset;
     complexAssignment?.nullAwareCombiner = nullAwareCombiner;
     return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
   }
@@ -181,7 +178,7 @@
       bool voidContext: false,
       Procedure interfaceTarget}) {
     return buildCompoundAssignment(
-        binaryOperator, helper.storeOffset(forest.literalInt(1, null), offset),
+        binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
         offset: offset,
         voidContext: voidContext,
         interfaceTarget: interfaceTarget,
@@ -197,7 +194,7 @@
       return buildPrefixIncrement(binaryOperator,
           offset: offset, voidContext: true, interfaceTarget: interfaceTarget);
     }
-    var rhs = helper.storeOffset(forest.literalInt(1, null), offset);
+    var rhs = forest.literalInt(1, null)..fileOffset = offset;
     var complexAssignment = startComplexAssignment(rhs);
     var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
     valueAccess() => new VariableGet(value);
@@ -230,17 +227,17 @@
   Expression _makeSimpleRead() => _makeRead(null);
 
   Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return _makeWrite(value, voidContext, complexAssignment);
   }
 
-  Expression _makeRead(ShadowComplexAssignment complexAssignment);
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment);
 
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment);
+      ComplexAssignmentJudgment complexAssignment);
 
   Expression _finish(
-      Expression body, ShadowComplexAssignment complexAssignment) {
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
     if (complexAssignment != null) {
       complexAssignment.desugared = body;
       return complexAssignment;
@@ -251,31 +248,27 @@
 
   /// Creates a data structure for tracking the desugaring of a complex
   /// assignment expression whose right hand side is [rhs].
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowIllegalAssignment(rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new IllegalAssignmentJudgment(rhs);
 }
 
-abstract class KernelGenerator = Generator<Expression, Statement, Arguments>
-    with KernelExpressionGenerator;
+abstract class KernelGenerator = Generator with KernelExpressionGenerator;
 
 class KernelVariableUseGenerator extends KernelGenerator
-    with VariableUseGenerator<Expression, Statement, Arguments> {
+    with VariableUseGenerator {
   final VariableDeclaration variable;
 
   final DartType promotedType;
 
-  KernelVariableUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.variable,
-      this.promotedType)
+  KernelVariableUseGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.variable, this.promotedType)
       : super(helper, token);
 
   @override
   String get plainNameForRead => variable.name;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     var fact = helper.typePromoter
         .getFactForAccess(variable, helper.functionNestingLevel);
     var scope = helper.typePromoter.currentScope;
@@ -287,7 +280,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel);
     var write = variable.isFinal || variable.isConst
         ? makeInvalidWrite(value)
@@ -305,7 +298,7 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
       new VariableAssignmentJudgment(rhs);
 
   @override
@@ -319,7 +312,7 @@
 }
 
 class KernelPropertyAccessGenerator extends KernelGenerator
-    with PropertyAccessGenerator<Expression, Statement, Arguments> {
+    with PropertyAccessGenerator {
   final Expression receiver;
 
   final Name name;
@@ -330,13 +323,8 @@
 
   VariableDeclaration _receiverVariable;
 
-  KernelPropertyAccessGenerator.internal(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.receiver,
-      this.name,
-      this.getter,
-      this.setter)
+  KernelPropertyAccessGenerator.internal(ExpressionGeneratorHelper helper,
+      Token token, this.receiver, this.name, this.getter, this.setter)
       : super(helper, token);
 
   @override
@@ -354,8 +342,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowPropertyAssign(receiver, rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new PropertyAssignmentJudgment(receiver, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -379,7 +367,7 @@
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     var write = new PropertySet(receiver, name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -387,7 +375,7 @@
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     var read = new PropertyGetJudgment(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -396,7 +384,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     var write = new PropertySet(receiverAccess(), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -405,32 +393,28 @@
 
   @override
   Expression _finish(
-      Expression body, ShadowComplexAssignment complexAssignment) {
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
     return super._finish(makeLet(_receiverVariable, body), complexAssignment);
   }
 }
 
 class KernelThisPropertyAccessGenerator extends KernelGenerator
-    with ThisPropertyAccessGenerator<Expression, Statement, Arguments> {
+    with ThisPropertyAccessGenerator {
   final Name name;
 
   final Member getter;
 
   final Member setter;
 
-  KernelThisPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.name,
-      this.getter,
-      this.setter)
+  KernelThisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, this.name, this.getter, this.setter)
       : super(helper, token);
 
   @override
   String get plainNameForRead => name.name;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     if (getter == null) {
       helper.warnUnresolvedGet(name, offsetForToken(token));
     }
@@ -443,7 +427,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (setter == null) {
       helper.warnUnresolvedSet(name, offsetForToken(token));
     }
@@ -471,8 +455,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowPropertyAssign(null, rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new PropertyAssignmentJudgment(null, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -487,7 +471,7 @@
 }
 
 class KernelNullAwarePropertyAccessGenerator extends KernelGenerator
-    with NullAwarePropertyAccessGenerator<Expression, Statement, Arguments> {
+    with NullAwarePropertyAccessGenerator {
   final VariableDeclaration receiver;
 
   final Expression receiverExpression;
@@ -501,7 +485,7 @@
   final DartType type;
 
   KernelNullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       this.receiverExpression,
       this.name,
@@ -517,7 +501,7 @@
   String get plainNameForRead => name.name;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     var read = new PropertyGetJudgment(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -526,7 +510,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     var write = new PropertySet(receiverAccess(), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -535,19 +519,18 @@
 
   @override
   Expression _finish(
-      Expression body, ShadowComplexAssignment complexAssignment) {
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
     var offset = offsetForToken(token);
-    var nullAwareGuard = helper.storeOffset(
-        forest.conditionalExpression(
-            buildIsNull(receiverAccess(), offset, helper),
-            null,
-            helper.storeOffset(forest.literalNull(null), offset),
-            null,
-            body),
-        offset);
+    var nullAwareGuard = forest.conditionalExpression(
+        buildIsNull(receiverAccess(), offset, helper),
+        null,
+        forest.literalNull(null)..fileOffset = offset,
+        null,
+        body)
+      ..fileOffset = offset;
     if (complexAssignment != null) {
       body = makeLet(receiver, nullAwareGuard);
-      ShadowPropertyAssign kernelPropertyAssign = complexAssignment;
+      PropertyAssignmentJudgment kernelPropertyAssign = complexAssignment;
       kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
       kernelPropertyAssign.desugared = body;
       return kernelPropertyAssign;
@@ -563,8 +546,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowPropertyAssign(receiverExpression, rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new PropertyAssignmentJudgment(receiverExpression, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -585,26 +568,22 @@
 }
 
 class KernelSuperPropertyAccessGenerator extends KernelGenerator
-    with SuperPropertyAccessGenerator<Expression, Statement, Arguments> {
+    with SuperPropertyAccessGenerator {
   final Name name;
 
   final Member getter;
 
   final Member setter;
 
-  KernelSuperPropertyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.name,
-      this.getter,
-      this.setter)
+  KernelSuperPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, this.name, this.getter, this.setter)
       : super(helper, token);
 
   @override
   String get plainNameForRead => name.name;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     if (getter == null) {
       helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
     }
@@ -617,7 +596,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (setter == null) {
       helper.warnUnresolvedSet(name, offsetForToken(token), isSuper: true);
     }
@@ -649,8 +628,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowPropertyAssign(null, rhs, isSuper: true);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new PropertyAssignmentJudgment(null, rhs, isSuper: true);
 
   @override
   void printOn(StringSink sink) {
@@ -665,7 +644,7 @@
 }
 
 class KernelIndexedAccessGenerator extends KernelGenerator
-    with IndexedAccessGenerator<Expression, Statement, Arguments> {
+    with IndexedAccessGenerator {
   final Expression receiver;
 
   final Expression index;
@@ -678,13 +657,8 @@
 
   VariableDeclaration indexVariable;
 
-  KernelIndexedAccessGenerator.internal(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.receiver,
-      this.index,
-      this.getter,
-      this.setter)
+  KernelIndexedAccessGenerator.internal(ExpressionGeneratorHelper helper,
+      Token token, this.receiver, this.index, this.getter, this.setter)
       : super(helper, token);
 
   Expression indexAccess() {
@@ -702,7 +676,7 @@
 
   @override
   Expression _makeSimpleRead() {
-    var read = new ShadowMethodInvocation(receiver, indexGetName,
+    var read = new MethodInvocationJudgment(receiver, indexGetName,
         forest.castArguments(forest.arguments(<Expression>[index], token)),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
@@ -711,9 +685,9 @@
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new ShadowMethodInvocation(
+    var write = new MethodInvocationJudgment(
         receiver,
         indexSetName,
         forest
@@ -725,8 +699,8 @@
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    var read = new ShadowMethodInvocation(
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var read = new MethodInvocationJudgment(
         receiverAccess(),
         indexGetName,
         forest.castArguments(
@@ -739,9 +713,9 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new ShadowMethodInvocation(
+    var write = new MethodInvocationJudgment(
         receiverAccess(),
         indexSetName,
         forest.castArguments(
@@ -755,11 +729,11 @@
   // TODO(dmitryas): remove this method after the "[]=" operator of the Context
   // class is made to return a value.
   Expression _makeWriteAndReturn(
-      Expression value, ShadowComplexAssignment complexAssignment) {
+      Expression value, ComplexAssignmentJudgment complexAssignment) {
     // The call to []= does not return the value like direct-style assignments
     // do.  We need to bind the value in a let.
     var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new ShadowMethodInvocation(
+    var write = new MethodInvocationJudgment(
         receiverAccess(),
         indexSetName,
         forest.castArguments(forest.arguments(
@@ -776,7 +750,7 @@
 
   @override
   Expression _finish(
-      Expression body, ShadowComplexAssignment complexAssignment) {
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
     return super._finish(
         makeLet(receiverVariable, makeLet(indexVariable, body)),
         complexAssignment);
@@ -790,8 +764,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowIndexAssign(receiver, index, rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new IndexAssignmentJudgment(receiver, index, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -812,7 +786,7 @@
 }
 
 class KernelThisIndexedAccessGenerator extends KernelGenerator
-    with ThisIndexedAccessGenerator<Expression, Statement, Arguments> {
+    with ThisIndexedAccessGenerator {
   final Expression index;
 
   final Procedure getter;
@@ -821,12 +795,8 @@
 
   VariableDeclaration indexVariable;
 
-  KernelThisIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.index,
-      this.getter,
-      this.setter)
+  KernelThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, this.index, this.getter, this.setter)
       : super(helper, token);
 
   Expression indexAccess() {
@@ -835,9 +805,9 @@
   }
 
   Expression _makeWriteAndReturn(
-      Expression value, ShadowComplexAssignment complexAssignment) {
+      Expression value, ComplexAssignmentJudgment complexAssignment) {
     var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new ShadowMethodInvocation(
+    var write = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexSetName,
         forest.castArguments(forest.arguments(
@@ -853,7 +823,7 @@
 
   @override
   Expression _makeSimpleRead() {
-    return new ShadowMethodInvocation(
+    return new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexGetName,
         forest.castArguments(forest.arguments(<Expression>[index], token)),
@@ -863,9 +833,9 @@
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new ShadowMethodInvocation(
+    var write = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexSetName,
         forest
@@ -877,8 +847,8 @@
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    var read = new ShadowMethodInvocation(
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var read = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexGetName,
         forest.castArguments(
@@ -891,9 +861,9 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new ShadowMethodInvocation(
+    var write = new MethodInvocationJudgment(
         forest.thisExpression(token),
         indexSetName,
         forest.castArguments(
@@ -906,7 +876,7 @@
 
   @override
   Expression _finish(
-      Expression body, ShadowComplexAssignment complexAssignment) {
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
     return super._finish(makeLet(indexVariable, body), complexAssignment);
   }
 
@@ -918,8 +888,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowIndexAssign(null, index, rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new IndexAssignmentJudgment(null, index, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -936,7 +906,7 @@
 }
 
 class KernelSuperIndexedAccessGenerator extends KernelGenerator
-    with SuperIndexedAccessGenerator<Expression, Statement, Arguments> {
+    with SuperIndexedAccessGenerator {
   final Expression index;
 
   final Member getter;
@@ -945,12 +915,8 @@
 
   VariableDeclaration indexVariable;
 
-  KernelSuperIndexedAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.index,
-      this.getter,
-      this.setter)
+  KernelSuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+      Token token, this.index, this.getter, this.setter)
       : super(helper, token);
 
   Expression indexAccess() {
@@ -959,7 +925,7 @@
   }
 
   Expression _makeWriteAndReturn(
-      Expression value, ShadowComplexAssignment complexAssignment) {
+      Expression value, ComplexAssignmentJudgment complexAssignment) {
     var valueVariable = new VariableDeclaration.forValue(value);
     if (setter == null) {
       helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
@@ -985,7 +951,7 @@
           isSuper: true);
     }
     // TODO(ahe): Use [DirectMethodInvocation] when possible.
-    return new ShadowSuperMethodInvocation(
+    return new SuperMethodInvocationJudgment(
         indexGetName,
         forest.castArguments(forest.arguments(<Expression>[index], token)),
         getter)
@@ -994,7 +960,7 @@
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
     if (setter == null) {
       helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
@@ -1011,7 +977,7 @@
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     if (getter == null) {
       helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
           isSuper: true);
@@ -1028,7 +994,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
     if (setter == null) {
       helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
@@ -1046,7 +1012,7 @@
 
   @override
   Expression _finish(
-      Expression body, ShadowComplexAssignment complexAssignment) {
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
     return super._finish(makeLet(indexVariable, body), complexAssignment);
   }
 
@@ -1058,8 +1024,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowIndexAssign(null, index, rhs, isSuper: true);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new IndexAssignmentJudgment(null, index, rhs, isSuper: true);
 
   @override
   void printOn(StringSink sink) {
@@ -1076,17 +1042,14 @@
 }
 
 class KernelStaticAccessGenerator extends KernelGenerator
-    with StaticAccessGenerator<Expression, Statement, Arguments> {
+    with StaticAccessGenerator {
   @override
   final Member readTarget;
 
   final Member writeTarget;
 
-  KernelStaticAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.readTarget,
-      this.writeTarget)
+  KernelStaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.readTarget, this.writeTarget)
       : assert(readTarget != null || writeTarget != null),
         super(helper, token);
 
@@ -1094,7 +1057,7 @@
   String get plainNameForRead => (readTarget ?? writeTarget).name.name;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     if (readTarget == null) {
       return makeInvalidRead();
     } else {
@@ -1106,7 +1069,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     Expression write;
     if (writeTarget == null) {
       write = makeInvalidWrite(value);
@@ -1139,8 +1102,8 @@
   }
 
   @override
-  ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
-      new ShadowStaticAssignment(rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      new StaticAssignmentJudgment(rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -1153,17 +1116,15 @@
 }
 
 class KernelLoadLibraryGenerator extends KernelGenerator
-    with LoadLibraryGenerator<Expression, Statement, Arguments> {
+    with LoadLibraryGenerator {
   final LoadLibraryBuilder builder;
 
   KernelLoadLibraryGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.builder)
+      ExpressionGeneratorHelper helper, Token token, this.builder)
       : super(helper, token);
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     var read =
         helper.makeStaticGet(builder.createTearoffMethod(helper.forest), token);
     complexAssignment?.read = read;
@@ -1172,7 +1133,7 @@
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     Expression write = makeInvalidWrite(value);
     write.fileOffset = offsetForToken(token);
     return write;
@@ -1196,18 +1157,15 @@
 }
 
 class KernelDeferredAccessGenerator extends KernelGenerator
-    with DeferredAccessGenerator<Expression, Statement, Arguments> {
+    with DeferredAccessGenerator {
   @override
   final PrefixBuilder builder;
 
   @override
   final KernelGenerator generator;
 
-  KernelDeferredAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.builder,
-      this.generator)
+  KernelDeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.builder, this.generator)
       : super(helper, token);
 
   @override
@@ -1217,14 +1175,14 @@
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return helper.wrapInDeferredCheck(
         generator._makeRead(complexAssignment), builder, token.charOffset);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return helper.wrapInDeferredCheck(
         generator._makeWrite(value, voidContext, complexAssignment),
         builder,
@@ -1233,7 +1191,7 @@
 }
 
 class KernelTypeUseGenerator extends KernelReadOnlyAccessGenerator
-    with TypeUseGenerator<Expression, Statement, Arguments> {
+    with TypeUseGenerator {
   /// The import prefix preceding the [declaration] reference, or `null` if
   /// the reference is not prefixed.
   @override
@@ -1248,7 +1206,7 @@
   final TypeDeclarationBuilder declaration;
 
   KernelTypeUseGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+      ExpressionGeneratorHelper helper,
       Token token,
       this.prefix,
       this.declarationReferenceOffset,
@@ -1264,7 +1222,7 @@
         KernelInvalidTypeBuilder declaration = this.declaration;
         helper.addProblemErrorIfConst(
             declaration.message.messageObject, offset, token.length);
-        super.expression = new ShadowSyntheticExpression(
+        super.expression = new SyntheticExpressionJudgment(
             new Throw(forest.literalString(declaration.message.message, token))
               ..fileOffset = offset);
       } else {
@@ -1280,8 +1238,8 @@
   Expression makeInvalidWrite(Expression value) {
     return buildThrowNoSuchMethodError(
         forest.literalNull(token),
-        storeOffset(
-            forest.arguments(<Expression>[value], null), value.fileOffset),
+        forest.arguments(<Expression>[value], null)
+          ..fileOffset = value.fileOffset,
         isSetter: true);
   }
 
@@ -1320,8 +1278,8 @@
         } else if (member.isField && !member.isFinal) {
           setter = member;
         }
-        generator = new StaticAccessGenerator<Expression, Statement,
-            Arguments>.fromBuilder(helper, member, send.token, setter);
+        generator = new StaticAccessGenerator.fromBuilder(
+            helper, member, send.token, setter);
       }
 
       return arguments == null
@@ -1340,7 +1298,7 @@
 }
 
 class KernelReadOnlyAccessGenerator extends KernelGenerator
-    with ReadOnlyAccessGenerator<Expression, Statement, Arguments> {
+    with ReadOnlyAccessGenerator {
   @override
   final String plainNameForRead;
 
@@ -1348,25 +1306,22 @@
 
   VariableDeclaration value;
 
-  KernelReadOnlyAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.expression,
-      this.plainNameForRead)
+  KernelReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.expression, this.plainNameForRead)
       : super(helper, token);
 
   @override
   Expression _makeSimpleRead() => expression;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     value ??= new VariableDeclaration.forValue(expression);
     return new VariableGet(value);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     var write = makeInvalidWrite(value);
     complexAssignment?.write = write;
     return write;
@@ -1374,7 +1329,7 @@
 
   @override
   Expression _finish(
-          Expression body, ShadowComplexAssignment complexAssignment) =>
+          Expression body, ComplexAssignmentJudgment complexAssignment) =>
       super._finish(makeLet(value, body), complexAssignment);
 
   @override
@@ -1397,10 +1352,8 @@
 }
 
 class KernelLargeIntAccessGenerator extends KernelGenerator
-    with LargeIntAccessGenerator<Expression, Statement, Arguments> {
-  KernelLargeIntAccessGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token)
+    with LargeIntAccessGenerator {
+  KernelLargeIntAccessGenerator(ExpressionGeneratorHelper helper, Token token)
       : super(helper, token);
 
   @override
@@ -1408,43 +1361,39 @@
 
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return buildError();
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return buildError();
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return buildError();
   }
 }
 
 class KernelUnresolvedNameGenerator extends KernelGenerator
-    with
-        ErroneousExpressionGenerator<Expression, Statement, Arguments>,
-        UnresolvedNameGenerator<Expression, Statement, Arguments> {
+    with ErroneousExpressionGenerator, UnresolvedNameGenerator {
   @override
   final Name name;
 
   KernelUnresolvedNameGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      this.name)
+      ExpressionGeneratorHelper helper, Token token, this.name)
       : super(helper, token);
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 
@@ -1455,8 +1404,7 @@
   }
 }
 
-class KernelUnlinkedGenerator extends KernelGenerator
-    with UnlinkedGenerator<Expression, Statement, Arguments> {
+class KernelUnlinkedGenerator extends KernelGenerator with UnlinkedGenerator {
   @override
   final UnlinkedDeclaration declaration;
 
@@ -1465,22 +1413,20 @@
   final Name name;
 
   KernelUnlinkedGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.declaration)
+      ExpressionGeneratorHelper helper, Token token, this.declaration)
       : name = new Name(declaration.name, helper.library.target),
         receiver = new InvalidExpression(declaration.name)
           ..fileOffset = offsetForToken(token),
         super(helper, token);
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 
@@ -1503,42 +1449,36 @@
 }
 
 abstract class KernelContextAwareGenerator extends KernelGenerator
-    with ContextAwareGenerator<Expression, Statement, Arguments> {
+    with ContextAwareGenerator {
   @override
-  final Generator<Expression, Statement, Arguments> generator;
+  final Generator generator;
 
   KernelContextAwareGenerator(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      this.generator)
+      ExpressionGeneratorHelper helper, Token token, this.generator)
       : super(helper, token);
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 }
 
 class KernelDelayedAssignment extends KernelContextAwareGenerator
-    with DelayedAssignment<Expression, Statement, Arguments> {
+    with DelayedAssignment {
   @override
   final Expression value;
 
   @override
   String assignmentOperator;
 
-  KernelDelayedAssignment(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Generator<Expression, Statement, Arguments> generator,
-      this.value,
-      this.assignmentOperator)
+  KernelDelayedAssignment(ExpressionGeneratorHelper helper, Token token,
+      Generator generator, this.value, this.assignmentOperator)
       : super(helper, token, generator);
 
   @override
@@ -1551,19 +1491,15 @@
 }
 
 class KernelDelayedPostfixIncrement extends KernelContextAwareGenerator
-    with DelayedPostfixIncrement<Expression, Statement, Arguments> {
+    with DelayedPostfixIncrement {
   @override
   final Name binaryOperator;
 
   @override
   final Procedure interfaceTarget;
 
-  KernelDelayedPostfixIncrement(
-      ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
-      Token token,
-      Generator<Expression, Statement, Arguments> generator,
-      this.binaryOperator,
-      this.interfaceTarget)
+  KernelDelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
+      Generator generator, this.binaryOperator, this.interfaceTarget)
       : super(helper, token, generator);
 }
 
@@ -1572,28 +1508,23 @@
   return new Let(variable, body);
 }
 
-Expression makeBinary(
-    Expression left,
-    Name operator,
-    Procedure interfaceTarget,
-    Expression right,
-    ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+Expression makeBinary(Expression left, Name operator, Procedure interfaceTarget,
+    Expression right, ExpressionGeneratorHelper helper,
     {int offset: TreeNode.noOffset}) {
-  return new ShadowMethodInvocation(
+  return new MethodInvocationJudgment(
       left,
       operator,
-      helper.storeOffset(
-          helper.forest.castArguments(
-              helper.forest.arguments(<Expression>[right], null)),
-          offset),
+      helper.forest
+          .castArguments(helper.forest.arguments(<Expression>[right], null))
+            ..fileOffset = offset,
       interfaceTarget: interfaceTarget)
     ..fileOffset = offset;
 }
 
-Expression buildIsNull(Expression value, int offset,
-    ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper) {
+Expression buildIsNull(
+    Expression value, int offset, ExpressionGeneratorHelper helper) {
   return makeBinary(value, equalsName, null,
-      helper.storeOffset(helper.forest.literalNull(null), offset), helper,
+      helper.forest.literalNull(null)..fileOffset = offset, helper,
       offset: offset);
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index 1acf3cd..ea1c5b0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -21,9 +21,7 @@
   final bool isSuper;
 
   ThisAccessGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      this.isInitializer,
+      ExpressionGeneratorHelper helper, Token token, this.isInitializer,
       {this.isSuper: false})
       : super(helper, token);
 
@@ -80,11 +78,11 @@
       Member setter =
           helper.lookupInstanceMember(name, isSuper: isSuper, isSetter: true);
       if (isSuper) {
-        return new SuperPropertyAccessGenerator<Expression, Statement,
-            Arguments>(helper, send.token, name, getter, setter);
+        return new SuperPropertyAccessGenerator(
+            helper, send.token, name, getter, setter);
       } else {
-        return new ThisPropertyAccessGenerator<Expression, Statement,
-            Arguments>(helper, send.token, name, getter, setter);
+        return new ThisPropertyAccessGenerator(
+            helper, send.token, name, getter, setter);
       }
     }
   }
@@ -111,14 +109,12 @@
           constructor.function, arguments, offset, <TypeParameter>[]);
     }
     if (constructor == null || argMessage != null) {
-      return helper.buildInvalidInitializer(
-          buildThrowNoSuchMethodError(
-              storeOffset(forest.literalNull(null), offset), arguments,
-              isSuper: isSuper,
-              name: name.name,
-              offset: offset,
-              argMessage: argMessage),
-          offset);
+      return helper.buildInvalidInitializer(buildThrowNoSuchMethodError(
+          forest.literalNull(null)..fileOffset = offset, arguments,
+          isSuper: isSuper,
+          name: name.name,
+          offset: offset,
+          argMessage: argMessage));
     } else if (isSuper) {
       return helper.buildSuperInitializer(
           false, constructor, arguments, offset);
@@ -167,13 +163,13 @@
   }
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 
@@ -190,9 +186,7 @@
   final Name name;
 
   IncompleteSendGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      this.name)
+      ExpressionGeneratorHelper helper, Token token, this.name)
       : super(helper, token);
 
   withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
@@ -200,13 +194,13 @@
   Arguments get arguments => null;
 
   @override
-  Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   Expression _makeWrite(Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
+      ComplexAssignmentJudgment complexAssignment) {
     return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 
@@ -218,13 +212,11 @@
 }
 
 class IncompleteErrorGenerator extends IncompleteSendGenerator
-    with ErroneousExpressionGenerator<Expression, Statement, Arguments> {
+    with ErroneousExpressionGenerator {
   final Message message;
 
   IncompleteErrorGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      this.message)
+      ExpressionGeneratorHelper helper, Token token, this.message)
       : super(helper, token, null);
 
   String get debugName => "IncompleteErrorGenerator";
@@ -266,10 +258,7 @@
   final Arguments arguments;
 
   SendAccessGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      Name name,
-      this.arguments)
+      ExpressionGeneratorHelper helper, Token token, Name name, this.arguments)
       : super(helper, token, name) {
     assert(arguments != null);
   }
@@ -353,9 +342,7 @@
 
 class IncompletePropertyAccessGenerator extends IncompleteSendGenerator {
   IncompletePropertyAccessGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      Name name)
+      ExpressionGeneratorHelper helper, Token token, Name name)
       : super(helper, token, name);
 
   String get plainNameForRead => name.name;
@@ -386,7 +373,7 @@
           isQualified: true, prefix: prefix);
     }
 
-    return PropertyAccessGenerator.make<Expression, Statement, Arguments>(
+    return PropertyAccessGenerator.make(
         helper, token, helper.toValue(receiver), name, null, null, isNullAware);
   }
 
@@ -424,9 +411,7 @@
 
 class ParenthesizedExpressionGenerator extends KernelReadOnlyAccessGenerator {
   ParenthesizedExpressionGenerator(
-      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
-      Token token,
-      Expression expression)
+      ExpressionGeneratorHelper helper, Token token, Expression expression)
       : super(helper, token, expression, null);
 
   String get debugName => "ParenthesizedExpressionGenerator";
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
index 96f72a9..33c6f13 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
@@ -11,15 +11,22 @@
         Expression,
         FunctionType,
         Initializer,
+        LabeledStatement,
         Node,
-        Statement;
+        Statement,
+        SwitchCase,
+        VariableDeclaration;
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
 import 'factory.dart' show Factory;
 
 import 'kernel_shadow_ast.dart'
-    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+    show
+        ExpressionJudgment,
+        InitializerJudgment,
+        StatementJudgment,
+        SwitchCaseJudgment;
 
 /// Implementation of [Factory] that builds source code into a kernel
 /// representation.
@@ -82,8 +89,13 @@
   }
 
   @override
-  Statement breakStatement(StatementJudgment judgment, int fileOffset,
-      Token breakKeyword, Expression label, Token semicolon) {
+  Statement breakStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token breakKeyword,
+      Expression label,
+      Token semicolon,
+      covariant LabeledStatement labelBinder) {
     return judgment;
   }
 
@@ -107,9 +119,9 @@
       Token rightParenthesis,
       Statement body,
       DartType guardType,
-      int exceptionOffset,
+      covariant VariableDeclaration exceptionBinder,
       DartType exceptionType,
-      int stackTraceOffset,
+      covariant VariableDeclaration stackTraceBinder,
       DartType stackTraceType) {
     return judgment;
   }
@@ -134,14 +146,24 @@
   }
 
   @override
-  Statement continueStatement(StatementJudgment judgment, int fileOffset,
-      Token continueKeyword, Expression label, Token semicolon) {
+  Statement continueStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token continueKeyword,
+      Expression label,
+      Token semicolon,
+      covariant LabeledStatement labelBinder) {
     return judgment;
   }
 
   @override
-  Statement continueSwitchStatement(StatementJudgment judgment, int fileOffset,
-      Token continueKeyword, Expression label, Token semicolon) {
+  Statement continueSwitchStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token continueKeyword,
+      Expression label,
+      Token semicolon,
+      covariant LabeledStatement labelBinder) {
     return judgment;
   }
 
@@ -172,6 +194,11 @@
   }
 
   @override
+  Statement emptyStatement(Token semicolon) {
+    return null;
+  }
+
+  @override
   Statement expressionStatement(StatementJudgment judgment, int fileOffset,
       Expression expression, Token semicolon) {
     return judgment;
@@ -194,8 +221,17 @@
   Statement forInStatement(
       StatementJudgment judgment,
       int fileOffset,
-      int variableOffset,
-      DartType variableType,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      Object loopVariable,
+      Token identifier,
+      Token inKeyword,
+      Expression iterator,
+      Token rightParenthesis,
+      Statement body,
+      covariant Object loopVariableBinder,
+      DartType loopVariableType,
       int writeOffset,
       DartType writeVariableType,
       int writeVariableDeclarationOffset,
@@ -204,13 +240,31 @@
   }
 
   @override
-  Statement forStatement(StatementJudgment judgment, int fileOffset) {
+  Statement forStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token forKeyword,
+      Token leftParenthesis,
+      Object variableDeclarationList,
+      Expression initialization,
+      Token leftSeparator,
+      Expression condition,
+      Token rightSeparator,
+      List<Expression> updaters,
+      Token rightParenthesis,
+      Statement body) {
     return judgment;
   }
 
   @override
   Statement functionDeclaration(
-      StatementJudgment judgment, int fileOffset, FunctionType inferredType) {
+      covariant VariableDeclaration binder, FunctionType inferredType) {
+    return binder;
+  }
+
+  @override
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
     return judgment;
   }
 
@@ -288,13 +342,31 @@
   }
 
   @override
-  Statement labeledStatement(StatementJudgment judgment, int fileOffset) {
+  Statement labeledStatement(List<Object> labels, Statement statement) {
+    return labels[0];
+  }
+
+  Object statementLabel(
+      covariant StatementJudgment binder, Token label, Token colon) {
+    return binder;
+  }
+
+  @override
+  Object binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {
     return judgment;
   }
 
   @override
   Expression listLiteral(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token constKeyword,
+      Object typeArguments,
+      Token leftBracket,
+      List<Expression> elements,
+      Token rightBracket,
+      DartType inferredType) {
     return judgment;
   }
 
@@ -311,7 +383,20 @@
 
   @override
   Expression mapLiteral(
-      ExpressionJudgment judgment, int fileOffset, DartType typeContext) {
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token constKeyword,
+      Object typeArguments,
+      Token leftBracket,
+      List<Object> entries,
+      Token rightBracket,
+      DartType inferredType) {
+    return judgment;
+  }
+
+  @override
+  Object mapLiteralEntry(Object judgment, int fileOffset, Expression key,
+      Token separator, Expression value) {
     return judgment;
   }
 
@@ -341,8 +426,8 @@
   }
 
   @override
-  Expression namedFunctionExpression(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+  Expression namedFunctionExpression(ExpressionJudgment judgment,
+      covariant VariableDeclaration binder, DartType inferredType) {
     return judgment;
   }
 
@@ -469,8 +554,37 @@
     return judgment;
   }
 
+  SwitchCase switchCase(
+      SwitchCaseJudgment judgment,
+      List<Object> labels,
+      Token keyword,
+      Expression expression,
+      Token colon,
+      List<Statement> statements) {
+    return judgment;
+  }
+
+  SwitchCase switchLabel(
+      covariant SwitchCase binder, Token label, Token colon) {
+    return binder;
+  }
+
+  SwitchCase binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {
+    return judgment;
+  }
+
   @override
-  Statement switchStatement(StatementJudgment judgment, int fileOffset) {
+  Statement switchStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token switchKeyword,
+      Token leftParenthesis,
+      Expression expression,
+      Token rightParenthesis,
+      Token leftBracket,
+      List<Object> members,
+      Token rightBracket) {
     return judgment;
   }
 
@@ -503,7 +617,14 @@
   }
 
   @override
-  Statement tryFinally(StatementJudgment judgment, int fileOffset) {
+  Statement tryFinally(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token tryKeyword,
+      Statement body,
+      List<Object> catchClauses,
+      Token finallyKeyword,
+      Statement finallyBlock) {
     return judgment;
   }
 
@@ -525,8 +646,14 @@
   }
 
   @override
-  Statement variableDeclaration(StatementJudgment judgment, int fileOffset,
+  Statement variableDeclaration(covariant VariableDeclaration binder,
       DartType statementType, DartType inferredType) {
+    return binder;
+  }
+
+  @override
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {
     return judgment;
   }
 
@@ -535,18 +662,12 @@
       ExpressionJudgment judgment,
       int fileOffset,
       bool isInCascade,
-      int expressionVariableDeclarationOffset,
+      covariant VariableDeclaration variableBinder,
       DartType inferredType) {
     return judgment;
   }
 
   @override
-  Expression variableSet(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
-    return judgment;
-  }
-
-  @override
   Statement whileStatement(
       StatementJudgment judgment,
       int fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 1e5c95a..cc5a316 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -33,6 +33,7 @@
 
 import '../fasta_codes.dart'
     show
+        LocatedMessage,
         Message,
         messageConflictsWithTypeVariableCause,
         messageTypeVariableDuplicatedName,
@@ -99,6 +100,7 @@
         QualifiedName,
         Scope,
         TypeBuilder,
+        TypeDeclarationBuilder,
         TypeVariableBuilder,
         UnresolvedType,
         VoidTypeBuilder,
@@ -107,7 +109,11 @@
 
 import 'metadata_collector.dart';
 
-import 'type_algorithms.dart' show calculateBounds;
+import 'type_algorithms.dart'
+    show
+        calculateBounds,
+        getNonSimplicityIssuesForDeclaration,
+        getNonSimplicityIssuesForTypeVariables;
 
 class KernelLibraryBuilder
     extends SourceLibraryBuilder<KernelTypeBuilder, Library> {
@@ -180,6 +186,7 @@
       List<TypeVariableBuilder> typeVariables,
       KernelTypeBuilder supertype,
       List<KernelTypeBuilder> interfaces,
+      int startCharOffset,
       int charOffset,
       int charEndOffset,
       int supertypeOffset) {
@@ -211,6 +218,7 @@
         constructorScope,
         this,
         new List<ConstructorReferenceBuilder>.from(constructorReferences),
+        startCharOffset,
         charOffset,
         charEndOffset);
     loader.target.metadataCollector
@@ -441,6 +449,10 @@
             }
           }
         }
+        final int startCharOffset =
+            (isNamedMixinApplication ? metadata : null) == null
+                ? charOffset
+                : metadata.first.charOffset;
         SourceClassBuilder application = new SourceClassBuilder(
             isNamedMixinApplication ? metadata : null,
             isNamedMixinApplication
@@ -457,6 +469,7 @@
                 isModifiable: false),
             this,
             <ConstructorReferenceBuilder>[],
+            startCharOffset,
             charOffset,
             TreeNode.noOffset,
             null,
@@ -527,6 +540,7 @@
       String constructorName,
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
@@ -540,6 +554,7 @@
         typeVariables,
         formals,
         this,
+        startCharOffset,
         charOffset,
         charOpenParenOffset,
         charEndOffset,
@@ -563,6 +578,7 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       ProcedureKind kind,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
@@ -578,6 +594,7 @@
         formals,
         kind,
         this,
+        startCharOffset,
         charOffset,
         charOpenParenOffset,
         charEndOffset,
@@ -598,6 +615,7 @@
       Object name,
       List<FormalParameterBuilder> formals,
       ConstructorReferenceBuilder redirectionTarget,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
@@ -630,6 +648,7 @@
               factoryDeclaration),
           formals,
           this,
+          startCharOffset,
           charOffset,
           charOpenParenOffset,
           charEndOffset,
@@ -647,6 +666,7 @@
           formals,
           ProcedureKind.Factory,
           this,
+          startCharOffset,
           charOffset,
           charOpenParenOffset,
           charEndOffset,
@@ -1023,32 +1043,79 @@
   int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
       ClassBuilder objectClass) {
     int count = 0;
-    bool strongMode = loader.target.strongMode;
 
-    int computeDefaultTypesForVariables(List<TypeVariableBuilder> variables) {
+    int computeDefaultTypesForVariables(
+        List<TypeVariableBuilder<TypeBuilder, Object>> variables,
+        bool strongMode) {
       if (variables == null) return 0;
-      List<KernelTypeBuilder> calculatedBounds = strongMode
-          ? calculateBounds(variables, dynamicType, bottomType, objectClass)
-          : null;
-      for (int i = 0; i < variables.length; ++i) {
-        variables[i].defaultType =
-            strongMode ? calculatedBounds[i] : dynamicType;
+
+      if (strongMode) {
+        List<KernelTypeBuilder> calculatedBounds =
+            calculateBounds(variables, dynamicType, bottomType, objectClass);
+        for (int i = 0; i < variables.length; ++i) {
+          variables[i].defaultType = calculatedBounds[i];
+        }
+      } else {
+        // In Dart 1, put `dynamic` everywhere.
+        for (int i = 0; i < variables.length; ++i) {
+          variables[i].defaultType = dynamicType;
+        }
       }
+
       return variables.length;
     }
 
+    void reportIssues(List<Object> issues) {
+      for (int i = 0; i < issues.length; i += 3) {
+        TypeDeclarationBuilder<TypeBuilder, Object> declaration = issues[i];
+        Message message = issues[i + 1];
+        List<LocatedMessage> context = issues[i + 2];
+
+        addProblem(message, declaration.charOffset, declaration.name.length,
+            declaration.fileUri,
+            context: context);
+      }
+    }
+
+    bool strongMode = loader.target.strongMode;
     for (var declaration in libraryDeclaration.members.values) {
       if (declaration is KernelClassBuilder) {
-        count += computeDefaultTypesForVariables(declaration.typeVariables);
+        {
+          List<Object> issues = strongMode
+              ? getNonSimplicityIssuesForDeclaration(declaration)
+              : const <Object>[];
+          reportIssues(issues);
+          // In case of issues, use non-strong mode for error recovery.
+          count += computeDefaultTypesForVariables(
+              declaration.typeVariables, strongMode && issues.length == 0);
+        }
         declaration.forEach((String name, Declaration member) {
           if (member is KernelProcedureBuilder) {
-            count += computeDefaultTypesForVariables(member.typeVariables);
+            List<Object> issues = strongMode
+                ? getNonSimplicityIssuesForTypeVariables(member.typeVariables)
+                : const <Object>[];
+            reportIssues(issues);
+            // In case of issues, use non-strong mode for error recovery.
+            count += computeDefaultTypesForVariables(
+                member.typeVariables, strongMode && issues.length == 0);
           }
         });
       } else if (declaration is KernelFunctionTypeAliasBuilder) {
-        count += computeDefaultTypesForVariables(declaration.typeVariables);
+        List<Object> issues = strongMode
+            ? getNonSimplicityIssuesForDeclaration(declaration)
+            : const <Object>[];
+        reportIssues(issues);
+        // In case of issues, use non-strong mode for error recovery.
+        count += computeDefaultTypesForVariables(
+            declaration.typeVariables, strongMode && issues.length == 0);
       } else if (declaration is KernelFunctionBuilder) {
-        count += computeDefaultTypesForVariables(declaration.typeVariables);
+        List<Object> issues = strongMode
+            ? getNonSimplicityIssuesForTypeVariables(declaration.typeVariables)
+            : const <Object>[];
+        reportIssues(issues);
+        // In case of issues, use non-strong mode for error recovery.
+        count += computeDefaultTypesForVariables(
+            declaration.typeVariables, strongMode && issues.length == 0);
       }
     }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index b09e032..0115101 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -271,12 +271,14 @@
       List<FormalParameterBuilder> formals,
       ProcedureKind kind,
       KernelLibraryBuilder compilationUnit,
+      int startCharOffset,
       int charOffset,
       this.charOpenParenOffset,
       int charEndOffset,
       [String nativeMethodName])
       : procedure = new ShadowProcedure(null, kind, null, returnType == null,
             fileUri: compilationUnit?.fileUri)
+          ..startFileOffset = startCharOffset
           ..fileOffset = charOffset
           ..fileEndOffset = charEndOffset,
         super(metadata, modifiers, returnType, name, typeVariables, formals,
@@ -367,6 +369,7 @@
     // TODO(ahe): restore file-offset once we track both origin and patch file
     // URIs. See https://github.com/dart-lang/sdk/issues/31579
     origin.procedure.fileUri = fileUri;
+    origin.procedure.startFileOffset = procedure.startFileOffset;
     origin.procedure.fileOffset = procedure.fileOffset;
     origin.procedure.fileEndOffset = procedure.fileEndOffset;
     origin.procedure.annotations
@@ -420,11 +423,13 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       KernelLibraryBuilder compilationUnit,
+      int startCharOffset,
       int charOffset,
       this.charOpenParenOffset,
       int charEndOffset,
       [String nativeMethodName])
       : constructor = new Constructor(null, fileUri: compilationUnit?.fileUri)
+          ..startFileOffset = startCharOffset
           ..fileOffset = charOffset
           ..fileEndOffset = charEndOffset,
         super(metadata, modifiers, returnType, name, typeVariables, formals,
@@ -555,6 +560,7 @@
     // TODO(ahe): restore file-offset once we track both origin and patch file
     // URIs. See https://github.com/dart-lang/sdk/issues/31579
     origin.constructor.fileUri = fileUri;
+    origin.constructor.startFileOffset = constructor.startFileOffset;
     origin.constructor.fileOffset = constructor.fileOffset;
     origin.constructor.fileEndOffset = constructor.fileEndOffset;
     origin.constructor.annotations
@@ -598,6 +604,7 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       KernelLibraryBuilder compilationUnit,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
@@ -612,6 +619,7 @@
             formals,
             ProcedureKind.Factory,
             compilationUnit,
+            startCharOffset,
             charOffset,
             charOpenParenOffset,
             charEndOffset,
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 a9b13d6..c4b13df 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
@@ -20,6 +20,8 @@
 
 import 'dart:core' hide MapEntry;
 
+import 'package:front_end/src/scanner/token.dart' show Token;
+
 import 'package:kernel/ast.dart' as kernel show Expression, Initializer;
 
 import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
@@ -59,7 +61,11 @@
         TypeInferenceEngine;
 
 import '../type_inference/type_inferrer.dart'
-    show TypeInferrer, TypeInferrerDisabled, TypeInferrerImpl;
+    show
+        ExpressionInferenceResult,
+        TypeInferrer,
+        TypeInferrerDisabled,
+        TypeInferrerImpl;
 
 import '../type_inference/type_inference_listener.dart'
     show TypeInferenceListener;
@@ -157,28 +163,39 @@
 
 /// Shadow object for [AsExpression].
 class AsJudgment extends AsExpression implements ExpressionJudgment {
+  final Token asOperator;
+
   DartType inferredType;
 
-  AsJudgment(Expression operand, DartType type) : super(operand, type);
+  AsJudgment(Expression operand, this.asOperator, DartType type)
+      : super(operand, type);
 
   ExpressionJudgment get judgment => operand;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
     inferredType = type;
-    inferrer.listener.asExpression(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .asExpression(this, fileOffset, null, asOperator, null, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing an assert initializer in kernel form.
 class AssertInitializerJudgment extends AssertInitializer
     implements InitializerJudgment {
-  AssertInitializerJudgment(AssertStatement statement) : super(statement);
+  final Token assertKeyword;
+  final Token leftParenthesis;
+  final Token comma;
+  final Token rightParenthesis;
+
+  AssertInitializerJudgment(AssertStatement statement, this.assertKeyword,
+      this.leftParenthesis, this.comma, this.rightParenthesis)
+      : super(statement);
 
   AssertStatementJudgment get judgment => statement;
 
@@ -187,14 +204,22 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     inferrer.inferStatement(factory, judgment);
-    inferrer.listener.assertInitializer(this, fileOffset);
+    inferrer.listener.assertInitializer(this, fileOffset, assertKeyword,
+        leftParenthesis, null, comma, null, rightParenthesis);
   }
 }
 
 /// Concrete shadow object representing an assertion statement in kernel form.
 class AssertStatementJudgment extends AssertStatement
     implements StatementJudgment {
-  AssertStatementJudgment(Expression condition,
+  final Token assertKeyword;
+  final Token leftParenthesis;
+  final Token comma;
+  final Token rightParenthesis;
+  final Token semicolon;
+
+  AssertStatementJudgment(this.assertKeyword, this.leftParenthesis,
+      Expression condition, this.comma, this.rightParenthesis, this.semicolon,
       {Expression message, int conditionStartOffset, int conditionEndOffset})
       : super(condition,
             message: message,
@@ -220,20 +245,23 @@
       inferrer.inferExpression(
           factory, messageJudgment, const UnknownType(), false);
     }
-    inferrer.listener.assertStatement(this, fileOffset);
+    inferrer.listener.assertStatement(this, fileOffset, assertKeyword,
+        leftParenthesis, null, comma, null, rightParenthesis, semicolon);
   }
 }
 
 /// Shadow object for [AwaitExpression].
 class AwaitJudgment extends AwaitExpression implements ExpressionJudgment {
+  final Token awaitKeyword;
+
   DartType inferredType;
 
-  AwaitJudgment(Expression operand) : super(operand);
+  AwaitJudgment(this.awaitKeyword, Expression operand) : super(operand);
 
   ExpressionJudgment get judgment => operand;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -244,14 +272,19 @@
     inferrer.inferExpression(factory, judgment, typeContext, true);
     inferredType =
         inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
-    inferrer.listener.awaitExpression(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .awaitExpression(this, fileOffset, awaitKeyword, null, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing a statement block in kernel form.
 class BlockJudgment extends Block implements StatementJudgment {
-  BlockJudgment(List<Statement> statements) : super(statements);
+  final Token leftBracket;
+  final Token rightBracket;
+
+  BlockJudgment(this.leftBracket, List<Statement> statements, this.rightBracket)
+      : super(statements);
 
   List<Statement> get judgments => statements;
 
@@ -262,49 +295,68 @@
     for (var judgment in judgments) {
       inferrer.inferStatement(factory, judgment);
     }
-    inferrer.listener.block(this, fileOffset);
+    inferrer.listener.block(this, fileOffset, leftBracket, null, rightBracket);
   }
 }
 
 /// Concrete shadow object representing a boolean literal in kernel form.
 class BoolJudgment extends BoolLiteral implements ExpressionJudgment {
+  final Token literal;
+
   DartType inferredType;
 
-  BoolJudgment(bool value) : super(value);
+  BoolJudgment(this.literal, bool value) : super(value);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferredType = inferrer.coreTypes.boolClass.rawType;
-    inferrer.listener.boolLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .boolLiteral(this, fileOffset, literal, value, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing a break statement in kernel form.
 class BreakJudgment extends BreakStatement implements StatementJudgment {
-  BreakJudgment(LabeledStatement target) : super(target);
+  final Token breakKeyword;
+  final Token semicolon;
+
+  BreakJudgment(this.breakKeyword, LabeledStatement target, this.semicolon)
+      : super(target);
+
+  LabeledStatementJudgment get targetJudgment => target;
 
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     // No inference needs to be done.
+    inferrer.listener.breakStatement(this, fileOffset, breakKeyword, null,
+        semicolon, targetJudgment?.createBinder(inferrer));
   }
 }
 
 /// Concrete shadow object representing a continue statement in kernel form.
 class ContinueJudgment extends BreakStatement implements StatementJudgment {
-  ContinueJudgment(LabeledStatement target) : super(target);
+  final Token continueKeyword;
+  final Token semicolon;
+
+  ContinueJudgment(
+      this.continueKeyword, LabeledStatement target, this.semicolon)
+      : super(target);
+
+  LabeledStatementJudgment get targetJudgment => target;
 
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     // No inference needs to be done.
-    inferrer.listener.breakStatement(this, fileOffset);
+    inferrer.listener.continueStatement(this, fileOffset, continueKeyword, null,
+        semicolon, targetJudgment?.createBinder(inferrer));
   }
 }
 
@@ -322,21 +374,21 @@
 /// variable"--this is the variable that remembers the value of the expression
 /// preceding the first `..` while the cascades are being evaluated.
 ///
-/// After constructing a [ShadowCascadeExpression], the caller should
+/// After constructing a [CascadeJudgment], the caller should
 /// call [finalize] with an expression representing the expression after the
 /// `..`.  If a further `..` follows that expression, the caller should call
 /// [extend] followed by [finalize] for each subsequent cascade.
-class ShadowCascadeExpression extends Let implements ExpressionJudgment {
+class CascadeJudgment extends Let implements ExpressionJudgment {
   DartType inferredType;
 
   /// Pointer to the last "let" expression in the cascade.
   Let nextCascade;
 
-  /// Creates a [ShadowCascadeExpression] using [variable] as the cascade
+  /// Creates a [CascadeJudgment] using [variable] as the cascade
   /// variable.  Caller is responsible for ensuring that [variable]'s
   /// initializer is the expression preceding the first `..` of the cascade
   /// expression.
-  ShadowCascadeExpression(VariableDeclarationJudgment variable)
+  CascadeJudgment(VariableDeclarationJudgment variable)
       : super(
             variable,
             makeLet(new VariableDeclaration.forValue(new _UnfinishedCascade()),
@@ -344,6 +396,17 @@
     nextCascade = body;
   }
 
+  ExpressionJudgment get targetJudgment => variable.initializer;
+
+  Iterable<ExpressionJudgment> get cascadeJudgments sync* {
+    Let section = body;
+    while (true) {
+      yield section.variable.initializer;
+      if (section.body is! Let) break;
+      section = section.body;
+    }
+  }
+
   /// Adds a new unfinalized section to the end of the cascade.  Should be
   /// called after the previous cascade section has been finalized.
   void extend() {
@@ -364,24 +427,20 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var lhsType = inferrer.inferExpression(
-        factory, variable.initializer, typeContext, true);
+    inferredType =
+        inferrer.inferExpression(factory, targetJudgment, typeContext, true);
     if (inferrer.strongMode) {
-      variable.type = lhsType;
+      variable.type = inferredType;
     }
-    Let section = body;
-    while (true) {
-      inferrer.inferExpression(
-          factory, section.variable.initializer, const UnknownType(), false);
-      if (section.body is! Let) break;
-      section = section.body;
+    for (var judgment in cascadeJudgments) {
+      inferrer.inferExpression(factory, judgment, const UnknownType(), false);
     }
-    inferrer.listener.cascadeExpression(this, fileOffset, lhsType);
-    return lhsType;
+    inferrer.listener.cascadeExpression(this, fileOffset, inferredType);
+    return null;
   }
 }
 
@@ -445,13 +504,13 @@
 ///
 /// TODO(paulberry): once we know exactly what constitutes a "complex
 /// assignment", document it here.
-abstract class ShadowComplexAssignment extends ShadowSyntheticExpression {
+abstract class ComplexAssignmentJudgment extends SyntheticExpressionJudgment {
   /// In a compound assignment, the expression that reads the old value, or
   /// `null` if this is not a compound assignment.
   Expression read;
 
   /// The expression appearing on the RHS of the assignment.
-  final Expression rhs;
+  final ExpressionJudgment rhs;
 
   /// The expression that performs the write (e.g. `a.[]=(b, a.[](b) + 1)` in
   /// `++a[b]`).
@@ -480,7 +539,7 @@
   /// pre-decrement.
   bool isPreIncDec = false;
 
-  ShadowComplexAssignment(this.rhs) : super(null);
+  ComplexAssignmentJudgment(this.rhs) : super(null);
 
   String toString() {
     var parts = _getToStringParts();
@@ -535,8 +594,8 @@
         assert(identical(combiner.arguments.positional.first, rhs));
         // Analyzer uses a null context for the RHS here.
         // TODO(paulberry): improve on this.
-        rhsType =
-            inferrer.inferExpression(factory, rhs, const UnknownType(), true);
+        inferrer.inferExpression(factory, rhs, const UnknownType(), true);
+        rhsType = rhs.inferredType;
         // Do not use rhs after this point because it may be a Shadow node
         // that has been replaced in the tree with its desugaring.
         var expectedType = getPositionalParameterType(combinerType, 0);
@@ -566,8 +625,9 @@
       }
       _storeLetType(inferrer, replacedCombiner, combinedType);
     } else {
-      var rhsType = inferrer.inferExpression(
+      inferrer.inferExpression(
           factory, rhs, writeContext ?? const UnknownType(), true);
+      var rhsType = rhs.inferredType;
       var replacedRhs =
           inferrer.ensureAssignable(writeContext, rhsType, rhs, writeOffset);
       _storeLetType(inferrer, replacedRhs ?? rhs, rhsType);
@@ -588,28 +648,29 @@
         combinedType = rhsType;
       }
     }
-    if (this is ShadowIndexAssign) {
+    if (this is IndexAssignmentJudgment) {
       _storeLetType(inferrer, write, const VoidType());
     } else {
       _storeLetType(inferrer, write, combinedType);
     }
-    return new _ComplexAssignmentInferenceResult(combinerMember,
-        isPostIncDec ? (readType ?? const DynamicType()) : combinedType);
+    inferredType =
+        isPostIncDec ? (readType ?? const DynamicType()) : combinedType;
+    return new _ComplexAssignmentInferenceResult(combinerMember);
   }
 }
 
 /// Abstract shadow object representing a complex assignment involving a
 /// receiver.
-abstract class ShadowComplexAssignmentWithReceiver
-    extends ShadowComplexAssignment {
+abstract class ComplexAssignmentJudgmentWithReceiver
+    extends ComplexAssignmentJudgment {
   /// The receiver of the assignment target (e.g. `a` in `a[b] = c`).
-  final Expression receiver;
+  final ExpressionJudgment receiver;
 
   /// Indicates whether this assignment uses `super`.
   final bool isSuper;
 
-  ShadowComplexAssignmentWithReceiver(
-      this.receiver, Expression rhs, this.isSuper)
+  ComplexAssignmentJudgmentWithReceiver(
+      this.receiver, ExpressionJudgment rhs, this.isSuper)
       : super(rhs);
 
   @override
@@ -624,8 +685,8 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     if (receiver != null) {
-      var receiverType = inferrer.inferExpression(
-          factory, receiver, const UnknownType(), true);
+      inferrer.inferExpression(factory, receiver, const UnknownType(), true);
+      var receiverType = receiver.inferredType;
       _storeLetType(inferrer, receiver, receiverType);
       return receiverType;
     } else if (isSuper) {
@@ -641,6 +702,9 @@
 /// Shadow object for [ConditionalExpression].
 class ConditionalJudgment extends ConditionalExpression
     implements ExpressionJudgment {
+  final Token question;
+  final Token colon;
+
   DartType inferredType;
 
   ExpressionJudgment get conditionJudgment => condition;
@@ -649,12 +713,12 @@
 
   ExpressionJudgment get otherwiseJudgment => otherwise;
 
-  ConditionalJudgment(
-      Expression condition, Expression then, Expression otherwise)
+  ConditionalJudgment(Expression condition, this.question, Expression then,
+      this.colon, Expression otherwise)
       : super(condition, then, otherwise, null);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -676,13 +740,14 @@
     if (inferrer.strongMode) {
       staticType = inferredType;
     }
-    inferrer.listener.conditionalExpression(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener.conditionalExpression(
+        this, fileOffset, null, question, null, colon, null, inferredType);
+    return null;
   }
 }
 
 /// Shadow object for [ConstructorInvocation].
-class ShadowConstructorInvocation extends ConstructorInvocation
+class ConstructorInvocationJudgment extends ConstructorInvocation
     implements ExpressionJudgment {
   DartType inferredType;
 
@@ -704,13 +769,15 @@
   /// [targetTypeArguments] is a list containing the type `List<T>`.
   final List<DartType> targetTypeArguments;
 
-  ShadowConstructorInvocation(Constructor target, this.targetTypeArguments,
-      this._initialTarget, Arguments arguments,
+  ConstructorInvocationJudgment(Constructor target, this.targetTypeArguments,
+      this._initialTarget, ArgumentsJudgment arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -744,14 +811,16 @@
       }
       inferrer.engine.beingInferred.remove(target);
     }
-    var inferredType = inferrer.inferInvocation(
+    var inferenceResult = inferrer.inferInvocation(
         factory,
         typeContext,
         fileOffset,
         _initialTarget.function.functionType,
         computeConstructorReturnType(_initialTarget),
-        arguments,
+        argumentJudgments,
         isConst: isConst);
+    var inferredType = inferenceResult.type;
+    this.inferredType = inferredType;
     if (inferrer.strongMode &&
         !inferrer.isTopLevel &&
         inferrer.typeSchemaEnvironment.isSuperBounded(inferredType)) {
@@ -788,15 +857,15 @@
       }
     }
 
-    return inferredType;
+    return null;
   }
 
-  /// Determines whether the given [ShadowConstructorInvocation] represents an
+  /// 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(ShadowConstructorInvocation expression) {
+  static bool isRedirected(ConstructorInvocationJudgment expression) {
     return !identical(expression._initialTarget, expression.target);
   }
 }
@@ -805,41 +874,66 @@
 /// statement, in kernel form.
 class ContinueSwitchJudgment extends ContinueSwitchStatement
     implements StatementJudgment {
-  ContinueSwitchJudgment(SwitchCase target) : super(target);
+  final Token continueKeyword;
+  final Token semicolon;
+
+  ContinueSwitchJudgment(
+      this.continueKeyword, SwitchCase target, this.semicolon)
+      : super(target);
+
+  SwitchCaseJudgment get targetJudgment => target;
 
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     // No inference needs to be done.
-    inferrer.listener.continueSwitchStatement(this, fileOffset);
+    inferrer.listener.continueSwitchStatement(this, fileOffset, continueKeyword,
+        null, semicolon, targetJudgment?.createBinder(inferrer));
   }
 }
 
 /// Shadow object representing a deferred check in kernel form.
-class ShadowDeferredCheck extends Let implements ExpressionJudgment {
+class DeferredCheckJudgment extends Let implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowDeferredCheck(VariableDeclaration variable, Expression body)
+  DeferredCheckJudgment(VariableDeclaration variable, Expression body)
       : super(variable, body);
 
+  ExpressionJudgment get judgment => body;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     // Since the variable is not used in the body we don't need to type infer
     // it.  We can just type infer the body.
-    var inferredType =
-        inferrer.inferExpression(factory, body, typeContext, true);
+    var judgment = this.judgment;
+    inferrer.inferExpression(factory, judgment, typeContext, true);
+    inferredType = judgment.inferredType;
     inferrer.listener.deferredCheck(this, fileOffset, inferredType);
-    return inferredType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a do loop in kernel form.
 class DoJudgment extends DoStatement implements StatementJudgment {
-  DoJudgment(Statement body, Expression condition) : super(body, condition);
+  final Token doKeyword;
+  final Token whileKeyword;
+  final Token leftParenthesis;
+  final Token rightParenthesis;
+  final Token semicolon;
+
+  DoJudgment(
+      this.doKeyword,
+      Statement body,
+      this.whileKeyword,
+      this.leftParenthesis,
+      Expression condition,
+      this.rightParenthesis,
+      this.semicolon)
+      : super(body, condition);
 
   StatementJudgment get bodyJudgment => body;
 
@@ -856,24 +950,28 @@
         factory, conditionJudgment, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, conditionJudgment.inferredType,
         condition, condition.fileOffset);
-    inferrer.listener.doStatement(this, fileOffset);
+    inferrer.listener.doStatement(this, fileOffset, doKeyword, null,
+        whileKeyword, leftParenthesis, null, rightParenthesis, semicolon);
   }
 }
 
 /// Concrete shadow object representing a double literal in kernel form.
 class DoubleJudgment extends DoubleLiteral implements ExpressionJudgment {
+  final Token literal;
+
   DartType inferredType;
 
-  DoubleJudgment(double value) : super(value);
+  DoubleJudgment(this.literal, double value) : super(value);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferredType = inferrer.coreTypes.doubleClass.rawType;
-    inferrer.listener.doubleLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .doubleLiteral(this, fileOffset, literal, value, inferredType);
+    return null;
   }
 }
 
@@ -884,7 +982,7 @@
 
   /// Calls back to [inferrer] to perform type inference for whatever concrete
   /// type of [ExpressionJudgment] this is.
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext);
@@ -893,18 +991,26 @@
 /// Concrete shadow object representing an empty statement in kernel form.
 class EmptyStatementJudgment extends EmptyStatement
     implements StatementJudgment {
+  final Token semicolon;
+
+  EmptyStatementJudgment(this.semicolon);
+
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     // No inference needs to be done.
+    inferrer.listener.emptyStatement(semicolon);
   }
 }
 
 /// Concrete shadow object representing an expression statement in kernel form.
 class ExpressionStatementJudgment extends ExpressionStatement
     implements StatementJudgment {
-  ExpressionStatementJudgment(Expression expression) : super(expression);
+  final Token semicolon;
+
+  ExpressionStatementJudgment(Expression expression, this.semicolon)
+      : super(expression);
 
   Expression get judgment => expression;
 
@@ -913,13 +1019,13 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
-    inferrer.listener.expressionStatement(this, fileOffset);
+    inferrer.listener.expressionStatement(this, fileOffset, null, semicolon);
   }
 }
 
 /// Shadow object for [StaticInvocation] when the procedure being invoked is a
 /// factory constructor.
-class ShadowFactoryConstructorInvocation extends StaticInvocation
+class FactoryConstructorInvocationJudgment extends StaticInvocation
     implements ExpressionJudgment {
   DartType inferredType;
 
@@ -941,23 +1047,30 @@
   /// [targetTypeArguments] is a list containing the type `List<T>`.
   final List<DartType> targetTypeArguments;
 
-  ShadowFactoryConstructorInvocation(Procedure target, this.targetTypeArguments,
-      this._initialTarget, Arguments arguments,
+  FactoryConstructorInvocationJudgment(
+      Procedure target,
+      this.targetTypeArguments,
+      this._initialTarget,
+      ArgumentsJudgment arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var inferredType = inferrer.inferInvocation(
+    var inferenceResult = inferrer.inferInvocation(
         factory,
         typeContext,
         fileOffset,
         _initialTarget.function.functionType,
         computeConstructorReturnType(_initialTarget),
-        arguments);
+        argumentJudgments);
+    var inferredType = inferenceResult.type;
+    this.inferredType = inferredType;
     inferrer.listener
         .constructorInvocation(this, fileOffset, target, inferredType);
 
@@ -985,15 +1098,15 @@
       }
     }
 
-    return inferredType;
+    return null;
   }
 
-  /// Determines whether the given [ShadowConstructorInvocation] represents an
+  /// 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(ShadowFactoryConstructorInvocation expression) {
+  static bool isRedirected(FactoryConstructorInvocationJudgment expression) {
     return !identical(expression._initialTarget, expression.target);
   }
 }
@@ -1039,21 +1152,43 @@
     var initializerType =
         inferrer.inferExpression(factory, value, field.type, true);
     inferrer.ensureAssignable(field.type, initializerType, value, fileOffset);
-    inferrer.listener.fieldInitializer(this, fileOffset, field);
+    inferrer.listener.fieldInitializer(
+        this, fileOffset, null, null, null, null, null, field);
   }
 }
 
 /// Concrete shadow object representing a for-in loop in kernel form.
-class ShadowForInStatement extends ForInStatement implements StatementJudgment {
+class ForInJudgment extends ForInStatement implements StatementJudgment {
+  final Token awaitKeyword;
+  final Token forKeyword;
+  final Token leftParenthesis;
+  final Token inKeyword;
+  final Token rightParenthesis;
+
   final bool _declaresVariable;
 
-  final ShadowSyntheticExpression _syntheticAssignment;
+  final SyntheticExpressionJudgment _syntheticAssignment;
 
-  ShadowForInStatement(VariableDeclaration variable, Expression iterable,
-      Statement body, this._declaresVariable, this._syntheticAssignment,
+  ForInJudgment(
+      this.awaitKeyword,
+      this.forKeyword,
+      this.leftParenthesis,
+      VariableDeclaration variable,
+      this.inKeyword,
+      Expression iterable,
+      this.rightParenthesis,
+      Statement body,
+      this._declaresVariable,
+      this._syntheticAssignment,
       {bool isAsync: false})
       : super(variable, iterable, body, isAsync: isAsync);
 
+  VariableDeclarationJudgment get variableJudgment => variable;
+
+  ExpressionJudgment get iterableJudgment => iterable;
+
+  StatementJudgment get bodyJudgment => body;
+
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
@@ -1069,14 +1204,14 @@
     kernel.Expression syntheticWrite;
     DartType syntheticWriteType;
     if (_declaresVariable) {
-      variable = this.variable;
+      variable = this.variableJudgment;
       if (inferrer.strongMode && variable._implicitlyTyped) {
         typeNeeded = true;
         context = const UnknownType();
       } else {
         context = variable.type;
       }
-    } else if (syntheticAssignment is ShadowComplexAssignment) {
+    } else if (syntheticAssignment is ComplexAssignmentJudgment) {
       syntheticWrite = syntheticAssignment.write;
       syntheticWriteType =
           context = syntheticAssignment._getWriteType(inferrer);
@@ -1084,14 +1219,18 @@
       context = const UnknownType();
     }
     context = inferrer.wrapType(context, iterableClass);
-    var inferredExpressionType = inferrer.resolveTypeParameter(
-        inferrer.inferExpression(
-            factory, iterable, context, typeNeeded || typeChecksNeeded));
+
+    var iterableJudgment = this.iterableJudgment;
+    inferrer.inferExpression(
+        factory, iterableJudgment, context, typeNeeded || typeChecksNeeded);
+    var inferredExpressionType =
+        inferrer.resolveTypeParameter(iterableJudgment.inferredType);
     inferrer.ensureAssignable(
         inferrer.wrapType(const DynamicType(), iterableClass),
         inferredExpressionType,
         iterable,
         iterable.fileOffset);
+
     DartType inferredType;
     if (typeNeeded || typeChecksNeeded) {
       inferredType = const DynamicType();
@@ -1111,7 +1250,12 @@
         this.variable.type = inferredType;
       }
     }
-    inferrer.inferStatement(factory, body);
+
+    inferrer.inferStatement(factory, bodyJudgment);
+    if (syntheticAssignment != null) {
+      var syntheticStatement = new ExpressionStatement(syntheticAssignment);
+      body = combineStatements(syntheticStatement, body)..parent = this;
+    }
     if (_declaresVariable) {
       inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
       var tempVar =
@@ -1125,14 +1269,14 @@
         variable.initializer = implicitDowncast..parent = variable;
         body = combineStatements(variable, body)..parent = this;
       }
-    } else if (syntheticAssignment is ShadowSyntheticExpression) {
-      if (syntheticAssignment is ShadowComplexAssignment) {
+    } else if (syntheticAssignment is SyntheticExpressionJudgment) {
+      if (syntheticAssignment is ComplexAssignmentJudgment) {
         inferrer.ensureAssignable(
             greatestClosure(inferrer.coreTypes, syntheticWriteType),
             this.variable.type,
             syntheticAssignment.rhs,
             syntheticAssignment.rhs.fileOffset);
-        if (syntheticAssignment is ShadowPropertyAssign) {
+        if (syntheticAssignment is PropertyAssignmentJudgment) {
           syntheticAssignment._handleWriteContravariance(
               inferrer, inferrer.thisType);
         }
@@ -1143,7 +1287,16 @@
       inferrer.listener.forInStatement(
           this,
           fileOffset,
-          variable?.fileOffset,
+          awaitKeyword,
+          forKeyword,
+          leftParenthesis,
+          null,
+          null,
+          inKeyword,
+          iterable,
+          rightParenthesis,
+          body,
+          variable?.createBinder(inferrer),
           variable?.type,
           syntheticWrite.fileOffset,
           syntheticWrite.variable.type,
@@ -1153,7 +1306,16 @@
       inferrer.listener.forInStatement(
           this,
           fileOffset,
-          variable?.fileOffset,
+          awaitKeyword,
+          forKeyword,
+          leftParenthesis,
+          null,
+          null,
+          inKeyword,
+          iterable,
+          rightParenthesis,
+          body,
+          variable?.createBinder(inferrer),
           variable?.type,
           syntheticWrite.fileOffset,
           syntheticWrite.interfaceTarget?.setterType,
@@ -1163,16 +1325,41 @@
       inferrer.listener.forInStatement(
           this,
           fileOffset,
-          variable?.fileOffset,
+          awaitKeyword,
+          forKeyword,
+          leftParenthesis,
+          null,
+          null,
+          inKeyword,
+          iterable,
+          rightParenthesis,
+          body,
+          variable?.createBinder(inferrer),
           variable?.type,
           syntheticWrite.fileOffset,
           syntheticWrite.target.setterType,
           null,
           syntheticWrite.target);
     } else if (syntheticWrite == null ||
-        syntheticWrite is ShadowSyntheticExpression) {
-      inferrer.listener.forInStatement(this, fileOffset, variable?.fileOffset,
-          variable?.type, null, null, null, null);
+        syntheticWrite is SyntheticExpressionJudgment) {
+      inferrer.listener.forInStatement(
+          this,
+          fileOffset,
+          awaitKeyword,
+          forKeyword,
+          leftParenthesis,
+          null,
+          null,
+          inKeyword,
+          null,
+          rightParenthesis,
+          null,
+          variable?.createBinder(inferrer),
+          variable?.type,
+          null,
+          null,
+          null,
+          null);
     } else {
       throw new UnimplementedError(
           '(${syntheticWrite.runtimeType}) $syntheticWrite');
@@ -1181,81 +1368,166 @@
 }
 
 /// Concrete shadow object representing a classic for loop in kernel form.
-class ShadowForStatement extends ForStatement implements StatementJudgment {
-  ShadowForStatement(List<VariableDeclaration> variables, Expression condition,
-      List<Expression> updates, Statement body)
-      : super(variables, condition, updates, body);
+class ForJudgment extends ForStatement implements StatementJudgment {
+  final Token forKeyword;
+  final Token leftParenthesis;
+  final Token leftSeparator;
+  final Token rightSeparator;
+  final Token rightParenthesis;
+
+  final List<ExpressionJudgment> initializers;
+
+  ForJudgment(
+      this.forKeyword,
+      this.leftParenthesis,
+      List<VariableDeclaration> variables,
+      this.initializers,
+      this.leftSeparator,
+      ExpressionJudgment condition,
+      this.rightSeparator,
+      List<Expression> updates,
+      this.rightParenthesis,
+      Statement body)
+      : super(variables ?? [], condition, updates, body);
+
+  List<VariableDeclarationJudgment> get variableJudgments => variables.cast();
+
+  ExpressionJudgment get conditionJudgment => condition;
+
+  List<ExpressionJudgment> get updateJudgments => updates.cast();
+
+  StatementJudgment get bodyJudgment => body;
 
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
-    for (var variable in variables) {
-      inferrer.inferStatement(factory, variable);
+    var initializers = this.initializers;
+    var conditionJudgment = this.conditionJudgment;
+    if (initializers != null) {
+      for (var initializer in initializers) {
+        variables
+            .add(new VariableDeclaration.forValue(initializer)..parent = this);
+        inferrer.inferExpression(
+            factory, initializer, const UnknownType(), false);
+      }
+    } else {
+      for (var variable in variableJudgments) {
+        inferrer.inferStatement(factory, variable);
+      }
     }
-    if (condition != null) {
+    if (conditionJudgment != null) {
       var expectedType = inferrer.coreTypes.boolClass.rawType;
-      var conditionType = inferrer.inferExpression(
-          factory, condition, expectedType, !inferrer.isTopLevel);
-      inferrer.ensureAssignable(
-          expectedType, conditionType, condition, condition.fileOffset);
+      inferrer.inferExpression(
+          factory, conditionJudgment, expectedType, !inferrer.isTopLevel);
+      inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
+          condition, condition.fileOffset);
     }
-    for (var update in updates) {
+    for (var update in updateJudgments) {
       inferrer.inferExpression(factory, update, const UnknownType(), false);
     }
-    inferrer.inferStatement(factory, body);
-    inferrer.listener.forStatement(this, fileOffset);
+    inferrer.inferStatement(factory, bodyJudgment);
+    inferrer.listener.forStatement(
+        this,
+        fileOffset,
+        forKeyword,
+        leftParenthesis,
+        null,
+        null,
+        leftSeparator,
+        condition,
+        rightSeparator,
+        updates,
+        rightParenthesis,
+        body);
+  }
+}
+
+/// Concrete shadow object representing a function expression in kernel form.
+class FunctionNodeJudgment extends FunctionNode {
+  FunctionNodeJudgment(Statement body,
+      {List<TypeParameter> typeParameters,
+      List<VariableDeclaration> positionalParameters,
+      List<VariableDeclaration> namedParameters,
+      int requiredParameterCount,
+      DartType returnType: const DynamicType(),
+      AsyncMarker asyncMarker: AsyncMarker.Sync,
+      AsyncMarker dartAsyncMarker})
+      : super(body,
+            typeParameters: typeParameters,
+            positionalParameters: positionalParameters,
+            namedParameters: namedParameters,
+            requiredParameterCount: requiredParameterCount,
+            returnType: returnType,
+            asyncMarker: asyncMarker,
+            dartAsyncMarker: dartAsyncMarker);
+
+  ExpressionInferenceResult infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType typeContext,
+      DartType returnContext,
+      int returnTypeInstrumentationOffset) {
+    return inferrer.inferLocalFunction(factory, this, typeContext,
+        returnTypeInstrumentationOffset, returnContext);
   }
 }
 
 /// Concrete shadow object representing a local function declaration in kernel
 /// form.
-class ShadowFunctionDeclaration extends FunctionDeclaration
+class FunctionDeclarationJudgment extends FunctionDeclaration
     implements StatementJudgment {
   bool _hasImplicitReturnType = false;
 
-  ShadowFunctionDeclaration(VariableDeclaration variable, FunctionNode function)
+  FunctionDeclarationJudgment(
+      VariableDeclarationJudgment variable, FunctionNodeJudgment function)
       : super(variable, function);
 
+  VariableDeclarationJudgment get variableJudgment => variable;
+
+  FunctionNodeJudgment get functionJudgment => function;
+
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
-    inferrer.inferLocalFunction(
-        factory,
-        function,
-        null,
-        fileOffset,
-        _hasImplicitReturnType
-            ? (inferrer.strongMode ? null : const DynamicType())
-            : function.returnType);
-    var inferredType = variable.type = function.functionType;
-    inferrer.listener.functionDeclaration(this, fileOffset, inferredType);
+    DartType returnContext = _hasImplicitReturnType
+        ? (inferrer.strongMode ? null : const DynamicType())
+        : function.returnType;
+    var inferenceResult = functionJudgment.infer(
+        inferrer, factory, null, returnContext, fileOffset);
+    var inferredType = variable.type = inferenceResult.type;
+    inferrer.listener.functionDeclaration(
+        variableJudgment.createBinder(inferrer), inferredType);
   }
 
   static void setHasImplicitReturnType(
-      ShadowFunctionDeclaration declaration, bool hasImplicitReturnType) {
+      FunctionDeclarationJudgment declaration, bool hasImplicitReturnType) {
     declaration._hasImplicitReturnType = hasImplicitReturnType;
   }
 }
 
 /// Concrete shadow object representing a function expression in kernel form.
-class ShadowFunctionExpression extends FunctionExpression
+class FunctionExpressionJudgment extends FunctionExpression
     implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowFunctionExpression(FunctionNode function) : super(function);
+  FunctionExpressionJudgment(FunctionNodeJudgment function) : super(function);
+
+  FunctionNodeJudgment get judgment => function;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var inferredType = inferrer.inferLocalFunction(
-        factory, function, typeContext, fileOffset, null);
+    var judgment = this.judgment;
+    var inferenceResult =
+        judgment.infer(inferrer, factory, typeContext, null, fileOffset);
+    inferredType = inferenceResult.type;
     inferrer.listener.functionExpression(this, fileOffset, inferredType);
-    return inferredType;
+    return null;
   }
 }
 
@@ -1265,55 +1537,76 @@
 /// expression:
 ///
 ///     let v = a in v == null ? b : v
-class ShadowIfNullExpression extends Let implements ExpressionJudgment {
+class IfNullJudgment extends Let implements ExpressionJudgment {
+  final Token operator;
+
   DartType inferredType;
 
-  ShadowIfNullExpression(VariableDeclaration variable, Expression body)
+  IfNullJudgment(VariableDeclaration variable, this.operator, Expression body)
       : super(variable, body);
 
   @override
   ConditionalExpression get body => super.body;
 
   /// Returns the expression to the left of `??`.
-  Expression get _lhs => variable.initializer;
+  ExpressionJudgment get leftJudgment => variable.initializer;
 
   /// Returns the expression to the right of `??`.
-  Expression get _rhs => body.then;
+  ExpressionJudgment get rightJudgment => body.then;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    var leftJudgment = this.leftJudgment;
+    var rightJudgment = this.rightJudgment;
     // To infer `e0 ?? e1` in context K:
     // - Infer e0 in context K to get T0
-    var lhsType = inferrer.inferExpression(factory, _lhs, typeContext, true);
+    inferrer.inferExpression(factory, leftJudgment, typeContext, true);
+    var lhsType = leftJudgment.inferredType;
     if (inferrer.strongMode) {
       variable.type = lhsType;
     }
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
     bool useLub = _forceLub || typeContext is UnknownType;
-    var rhsType = typeContext is UnknownType
-        ? inferrer.inferExpression(factory, _rhs, lhsType, true)
-        : inferrer.inferExpression(factory, _rhs, typeContext, _forceLub);
+    if (typeContext is UnknownType) {
+      inferrer.inferExpression(factory, rightJudgment, lhsType, true);
+    } else {
+      inferrer.inferExpression(factory, rightJudgment, typeContext, _forceLub);
+    }
+    var rhsType = rightJudgment.inferredType;
     // - Let T = greatest closure of K with respect to `?` if K is not `_`, else
     //   UP(t0, t1)
     // - Then the inferred type is T.
-    var inferredType = useLub
+    inferredType = useLub
         ? inferrer.typeSchemaEnvironment.getLeastUpperBound(lhsType, rhsType)
         : greatestClosure(inferrer.coreTypes, typeContext);
     if (inferrer.strongMode) {
       body.staticType = inferredType;
     }
-    inferrer.listener.ifNull(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .ifNull(this, fileOffset, null, operator, null, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing an if statement in kernel form.
 class IfJudgment extends IfStatement implements StatementJudgment {
-  IfJudgment(Expression condition, Statement then, Statement otherwise)
+  final Token ifKeyword;
+  final Token leftParenthesis;
+  final Token rightParenthesis;
+  final Token elseKeyword;
+
+  IfJudgment(
+      this.ifKeyword,
+      this.leftParenthesis,
+      Expression condition,
+      this.rightParenthesis,
+      Statement then,
+      this.elseKeyword,
+      Statement otherwise)
       : super(condition, then, otherwise);
 
   ExpressionJudgment get conditionJudgment => condition;
@@ -1336,14 +1629,15 @@
     if (otherwiseJudgment != null) {
       inferrer.inferStatement(factory, otherwiseJudgment);
     }
-    inferrer.listener.ifStatement(this, fileOffset);
+    inferrer.listener.ifStatement(this, fileOffset, ifKeyword, leftParenthesis,
+        null, rightParenthesis, null, elseKeyword, null);
   }
 }
 
 /// Concrete shadow object representing an assignment to a target for which
 /// assignment is not allowed.
-class ShadowIllegalAssignment extends ShadowComplexAssignment {
-  ShadowIllegalAssignment(Expression rhs) : super(rhs);
+class IllegalAssignmentJudgment extends ComplexAssignmentJudgment {
+  IllegalAssignmentJudgment(ExpressionJudgment rhs) : super(rhs);
 
   @override
   DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -1351,7 +1645,7 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -1359,17 +1653,19 @@
       inferrer.inferExpression(factory, write, const UnknownType(), false);
     }
     _replaceWithDesugared();
-    return const DynamicType();
+    inferredType = const DynamicType();
+    return null;
   }
 }
 
 /// Concrete shadow object representing an assignment to a target of the form
 /// `a[b]`.
-class ShadowIndexAssign extends ShadowComplexAssignmentWithReceiver {
+class IndexAssignmentJudgment extends ComplexAssignmentJudgmentWithReceiver {
   /// In an assignment to an index expression, the index expression.
-  Expression index;
+  final ExpressionJudgment index;
 
-  ShadowIndexAssign(Expression receiver, this.index, Expression rhs,
+  IndexAssignmentJudgment(
+      ExpressionJudgment receiver, this.index, ExpressionJudgment rhs,
       {bool isSuper: false})
       : super(receiver, rhs, isSuper);
 
@@ -1393,7 +1689,7 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -1414,8 +1710,8 @@
       expectedIndexTypeForWrite = calleeType.positionalParameters[0];
       writeContext = calleeType.positionalParameters[1];
     }
-    var indexType =
-        inferrer.inferExpression(factory, index, indexContext, true);
+    inferrer.inferExpression(factory, index, indexContext, true);
+    var indexType = index.inferredType;
     _storeLetType(inferrer, index, indexType);
     if (writeContext is! UnknownType) {
       inferrer.ensureAssignable(
@@ -1452,9 +1748,9 @@
     }
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
     inferrer.listener.indexAssign(this, write.fileOffset, writeMember,
-        inferredResult.combiner, inferredResult.type);
+        inferredResult.combiner, inferredType);
     _replaceWithDesugared();
-    return inferredResult.type;
+    return null;
   }
 }
 
@@ -1470,18 +1766,21 @@
 
 /// Concrete shadow object representing an integer literal in kernel form.
 class IntJudgment extends IntLiteral implements ExpressionJudgment {
+  final Token literal;
+
   DartType inferredType;
 
-  IntJudgment(int value) : super(value);
+  IntJudgment(this.literal, int value) : super(value);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferredType = inferrer.coreTypes.intClass.rawType;
-    inferrer.listener.intLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .intLiteral(this, fileOffset, literal, value, inferredType);
+    return null;
   }
 }
 
@@ -1502,26 +1801,33 @@
 
 /// Concrete shadow object representing a non-inverted "is" test in kernel form.
 class IsJudgment extends IsExpression implements ExpressionJudgment {
+  final Token isOperator;
+
   DartType inferredType;
 
   ExpressionJudgment get judgment => operand;
 
-  IsJudgment(Expression operand, DartType type) : super(operand, type);
+  IsJudgment(Expression operand, this.isOperator, DartType type)
+      : super(operand, type);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
     inferredType = inferrer.coreTypes.boolClass.rawType;
-    inferrer.listener.isExpression(this, fileOffset, type, inferredType);
-    return inferredType;
+    inferrer.listener.isExpression(
+        this, fileOffset, null, isOperator, null, type, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing an inverted "is" test in kernel form.
 class IsNotJudgment extends Not implements ExpressionJudgment {
+  final Token isOperator;
+  final Token notOperator;
+
   DartType inferredType;
 
   @override
@@ -1529,11 +1835,12 @@
 
   ExpressionJudgment get judgment => operand.operand;
 
-  IsNotJudgment(Expression operand, DartType type, int charOffset)
+  IsNotJudgment(Expression operand, this.isOperator, this.notOperator,
+      DartType type, int charOffset)
       : super(new IsExpression(operand, type)..fileOffset = charOffset);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -1541,9 +1848,9 @@
 
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
     inferredType = inferrer.coreTypes.boolClass.rawType;
-    inferrer.listener
-        .isNotExpression(this, fileOffset, isExpression.type, inferredType);
-    return inferredType;
+    inferrer.listener.isNotExpression(this, fileOffset, null, isOperator,
+        notOperator, null, isExpression.type, inferredType);
+    return null;
   }
 }
 
@@ -1552,24 +1859,43 @@
     implements StatementJudgment {
   LabeledStatementJudgment(Statement body) : super(body);
 
+  Object binder;
+
   StatementJudgment get judgment => body;
 
+  Object createBinder(ShadowTypeInferrer inferrer) {
+    // TODO(paulberry): we need one binder for each label
+    return binder ??=
+        inferrer.listener.binderForStatementLabel(this, fileOffset, null);
+  }
+
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     inferrer.inferStatement(factory, judgment);
-    inferrer.listener.labeledStatement(this, fileOffset);
+    // TODO(paulberry): support multiple labels.
+    List<Object> labels = <Object>[
+      inferrer.listener.statementLabel(createBinder(inferrer), null, null)
+    ];
+    inferrer.listener.labeledStatement(labels, null);
   }
 }
 
-/// Concrete shadow object representing a list literal in kernel form.
-class ShadowListLiteral extends ListLiteral implements ExpressionJudgment {
+/// Type inference derivation for [LiteralList].
+class ListLiteralJudgment extends ListLiteral implements ExpressionJudgment {
+  final Token constKeyword;
+  final Token leftBracket;
+  final Token rightBracket;
+
   DartType inferredType;
 
+  List<Expression> get judgments => expressions;
+
   final DartType _declaredTypeArgument;
 
-  ShadowListLiteral(List<Expression> expressions,
+  ListLiteralJudgment(this.constKeyword, this.leftBracket,
+      List<Expression> expressions, this.rightBracket,
       {DartType typeArgument, bool isConst: false})
       : _declaredTypeArgument = typeArgument,
         super(expressions,
@@ -1577,7 +1903,7 @@
             isConst: isConst);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -1603,13 +1929,14 @@
       inferredTypeArgument = _declaredTypeArgument ?? const DynamicType();
     }
     if (inferenceNeeded || typeChecksNeeded) {
-      for (var expression in expressions) {
-        var expressionType = inferrer.inferExpression(factory, expression,
-            inferredTypeArgument, inferenceNeeded || typeChecksNeeded);
+      for (int i = 0; i < judgments.length; ++i) {
+        ExpressionJudgment judgment = judgments[i];
+        inferrer.inferExpression(factory, judgment, inferredTypeArgument,
+            inferenceNeeded || typeChecksNeeded);
         if (inferenceNeeded) {
           formalTypes.add(listType.typeArguments[0]);
         }
-        actualTypes.add(expressionType);
+        actualTypes.add(judgment.inferredType);
       }
     }
     if (inferenceNeeded) {
@@ -1626,76 +1953,110 @@
       typeArgument = inferredTypeArgument;
     }
     if (typeChecksNeeded) {
-      for (int i = 0; i < expressions.length; i++) {
-        inferrer.ensureAssignable(typeArgument, actualTypes[i], expressions[i],
-            expressions[i].fileOffset);
+      for (int i = 0; i < judgments.length; i++) {
+        inferrer.ensureAssignable(typeArgument, actualTypes[i], judgments[i],
+            judgments[i].fileOffset);
       }
     }
     var inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
-    inferrer.listener.listLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener.listLiteral(this, fileOffset, constKeyword, null,
+        leftBracket, expressions, rightBracket, inferredType);
+    this.inferredType = inferredType;
+    return null;
   }
 }
 
 /// Shadow object for [LogicalExpression].
-class ShadowLogicalExpression extends LogicalExpression
-    implements ExpressionJudgment {
+class LogicalJudgment extends LogicalExpression implements ExpressionJudgment {
+  final Token operatorToken;
+
   DartType inferredType;
 
-  ShadowLogicalExpression(Expression left, String operator, Expression right)
-      : super(left, operator, right);
+  LogicalJudgment(Expression left, this.operatorToken, Expression right)
+      : super(left, operatorToken.stringValue, right);
+
+  ExpressionJudgment get leftJudgment => left;
+
+  ExpressionJudgment get rightJudgment => right;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     var boolType = inferrer.coreTypes.boolClass.rawType;
-    var leftType =
-        inferrer.inferExpression(factory, left, boolType, !inferrer.isTopLevel);
-    var rightType = inferrer.inferExpression(
-        factory, right, boolType, !inferrer.isTopLevel);
-    inferrer.ensureAssignable(boolType, leftType, left, left.fileOffset);
-    inferrer.ensureAssignable(boolType, rightType, right, right.fileOffset);
-    var inferredType = boolType;
-    inferrer.listener.logicalExpression(this, fileOffset, inferredType);
-    return inferredType;
+    var leftJudgment = this.leftJudgment;
+    var rightJudgment = this.rightJudgment;
+    inferrer.inferExpression(
+        factory, leftJudgment, boolType, !inferrer.isTopLevel);
+    inferrer.inferExpression(
+        factory, rightJudgment, boolType, !inferrer.isTopLevel);
+    inferrer.ensureAssignable(
+        boolType, leftJudgment.inferredType, left, left.fileOffset);
+    inferrer.ensureAssignable(
+        boolType, rightJudgment.inferredType, right, right.fileOffset);
+    inferredType = boolType;
+    inferrer.listener
+        .logicalExpression(this, fileOffset, null, null, null, inferredType);
+    return null;
   }
 }
 
-/// Shadow object for synthetic assignments added at the top of a for-in loop.
+/// Type inference derivation for [MapEntry].
 ///
-/// This covers the case where a for-in loop refers to a variable decleared
-/// elsewhere, so it is desugared into a for-in loop that assigns to the
-/// variable at the top of the loop body.
-class ShadowLoopAssignmentStatement extends ExpressionStatement
-    implements StatementJudgment {
-  ShadowLoopAssignmentStatement(Expression expression) : super(expression);
+/// This derivation is needed for uniformity.
+class MapEntryJudgment extends MapEntry {
+  DartType inferredKeyType;
+  DartType inferredValueType;
 
-  @override
-  void infer<Expression, Statement, Initializer, Type>(
+  ExpressionJudgment get keyJudgment => key;
+
+  ExpressionJudgment get valueJudgment => value;
+
+  MapEntryJudgment(Expression key, Expression value) : super(key, value);
+
+  MapEntry infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
-      Factory<Expression, Statement, Initializer, Type> factory) {}
+      Factory<Expression, Statement, Initializer, Type> factory,
+      DartType keyTypeContext,
+      DartType valueTypeContext) {
+    ExpressionJudgment keyJudgment = this.keyJudgment;
+    inferrer.inferExpression(factory, keyJudgment, keyTypeContext, true);
+    inferredKeyType = keyJudgment.inferredType;
+
+    ExpressionJudgment valueJudgment = this.valueJudgment;
+    inferrer.inferExpression(factory, valueJudgment, valueTypeContext, true);
+    inferredValueType = valueJudgment.inferredType;
+
+    return null;
+  }
 }
 
-/// Shadow object for [MapLiteral].
-class ShadowMapLiteral extends MapLiteral implements ExpressionJudgment {
+/// Type inference derivation for [MapLiteral].
+class MapLiteralJudgment extends MapLiteral implements ExpressionJudgment {
+  final Token constKeyword;
+  final Token leftBracket;
+  final Token rightBracket;
+
   DartType inferredType;
 
+  List<MapEntryJudgment> get judgments => entries;
+
   final DartType _declaredKeyType;
   final DartType _declaredValueType;
 
-  ShadowMapLiteral(List<MapEntry> entries,
+  MapLiteralJudgment(this.constKeyword, this.leftBracket,
+      List<MapEntryJudgment> judgments, this.rightBracket,
       {DartType keyType, DartType valueType, bool isConst: false})
       : _declaredKeyType = keyType,
         _declaredValueType = valueType,
-        super(entries,
+        super(judgments,
             keyType: keyType ?? const DynamicType(),
             valueType: valueType ?? const DynamicType(),
             isConst: isConst);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -1724,17 +2085,18 @@
       inferredKeyType = _declaredKeyType ?? const DynamicType();
       inferredValueType = _declaredValueType ?? const DynamicType();
     }
+    List<ExpressionJudgment> cachedKeyJudgments =
+        judgments.map((j) => j.keyJudgment).toList();
+    List<ExpressionJudgment> cachedValueJudgments =
+        judgments.map((j) => j.valueJudgment).toList();
     if (inferenceNeeded || typeChecksNeeded) {
-      for (var entry in entries) {
-        var keyType = inferrer.inferExpression(factory, entry.key,
-            inferredKeyType, inferenceNeeded || typeChecksNeeded);
-        var valueType = inferrer.inferExpression(factory, entry.value,
-            inferredValueType, inferenceNeeded || typeChecksNeeded);
+      for (MapEntryJudgment judgment in judgments) {
+        judgment.infer(inferrer, factory, inferredKeyType, inferredValueType);
         if (inferenceNeeded) {
           formalTypes.addAll(mapType.typeArguments);
         }
-        actualTypes.add(keyType);
-        actualTypes.add(valueType);
+        actualTypes.add(judgment.inferredKeyType);
+        actualTypes.add(judgment.inferredValueType);
       }
     }
     if (inferenceNeeded) {
@@ -1757,20 +2119,21 @@
       valueType = inferredValueType;
     }
     if (typeChecksNeeded) {
-      for (int i = 0; i < entries.length; i++) {
-        var entry = entries[i];
-        var key = entry.key;
+      for (int i = 0; i < judgments.length; ++i) {
+        ExpressionJudgment keyJudgment = cachedKeyJudgments[i];
         inferrer.ensureAssignable(
-            keyType, actualTypes[2 * i], key, key.fileOffset);
-        var value = entry.value;
-        inferrer.ensureAssignable(
-            valueType, actualTypes[2 * i + 1], value, value.fileOffset);
+            keyType, actualTypes[2 * i], keyJudgment, keyJudgment.fileOffset);
+
+        ExpressionJudgment valueJudgment = cachedValueJudgments[i];
+        inferrer.ensureAssignable(valueType, actualTypes[2 * i + 1],
+            valueJudgment, valueJudgment.fileOffset);
       }
     }
-    var inferredType =
+    inferredType =
         new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
-    inferrer.listener.mapLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener.mapLiteral(this, fileOffset, constKeyword, null,
+        leftBracket, entries, rightBracket, inferredType);
+    return null;
   }
 }
 
@@ -1796,7 +2159,7 @@
 }
 
 /// Shadow object for [MethodInvocation].
-class ShadowMethodInvocation extends MethodInvocation
+class MethodInvocationJudgment extends MethodInvocation
     implements ExpressionJudgment {
   DartType inferredType;
 
@@ -1804,19 +2167,24 @@
   /// resulting from the invocation of a function expression.
   final bool _isImplicitCall;
 
-  ShadowMethodInvocation(Expression receiver, Name name, Arguments arguments,
+  MethodInvocationJudgment(
+      Expression receiver, Name name, ArgumentsJudgment arguments,
       {bool isImplicitCall: false, Member interfaceTarget})
       : _isImplicitCall = isImplicitCall,
         super(receiver, name, arguments, interfaceTarget);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferrer.inferMethodInvocation(
+    var inferenceResult = inferrer.inferMethodInvocation(
         factory, this, receiver, fileOffset, _isImplicitCall, typeContext,
         desugaredInvocation: this);
+    inferredType = inferenceResult.type;
+    return null;
   }
 }
 
@@ -1829,44 +2197,53 @@
 /// kernel expression:
 ///
 ///     let f = () { ... } in f
-class ShadowNamedFunctionExpression extends Let implements ExpressionJudgment {
+class NamedFunctionExpressionJudgment extends Let
+    implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowNamedFunctionExpression(VariableDeclaration variable)
+  NamedFunctionExpressionJudgment(VariableDeclarationJudgment variable)
       : super(variable, new VariableGet(variable));
 
+  VariableDeclarationJudgment get variableJudgment => variable;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var inferredType = inferrer.inferExpression(
-        factory, variable.initializer, typeContext, true);
+    ExpressionJudgment initializer = variableJudgment.initializer;
+    inferrer.inferExpression(factory, initializer, typeContext, true);
+    inferredType = initializer.inferredType;
     if (inferrer.strongMode) variable.type = inferredType;
     inferrer.listener.namedFunctionExpression(this, fileOffset, inferredType);
-    return inferredType;
+    return null;
   }
 }
 
 /// Shadow object for [Not].
-class ShadowNot extends Not implements ExpressionJudgment {
+class NotJudgment extends Not implements ExpressionJudgment {
+  final Token operator;
+
   DartType inferredType;
 
-  ShadowNot(Expression operand) : super(operand);
+  NotJudgment(this.operator, ExpressionJudgment operand) : super(operand);
+
+  ExpressionJudgment get judgment => operand;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    var judgment = this.judgment;
     // First infer the receiver so we can look up the method that was invoked.
     var boolType = inferrer.coreTypes.boolClass.rawType;
-    var actualType = inferrer.inferExpression(
-        factory, operand, boolType, !inferrer.isTopLevel);
-    inferrer.ensureAssignable(boolType, actualType, operand, fileOffset);
-    DartType inferredType = boolType;
-    inferrer.listener.not(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.inferExpression(factory, judgment, boolType, !inferrer.isTopLevel);
+    inferrer.ensureAssignable(
+        boolType, judgment.inferredType, operand, fileOffset);
+    inferredType = boolType;
+    inferrer.listener.not(this, fileOffset, operator, null, inferredType);
+    return null;
   }
 }
 
@@ -1876,11 +2253,12 @@
 /// expression:
 ///
 ///     let v = a in v == null ? null : v.b(...)
-class ShadowNullAwareMethodInvocation extends Let
+class NullAwareMethodInvocationJudgment extends Let
     implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowNullAwareMethodInvocation(VariableDeclaration variable, Expression body)
+  NullAwareMethodInvocationJudgment(
+      VariableDeclaration variable, Expression body)
       : super(variable, body);
 
   @override
@@ -1889,17 +2267,18 @@
   MethodInvocation get _desugaredInvocation => body.otherwise;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var inferredType = inferrer.inferMethodInvocation(
+    var inferenceResult = inferrer.inferMethodInvocation(
         factory, this, variable.initializer, fileOffset, false, typeContext,
         receiverVariable: variable, desugaredInvocation: _desugaredInvocation);
+    inferredType = inferenceResult.type;
     if (inferrer.strongMode) {
       body.staticType = inferredType;
     }
-    return inferredType;
+    return null;
   }
 }
 
@@ -1924,7 +2303,7 @@
   ExpressionJudgment get receiverJudgment => variable.initializer;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -1934,23 +2313,27 @@
     if (inferrer.strongMode) {
       body.staticType = inferredType;
     }
-    return inferredType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a null literal in kernel form.
 class NullJudgment extends NullLiteral implements ExpressionJudgment {
+  final Token literal;
+
   DartType inferredType;
 
+  NullJudgment(this.literal);
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferredType = inferrer.coreTypes.nullClass.rawType;
     inferrer.listener
-        .nullLiteral(this, fileOffset, fileOffset == -1, inferredType);
-    return inferredType;
+        .nullLiteral(this, fileOffset, literal, fileOffset == -1, inferredType);
+    return null;
   }
 }
 
@@ -1986,12 +2369,13 @@
 }
 
 /// Concrete shadow object representing an assignment to a property.
-class ShadowPropertyAssign extends ShadowComplexAssignmentWithReceiver {
+class PropertyAssignmentJudgment extends ComplexAssignmentJudgmentWithReceiver {
   /// If this assignment uses null-aware access (`?.`), the conditional
   /// expression that guards the access; otherwise `null`.
   ConditionalExpression nullAwareGuard;
 
-  ShadowPropertyAssign(Expression receiver, Expression rhs,
+  PropertyAssignmentJudgment(
+      ExpressionJudgment receiver, ExpressionJudgment rhs,
       {bool isSuper: false})
       : super(receiver, rhs, isSuper);
 
@@ -2016,7 +2400,7 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -2040,16 +2424,16 @@
     // doing compound assignment?
     var writeContext = inferrer.getSetterType(writeMember, receiverType);
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
-    if (inferrer.strongMode) nullAwareGuard?.staticType = inferredResult.type;
+    if (inferrer.strongMode) nullAwareGuard?.staticType = inferredType;
     inferrer.listener.propertyAssign(
         this,
         write.fileOffset,
         inferrer.getRealTarget(writeMember),
         writeContext,
         inferredResult.combiner,
-        inferredResult.type);
+        inferredType);
     _replaceWithDesugared();
-    return inferredResult.type;
+    return null;
   }
 }
 
@@ -2067,24 +2451,27 @@
   ExpressionJudgment get receiverJudgment => receiver;
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferrer.inferPropertyGet(
         factory, this, receiverJudgment, fileOffset, typeContext,
         desugaredGet: this);
-    return inferredType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a redirecting initializer in kernel
 /// form.
-class ShadowRedirectingInitializer extends RedirectingInitializer
+class RedirectingInitializerJudgment extends RedirectingInitializer
     implements InitializerJudgment {
-  ShadowRedirectingInitializer(Constructor target, Arguments arguments)
+  RedirectingInitializerJudgment(
+      Constructor target, ArgumentsJudgment arguments)
       : super(target, arguments);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
   infer<Expression, Statement, Initializer, Type>(ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
@@ -2096,32 +2483,46 @@
       typeArguments[i] = new TypeParameterType(classTypeParameters[i]);
     }
     ArgumentsJudgment.setNonInferrableArgumentTypes(arguments, typeArguments);
-    inferrer.inferInvocation(factory, null, fileOffset,
-        target.function.functionType, target.enclosingClass.thisType, arguments,
+    inferrer.inferInvocation(
+        factory,
+        null,
+        fileOffset,
+        target.function.functionType,
+        target.enclosingClass.thisType,
+        argumentJudgments,
         skipTypeArgumentInference: true);
     ArgumentsJudgment.removeNonInferrableArgumentTypes(arguments);
-    inferrer.listener.redirectingInitializer(this, fileOffset, target);
+    inferrer.listener.redirectingInitializer(
+        this, fileOffset, null, null, null, null, target);
   }
 }
 
 /// Shadow object for [Rethrow].
-class ShadowRethrow extends Rethrow implements ExpressionJudgment {
+class RethrowJudgment extends Rethrow implements ExpressionJudgment {
+  final Token rethrowKeyword;
+
   DartType inferredType;
 
+  RethrowJudgment(this.rethrowKeyword);
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var inferredType = const BottomType();
-    inferrer.listener.rethrow_(this, fileOffset, inferredType);
-    return inferredType;
+    inferredType = const BottomType();
+    inferrer.listener.rethrow_(this, fileOffset, rethrowKeyword, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing a return statement in kernel form.
 class ReturnJudgment extends ReturnStatement implements StatementJudgment {
-  ReturnJudgment([Expression expression]) : super(expression);
+  final Token returnKeyword;
+  final Token semicolon;
+
+  ReturnJudgment(this.returnKeyword, this.semicolon, [Expression expression])
+      : super(expression);
 
   ExpressionJudgment get judgment => expression;
 
@@ -2148,7 +2549,8 @@
       closureContext.handleReturn(
           inferrer, inferredType, expression, fileOffset);
     }
-    inferrer.listener.returnStatement(this, fileOffset);
+    inferrer.listener
+        .returnStatement(this, fileOffset, returnKeyword, null, semicolon);
   }
 }
 
@@ -2163,8 +2565,8 @@
 }
 
 /// Concrete shadow object representing an assignment to a static variable.
-class ShadowStaticAssignment extends ShadowComplexAssignment {
-  ShadowStaticAssignment(Expression rhs) : super(rhs);
+class StaticAssignmentJudgment extends ComplexAssignmentJudgment {
+  StaticAssignmentJudgment(ExpressionJudgment rhs) : super(rhs);
 
   @override
   DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -2173,7 +2575,7 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -2196,9 +2598,9 @@
     }
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
     inferrer.listener.staticAssign(this, write?.fileOffset, writeMember,
-        writeContext, inferredResult.combiner, inferredResult.type);
+        writeContext, inferredResult.combiner, inferredType);
     _replaceWithDesugared();
-    return inferredResult.type;
+    return null;
   }
 }
 
@@ -2210,7 +2612,7 @@
   StaticGetJudgment(Member target) : super(target);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -2225,27 +2627,31 @@
     }
     inferredType = type;
     inferrer.listener.staticGet(this, fileOffset, target, inferredType);
-    return inferredType;
+    return null;
   }
 }
 
 /// Shadow object for [StaticInvocation].
-class ShadowStaticInvocation extends StaticInvocation
+class StaticInvocationJudgment extends StaticInvocation
     implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowStaticInvocation(Procedure target, Arguments arguments,
+  StaticInvocationJudgment(Procedure target, ArgumentsJudgment arguments,
       {bool isConst: false})
       : super(target, arguments, isConst: isConst);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     var calleeType = target.function.functionType;
-    var inferredType = inferrer.inferInvocation(factory, typeContext,
-        fileOffset, calleeType, calleeType.returnType, arguments);
+    var inferenceResult = inferrer.inferInvocation(factory, typeContext,
+        fileOffset, calleeType, calleeType.returnType, argumentJudgments);
+    var inferredType = inferenceResult.type;
+    this.inferredType = inferredType;
     inferrer.listener.staticInvocation(
         this,
         arguments.fileOffset,
@@ -2254,57 +2660,70 @@
         inferrer.lastCalleeType,
         inferrer.lastInferredSubstitution,
         inferredType);
-    return inferredType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a string concatenation in kernel form.
-class ShadowStringConcatenation extends StringConcatenation
+class StringConcatenationJudgment extends StringConcatenation
     implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowStringConcatenation(List<Expression> expressions) : super(expressions);
+  StringConcatenationJudgment(List<Expression> expressions)
+      : super(expressions);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     if (!inferrer.isTopLevel) {
-      for (kernel.Expression expression in expressions) {
+      for (var expression in expressions) {
         inferrer.inferExpression(
             factory, expression, const UnknownType(), false);
       }
     }
-    var inferredType = inferrer.coreTypes.stringClass.rawType;
+    inferredType = inferrer.coreTypes.stringClass.rawType;
     inferrer.listener.stringConcatenation(this, fileOffset, inferredType);
-    return inferredType;
+    return null;
   }
 }
 
-/// Concrete shadow object representing a string literal in kernel form.
-class ShadowStringLiteral extends StringLiteral implements ExpressionJudgment {
+/// Type inference derivation for [StringLiteral].
+class StringLiteralJudgment extends StringLiteral
+    implements ExpressionJudgment {
+  final Token literal;
+
   DartType inferredType;
 
-  ShadowStringLiteral(String value) : super(value);
+  StringLiteralJudgment(this.literal, String value) : super(value);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     var inferredType = inferrer.coreTypes.stringClass.rawType;
-    inferrer.listener.stringLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .stringLiteral(this, fileOffset, literal, value, inferredType);
+    this.inferredType = inferredType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a super initializer in kernel form.
-class ShadowSuperInitializer extends SuperInitializer
+class SuperInitializerJudgment extends SuperInitializer
     implements InitializerJudgment {
-  ShadowSuperInitializer(Constructor target, Arguments arguments)
+  final Token superKeyword;
+  final Token period;
+  final Token constructorName;
+
+  SuperInitializerJudgment(this.superKeyword, this.period, this.constructorName,
+      Constructor target, ArgumentsJudgment arguments)
       : super(target, arguments);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
@@ -2319,23 +2738,26 @@
         substitution
             .substituteType(target.function.functionType.withoutTypeParameters),
         inferrer.thisType,
-        arguments,
+        argumentJudgments,
         skipTypeArgumentInference: true);
-    inferrer.listener.superInitializer(this, fileOffset);
+    inferrer.listener.superInitializer(
+        this, fileOffset, superKeyword, period, constructorName, null);
   }
 }
 
 /// Shadow object for [SuperMethodInvocation].
-class ShadowSuperMethodInvocation extends SuperMethodInvocation
+class SuperMethodInvocationJudgment extends SuperMethodInvocation
     implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowSuperMethodInvocation(Name name, Arguments arguments,
+  SuperMethodInvocationJudgment(Name name, ArgumentsJudgment arguments,
       [Procedure interfaceTarget])
       : super(name, arguments, interfaceTarget);
 
+  ArgumentsJudgment get argumentJudgments => arguments;
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -2343,11 +2765,13 @@
       inferrer.instrumentation?.record(inferrer.uri, fileOffset, 'target',
           new InstrumentationValueForMember(interfaceTarget));
     }
-    return inferrer.inferMethodInvocation(
+    var inferenceResult = inferrer.inferMethodInvocation(
         factory, this, null, fileOffset, false, typeContext,
         interfaceMember: interfaceTarget,
         methodName: name,
         arguments: arguments);
+    inferredType = inferenceResult.type;
+    return null;
   }
 }
 
@@ -2360,7 +2784,7 @@
       : super(name, interfaceTarget);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -2370,30 +2794,58 @@
     }
     inferrer.inferPropertyGet(factory, this, null, fileOffset, typeContext,
         interfaceMember: interfaceTarget, propertyName: name);
-    return inferredType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a switch case.
 class SwitchCaseJudgment extends SwitchCase {
-  SwitchCaseJudgment(
-      List<Expression> expressions, List<int> expressionOffsets, Statement body,
+  final Token keyword;
+  final Token colon;
+
+  Object binder;
+
+  SwitchCaseJudgment(this.keyword, List<Expression> expressions,
+      List<int> expressionOffsets, this.colon, Statement body,
       {bool isDefault: false})
       : super(expressions, expressionOffsets, body, isDefault: isDefault);
 
-  SwitchCaseJudgment.defaultCase(Statement body) : super.defaultCase(body);
+  SwitchCaseJudgment.defaultCase(this.keyword, this.colon, Statement body)
+      : super.defaultCase(body);
 
-  SwitchCaseJudgment.empty() : super.empty();
+  SwitchCaseJudgment.empty()
+      : keyword = null,
+        colon = null,
+        super.empty();
 
   List<ExpressionJudgment> get expressionJudgments => expressions.cast();
 
   StatementJudgment get bodyJudgment => body;
+
+  Object createBinder(ShadowTypeInferrer inferrer) {
+    // TODO(paulberry): we need one binder for each label
+    return binder ??=
+        inferrer.listener.binderForSwitchLabel(this, fileOffset, null);
+  }
 }
 
 /// Concrete shadow object representing a switch statement in kernel form.
 class SwitchStatementJudgment extends SwitchStatement
     implements StatementJudgment {
-  SwitchStatementJudgment(Expression expression, List<SwitchCase> cases)
+  final Token switchKeyword;
+  final Token leftParenthesis;
+  final Token rightParenthesis;
+  final Token leftBracket;
+  final Token rightBracket;
+
+  SwitchStatementJudgment(
+      this.switchKeyword,
+      this.leftParenthesis,
+      Expression expression,
+      this.rightParenthesis,
+      this.leftBracket,
+      List<SwitchCase> cases,
+      this.rightBracket)
       : super(expression, cases);
 
   ExpressionJudgment get expressionJudgment => expression;
@@ -2414,25 +2866,38 @@
             factory, caseExpression, expressionType, false);
       }
       inferrer.inferStatement(factory, switchCase.bodyJudgment);
+      // TODO(paulberry): support labels.
+      inferrer.listener.switchCase(switchCase, null, null, null, null, null);
     }
-    inferrer.listener.switchStatement(this, fileOffset);
+    inferrer.listener.switchStatement(
+        this,
+        fileOffset,
+        switchKeyword,
+        leftParenthesis,
+        expression,
+        rightParenthesis,
+        leftBracket,
+        cases,
+        rightBracket);
   }
 }
 
 /// Shadow object for [SymbolLiteral].
-class ShadowSymbolLiteral extends SymbolLiteral implements ExpressionJudgment {
+class SymbolLiteralJudgment extends SymbolLiteral
+    implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowSymbolLiteral(String value) : super(value);
+  SymbolLiteralJudgment(String value) : super(value);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    var inferredType = inferrer.coreTypes.symbolClass.rawType;
-    inferrer.listener.symbolLiteral(this, fileOffset, inferredType);
-    return inferredType;
+    inferredType = inferrer.coreTypes.symbolClass.rawType;
+    inferrer.listener
+        .symbolLiteral(this, fileOffset, null, null, null, inferredType);
+    return null;
   }
 }
 
@@ -2441,10 +2906,10 @@
 ///
 /// These expressions are removed by type inference and replaced with their
 /// desugared equivalents.
-class ShadowSyntheticExpression extends Let implements ExpressionJudgment {
+class SyntheticExpressionJudgment extends Let implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowSyntheticExpression(Expression desugared)
+  SyntheticExpressionJudgment(Expression desugared)
       : super(new VariableDeclaration('_', initializer: new NullLiteral()),
             desugared);
 
@@ -2457,12 +2922,13 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     _replaceWithDesugared();
-    return const DynamicType();
+    inferredType = const DynamicType();
+    return null;
   }
 
   /// Removes this expression from the expression tree, replacing it with
@@ -2505,42 +2971,64 @@
 }
 
 class ThisJudgment extends ThisExpression implements ExpressionJudgment {
+  final Token thisKeyword;
+
   DartType inferredType;
 
+  ThisJudgment(this.thisKeyword);
+
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferredType = inferrer.thisType ?? const DynamicType();
-    inferrer.listener.thisExpression(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .thisExpression(this, fileOffset, thisKeyword, inferredType);
+    return null;
   }
 }
 
 class ThrowJudgment extends Throw implements ExpressionJudgment {
+  final Token throwKeyword;
+
   DartType inferredType;
 
   ExpressionJudgment get judgment => expression;
 
-  ThrowJudgment(Expression expression) : super(expression);
+  ThrowJudgment(this.throwKeyword, Expression expression) : super(expression);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
     inferredType = const BottomType();
-    inferrer.listener.throw_(this, fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener
+        .throw_(this, fileOffset, throwKeyword, null, inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing a catch clause.
 class CatchJudgment extends Catch {
-  CatchJudgment(VariableDeclaration exception, Statement body,
-      {DartType guard: const DynamicType(), VariableDeclaration stackTrace})
+  final Token onKeyword;
+  final Token catchKeyword;
+  final Token leftParenthesis;
+  final Token comma;
+  final Token rightParenthesis;
+
+  CatchJudgment(
+      this.onKeyword,
+      this.catchKeyword,
+      this.leftParenthesis,
+      VariableDeclaration exception,
+      this.comma,
+      this.rightParenthesis,
+      Statement body,
+      {DartType guard: const DynamicType(),
+      VariableDeclaration stackTrace})
       : super(exception, body, guard: guard, stackTrace: stackTrace);
 
   VariableDeclarationJudgment get exceptionJudgment => exception;
@@ -2548,6 +3036,29 @@
   VariableDeclarationJudgment get stackTraceJudgment => stackTrace;
 
   StatementJudgment get bodyJudgment => body;
+
+  void infer<Expression, Statement, Initializer, Type>(
+      ShadowTypeInferrer inferrer,
+      Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.inferStatement(factory, bodyJudgment);
+    inferrer.listener.catchStatement(
+        this,
+        fileOffset,
+        onKeyword,
+        null,
+        catchKeyword,
+        leftParenthesis,
+        null, // exception
+        comma,
+        null, // stackTrace
+        rightParenthesis,
+        null, // body
+        guard,
+        exceptionJudgment?.createBinder(inferrer),
+        exceptionJudgment?.type,
+        stackTraceJudgment?.createBinder(inferrer),
+        stackTraceJudgment?.type);
+  }
 }
 
 /// Concrete shadow object representing a try-catch block in kernel form.
@@ -2564,32 +3075,40 @@
       Factory<Expression, Statement, Initializer, Type> factory) {
     inferrer.inferStatement(factory, bodyJudgment);
     for (var catch_ in catchJudgments) {
-      inferrer.inferStatement(factory, catch_.bodyJudgment);
-      inferrer.listener.catchStatement(
-          catch_,
-          catch_.fileOffset,
-          catch_.guard,
-          catch_.exceptionJudgment?.fileOffset,
-          catch_.exceptionJudgment?.type,
-          catch_.stackTraceJudgment?.fileOffset,
-          catch_.stackTraceJudgment?.type);
+      catch_.infer(inferrer, factory);
     }
     inferrer.listener.tryCatch(this, fileOffset);
   }
 }
 
 /// Concrete shadow object representing a try-finally block in kernel form.
-class ShadowTryFinally extends TryFinally implements StatementJudgment {
-  ShadowTryFinally(Statement body, Statement finalizer)
+class TryFinallyJudgment extends TryFinally implements StatementJudgment {
+  final Token tryKeyword;
+  final List<Catch> catches;
+  final Token finallyKeyword;
+
+  TryFinallyJudgment(this.tryKeyword, Statement body, this.catches,
+      this.finallyKeyword, Statement finalizer)
       : super(body, finalizer);
 
+  List<CatchJudgment> get catchJudgments => catches?.cast();
+
+  StatementJudgment get finalizerJudgment => finalizer;
+
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
     inferrer.inferStatement(factory, body);
-    inferrer.inferStatement(factory, finalizer);
-    inferrer.listener.tryFinally(this, fileOffset);
+    if (catchJudgments != null) {
+      for (var catch_ in catchJudgments) {
+        catch_.infer(inferrer, factory);
+      }
+      body = new TryCatch(body, catches)..parent = this;
+    }
+    inferrer.inferStatement(factory, finalizerJudgment);
+    inferrer.listener.tryFinally(
+        this, fileOffset, tryKeyword, body, catches, finallyKeyword, finalizer);
   }
 }
 
@@ -2679,8 +3198,8 @@
       // TODO(paulberry): experiment to see if dynamic dispatch would be better,
       // so that the type hierarchy will be simpler (which may speed up "is"
       // checks).
-      return expression.inferredType =
-          expression.infer(this, factory, typeContext);
+      expression.infer(this, factory, typeContext);
+      return expression.inferredType;
     } else {
       // Encountered an expression type for which type inference is not yet
       // implemented, so just infer dynamic for now.
@@ -2747,13 +3266,13 @@
   TypeLiteralJudgment(DartType type) : super(type);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
     inferredType = inferrer.coreTypes.typeClass.rawType;
     inferrer.listener.typeLiteral(this, fileOffset, type, inferredType);
-    return inferredType;
+    return null;
   }
 }
 
@@ -2826,8 +3345,8 @@
   }
 }
 
-class VariableAssignmentJudgment extends ShadowComplexAssignment {
-  VariableAssignmentJudgment(Expression rhs) : super(rhs);
+class VariableAssignmentJudgment extends ComplexAssignmentJudgment {
+  VariableAssignmentJudgment(ExpressionJudgment rhs) : super(rhs);
 
   @override
   DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -2836,7 +3355,7 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -2860,9 +3379,9 @@
         writeContext,
         write is VariableSet ? write.variable.fileOffset : null,
         inferredResult.combiner,
-        inferredResult.type);
+        inferredType);
     _replaceWithDesugared();
-    return inferredType = inferredResult.type;
+    return null;
   }
 }
 
@@ -2879,6 +3398,8 @@
 
   final bool _isLocalFunction;
 
+  Object binder;
+
   VariableDeclarationJudgment(String name, this._functionNestingLevel,
       {Expression initializer,
       DartType type,
@@ -2964,9 +3485,16 @@
       }
     }
     inferrer.listener.variableDeclaration(
-        this, fileOffset, type, _implicitlyTyped ? inferredType : type);
+        createBinder(inferrer), type, _implicitlyTyped ? inferredType : type);
   }
 
+  Object createBinder(ShadowTypeInferrer inferrer) =>
+      binder ??= _isLocalFunction
+          ? inferrer.listener
+              .binderForFunctionDeclaration(this, fileOffset, name)
+          : inferrer.listener
+              .binderForVariableDeclaration(this, fileOffset, name);
+
   /// Determine whether the given [VariableDeclarationJudgment] had an implicit
   /// type.
   ///
@@ -3000,7 +3528,7 @@
   bool _isInCascade() {
     TreeNode ancestor = variable.parent;
     while (ancestor is Let) {
-      if (ancestor is ShadowCascadeExpression) {
+      if (ancestor is CascadeJudgment) {
         return true;
       }
       ancestor = ancestor.parent;
@@ -3009,7 +3537,7 @@
   }
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
@@ -3029,15 +3557,21 @@
       type = inferrer.instantiateTearOff(type, typeContext, this);
     }
     inferredType = type;
-    inferrer.listener.variableGet(
-        this, fileOffset, _isInCascade(), variable.fileOffset, inferredType);
-    return inferredType;
+    inferrer.listener.variableGet(this, fileOffset, _isInCascade(),
+        variable.createBinder(inferrer), inferredType);
+    return null;
   }
 }
 
 /// Concrete shadow object representing a while loop in kernel form.
 class WhileJudgment extends WhileStatement implements StatementJudgment {
-  WhileJudgment(Expression condition, Statement body) : super(condition, body);
+  final Token whileKeyword;
+  final Token leftParenthesis;
+  final Token rightParenthesis;
+
+  WhileJudgment(this.whileKeyword, this.leftParenthesis, Expression condition,
+      this.rightParenthesis, Statement body)
+      : super(condition, body);
 
   ExpressionJudgment get conditionJudgment => condition;
 
@@ -3054,14 +3588,20 @@
     inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
         condition, condition.fileOffset);
     inferrer.inferStatement(factory, bodyJudgment);
-    inferrer.listener.whileStatement(this, fileOffset);
+    inferrer.listener.whileStatement(this, fileOffset, whileKeyword,
+        leftParenthesis, null, rightParenthesis, null);
   }
 }
 
 /// Concrete shadow object representing a yield statement in kernel form.
 class YieldJudgment extends YieldStatement implements StatementJudgment {
-  YieldJudgment(Expression expression, {bool isYieldStar: false})
-      : super(expression, isYieldStar: isYieldStar);
+  final Token yieldKeyword;
+  final Token star;
+  final Token semicolon;
+
+  YieldJudgment(
+      this.yieldKeyword, this.star, Expression expression, this.semicolon)
+      : super(expression, isYieldStar: star != null);
 
   ExpressionJudgment get judgment => expression;
 
@@ -3086,7 +3626,8 @@
     }
     closureContext.handleYield(
         inferrer, isYieldStar, judgment.inferredType, expression, fileOffset);
-    inferrer.listener.yieldStatement(this, fileOffset);
+    inferrer.listener
+        .yieldStatement(this, fileOffset, yieldKeyword, star, null, semicolon);
   }
 }
 
@@ -3097,12 +3638,13 @@
   LoadLibraryJudgment(LibraryDependency import) : super(import);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType =
+    inferredType =
         inferrer.typeSchemaEnvironment.futureType(const DynamicType());
+    return null;
   }
 }
 
@@ -3114,17 +3656,22 @@
   CheckLibraryIsLoadedJudgment(LibraryDependency import) : super(import);
 
   @override
-  DartType infer<Expression, Statement, Initializer, Type>(
+  Expression infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType = inferrer.typeSchemaEnvironment.objectType;
+    inferredType = inferrer.typeSchemaEnvironment.objectType;
+    return null;
   }
 }
 
 /// Concrete shadow object representing a named expression.
 class NamedExpressionJudgment extends NamedExpression {
-  NamedExpressionJudgment(String name, Expression value) : super(name, value);
+  final Token nameToken;
+  final Token colon;
+
+  NamedExpressionJudgment(this.nameToken, this.colon, Expression value)
+      : super(nameToken.lexeme, value);
 
   ExpressionJudgment get judgment => value;
 }
@@ -3135,10 +3682,7 @@
   /// `null` if the assignment is not compound.
   final Procedure combiner;
 
-  /// The inferred type of the assignment expression.
-  final DartType type;
-
-  _ComplexAssignmentInferenceResult(this.combiner, this.type);
+  _ComplexAssignmentInferenceResult(this.combiner);
 }
 
 class _UnfinishedCascade extends Expression {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index c436163..2608d35 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -343,8 +343,19 @@
       // method. Similarly considerations apply to separate compilation. It
       // could also make sense to add a way to mark .dill files as having
       // compile-time errors.
-      KernelProcedureBuilder mainBuilder = new KernelProcedureBuilder(null, 0,
-          null, "#main", null, null, ProcedureKind.Method, library, -1, -1, -1);
+      KernelProcedureBuilder mainBuilder = new KernelProcedureBuilder(
+          null,
+          0,
+          null,
+          "#main",
+          null,
+          null,
+          ProcedureKind.Method,
+          library,
+          -1,
+          -1,
+          -1,
+          -1);
       library.addBuilder(mainBuilder.name, mainBuilder, -1);
       mainBuilder.body = new Block(new List<Statement>.from(errors.map(
           (LocatedMessage message) => new ExpressionStatement(new Throw(
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 571d7f9..8524f51 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -53,6 +53,7 @@
                 <DartType>[const DynamicType()])),
         fileUri: parent.target.fileUri,
         isStatic: true)
+      ..startFileOffset = charOffset
       ..fileOffset = charOffset;
     return tearoff;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
index e3aac90..ee0bbb2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
@@ -11,7 +11,11 @@
 import 'factory.dart' show Factory;
 
 import 'kernel_shadow_ast.dart'
-    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+    show
+        ExpressionJudgment,
+        InitializerJudgment,
+        StatementJudgment,
+        SwitchCaseJudgment;
 
 /// Implementation of [Factory] for use during top level type inference, when
 /// no representation of the code semantics needs to be created (only the type
@@ -64,8 +68,13 @@
       bool value, DartType inferredType) {}
 
   @override
-  void breakStatement(StatementJudgment judgment, int fileOffset,
-      Token breakKeyword, void label, Token semicolon) {}
+  void breakStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token breakKeyword,
+      void label,
+      Token semicolon,
+      covariant void labelBinder) {}
 
   @override
   void cascadeExpression(
@@ -85,9 +94,9 @@
       Token rightParenthesis,
       void body,
       DartType guardType,
-      int exceptionOffset,
+      covariant void exceptionBinder,
       DartType exceptionType,
-      int stackTraceOffset,
+      covariant void stackTraceBinder,
       DartType stackTraceType) {
     return judgment;
   }
@@ -108,12 +117,22 @@
       Node expressionTarget, DartType inferredType) {}
 
   @override
-  void continueStatement(StatementJudgment judgment, int fileOffset,
-      Token continueKeyword, void label, Token semicolon) {}
+  void continueStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant void labelBinder) {}
 
   @override
-  void continueSwitchStatement(StatementJudgment judgment, int fileOffset,
-      Token continueKeyword, void label, Token semicolon) {}
+  void continueSwitchStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant void labelBinder) {}
 
   @override
   void deferredCheck(
@@ -136,6 +155,9 @@
       double value, DartType inferredType) {}
 
   @override
+  void emptyStatement(Token semicolon) {}
+
+  @override
   void expressionStatement(StatementJudgment judgment, int fileOffset,
       void expression, Token semicolon) {}
 
@@ -154,19 +176,43 @@
   void forInStatement(
       StatementJudgment judgment,
       int fileOffset,
-      int variableOffset,
-      DartType variableType,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      Object loopVariable,
+      Token identifier,
+      Token inKeyword,
+      void iterator,
+      Token rightParenthesis,
+      void body,
+      covariant void loopVariableBinder,
+      DartType loopVariableType,
       int writeOffset,
       DartType writeVariableType,
       int writeVariableDeclarationOffset,
       Node writeTarget) {}
 
   @override
-  void forStatement(StatementJudgment judgment, int fileOffset) {}
+  void forStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token forKeyword,
+      Token leftParenthesis,
+      void variableDeclarationList,
+      void initialization,
+      Token leftSeparator,
+      void condition,
+      Token rightSeparator,
+      void updaters,
+      Token rightParenthesis,
+      void body) {}
 
   @override
-  void functionDeclaration(
-      StatementJudgment judgment, int fileOffset, FunctionType inferredType) {}
+  void functionDeclaration(covariant void binder, FunctionType inferredType) {}
+
+  @override
+  void binderForFunctionDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {}
 
   @override
   void functionExpression(
@@ -221,11 +267,25 @@
       DartType inferredType) {}
 
   @override
-  void labeledStatement(StatementJudgment judgment, int fileOffset) {}
+  void labeledStatement(List<Object> labels, void statement) {}
+
+  @override
+  void statementLabel(covariant void binder, Token label, Token colon) {}
+
+  @override
+  void binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {}
 
   @override
   void listLiteral(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token constKeyword,
+      Object typeArguments,
+      Token leftBracket,
+      void elements,
+      Token rightBracket,
+      DartType inferredType) {}
 
   @override
   void logicalExpression(
@@ -238,7 +298,18 @@
 
   @override
   void mapLiteral(
-      ExpressionJudgment judgment, int fileOffset, DartType typeContext) {}
+      ExpressionJudgment judgment,
+      int fileOffset,
+      Token constKeyword,
+      void typeArguments,
+      Token leftBracket,
+      void entries,
+      Token rightBracket,
+      DartType inferredType) {}
+
+  @override
+  void mapLiteralEntry(
+      Object judgment, int fileOffset, void key, Token separator, void value) {}
 
   @override
   void methodInvocation(
@@ -262,8 +333,8 @@
       DartType inferredType) {}
 
   @override
-  void namedFunctionExpression(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+  void namedFunctionExpression(ExpressionJudgment judgment,
+      covariant void binder, DartType inferredType) {}
 
   @override
   void not(ExpressionJudgment judgment, int fileOffset, Token operator,
@@ -359,7 +430,27 @@
       Object argumentList) {}
 
   @override
-  void switchStatement(StatementJudgment judgment, int fileOffset) {}
+  void switchCase(SwitchCaseJudgment judgment, List<Object> labels,
+      Token keyword, void expression, Token colon, List<void> statements) {}
+
+  @override
+  void switchLabel(covariant void binder, Token label, Token colon) {}
+
+  @override
+  void binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+  @override
+  void switchStatement(
+      StatementJudgment judgment,
+      int fileOffset,
+      Token switchKeyword,
+      Token leftParenthesis,
+      void expression,
+      Token rightParenthesis,
+      Token leftBracket,
+      void members,
+      Token rightBracket) {}
 
   @override
   void symbolLiteral(
@@ -382,7 +473,8 @@
   void tryCatch(StatementJudgment judgment, int fileOffset) {}
 
   @override
-  void tryFinally(StatementJudgment judgment, int fileOffset) {}
+  void tryFinally(StatementJudgment judgment, int fileOffset, Token tryKeyword,
+      void body, void catchClauses, Token finallyKeyword, void finallyBlock) {}
 
   @override
   void typeLiteral(ExpressionJudgment judgment, int fileOffset,
@@ -398,20 +490,15 @@
       DartType inferredType) {}
 
   @override
-  void variableDeclaration(StatementJudgment judgment, int fileOffset,
-      DartType statementType, DartType inferredType) {}
+  void variableDeclaration(
+      covariant void binder, DartType statementType, DartType inferredType) {}
+
+  void binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {}
 
   @override
-  void variableGet(
-      ExpressionJudgment judgment,
-      int fileOffset,
-      bool isInCascade,
-      int expressionVariableDeclarationOffset,
-      DartType inferredType) {}
-
-  @override
-  void variableSet(
-      ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+  void variableGet(ExpressionJudgment judgment, int fileOffset,
+      bool isInCascade, covariant void variableBinder, DartType inferredType) {}
 
   @override
   void whileStatement(
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 0f1081f..81b72d7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -2,22 +2,42 @@
 // 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.
 
-import 'kernel_builder.dart'
-    show
-        TypeBuilder,
-        TypeVariableBuilder,
-        KernelFormalParameterBuilder,
-        KernelTypeBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeVariableBuilder,
-        KernelClassBuilder,
-        KernelFunctionTypeBuilder,
-        NamedTypeBuilder,
-        FormalParameterBuilder,
-        FunctionTypeBuilder;
+import 'package:kernel/ast.dart' show TypeParameter;
+
+import 'package:kernel/type_algebra.dart' show containsTypeVariable;
 
 import 'package:kernel/util/graph.dart' show Graph, computeStrongComponents;
 
+import 'kernel_builder.dart'
+    show
+        ClassBuilder,
+        FormalParameterBuilder,
+        FunctionTypeAliasBuilder,
+        FunctionTypeBuilder,
+        KernelClassBuilder,
+        KernelFormalParameterBuilder,
+        KernelFunctionTypeBuilder,
+        KernelNamedTypeBuilder,
+        KernelTypeBuilder,
+        KernelTypeVariableBuilder,
+        NamedTypeBuilder,
+        TypeBuilder,
+        TypeDeclarationBuilder,
+        TypeVariableBuilder;
+
+import '../dill/dill_class_builder.dart' show DillClassBuilder;
+
+import '../dill/dill_typedef_builder.dart' show DillFunctionTypeAliasBuilder;
+
+import '../fasta_codes.dart'
+    show
+        LocatedMessage,
+        templateBoundIssueViaCycleNonSimplicity,
+        templateBoundIssueViaLoopNonSimplicity,
+        templateBoundIssueViaRawTypeWithNonSimpleBounds,
+        templateNonSimpleBoundViaReference,
+        templateNonSimpleBoundViaVariable;
+
 KernelTypeBuilder substituteRange(
     KernelTypeBuilder type,
     Map<TypeVariableBuilder, KernelTypeBuilder> upperSubstitution,
@@ -236,3 +256,440 @@
     return edges[index];
   }
 }
+
+/// Finds all type builders for [variable] in [type].
+///
+/// Returns list of the found type builders.
+List<NamedTypeBuilder<TypeBuilder, Object>> findVariableUsesInType(
+  TypeVariableBuilder<TypeBuilder, Object> variable,
+  TypeBuilder type,
+) {
+  var uses = <NamedTypeBuilder<TypeBuilder, Object>>[];
+  if (type is NamedTypeBuilder) {
+    if (type.declaration == variable) {
+      uses.add(type);
+    } else {
+      if (type.arguments != null) {
+        for (TypeBuilder argument in type.arguments) {
+          uses.addAll(findVariableUsesInType(variable, argument));
+        }
+      }
+    }
+  } else if (type is FunctionTypeBuilder) {
+    uses.addAll(findVariableUsesInType(variable, type.returnType));
+    if (type.typeVariables != null) {
+      for (TypeVariableBuilder<TypeBuilder, Object> dependentVariable
+          in type.typeVariables) {
+        if (dependentVariable.bound != null) {
+          uses.addAll(
+              findVariableUsesInType(variable, dependentVariable.bound));
+        }
+        if (dependentVariable.defaultType != null) {
+          uses.addAll(
+              findVariableUsesInType(variable, dependentVariable.defaultType));
+        }
+      }
+    }
+    if (type.formals != null) {
+      for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+        uses.addAll(findVariableUsesInType(variable, formal.type));
+      }
+    }
+  }
+  return uses;
+}
+
+/// Finds those of [variables] that reference other [variables] in their bounds.
+///
+/// Returns flattened list of pairs.  The first element in the pair is the type
+/// variable builder from [variables] that references other [variables] in its
+/// bound.  The second element in the pair is the list of found references
+/// represented as type builders.
+List<Object> findInboundReferences(
+    List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+  var variablesAndDependencies = <Object>[];
+  for (TypeVariableBuilder<TypeBuilder, Object> dependent in variables) {
+    var dependencies = <NamedTypeBuilder<TypeBuilder, Object>>[];
+    for (TypeVariableBuilder<TypeBuilder, Object> dependence in variables) {
+      List<NamedTypeBuilder<TypeBuilder, Object>> uses =
+          findVariableUsesInType(dependence, dependent.bound);
+      if (uses.length != 0) {
+        dependencies.addAll(uses);
+      }
+    }
+    if (dependencies.length != 0) {
+      variablesAndDependencies.add(dependent);
+      variablesAndDependencies.add(dependencies);
+    }
+  }
+  return variablesAndDependencies;
+}
+
+/// Finds raw generic types in [type] with inbound references in type variables.
+///
+/// Returns flattened list of pairs.  The first element in the pair is the found
+/// raw generic type.  The second element in the pair is the list of type
+/// variables of that type with inbound references in the format specified in
+/// [findInboundReferences].
+List<Object> findRawTypesWithInboundReferences(TypeBuilder type) {
+  var typesAndDependencies = <Object>[];
+  if (type is NamedTypeBuilder<TypeBuilder, Object>) {
+    if (type.arguments == null) {
+      TypeDeclarationBuilder<TypeBuilder, Object> declaration =
+          type.declaration;
+      if (declaration is DillClassBuilder) {
+        bool hasInbound = false;
+        List<TypeParameter> typeParameters = declaration.target.typeParameters;
+        for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
+          if (containsTypeVariable(
+              typeParameters[i].bound, typeParameters.toSet())) {
+            hasInbound = true;
+          }
+        }
+        if (hasInbound) {
+          typesAndDependencies.add(type);
+          typesAndDependencies.add(const <Object>[]);
+        }
+      } else if (declaration is DillFunctionTypeAliasBuilder) {
+        bool hasInbound = false;
+        List<TypeParameter> typeParameters = declaration.target.typeParameters;
+        for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
+          if (containsTypeVariable(
+              typeParameters[i].bound, typeParameters.toSet())) {
+            hasInbound = true;
+          }
+        }
+        if (hasInbound) {
+          typesAndDependencies.add(type);
+          typesAndDependencies.add(const <Object>[]);
+        }
+      } else if (declaration is ClassBuilder<TypeBuilder, Object> &&
+          declaration.typeVariables != null) {
+        List<Object> dependencies =
+            findInboundReferences(declaration.typeVariables);
+        if (dependencies.length != 0) {
+          typesAndDependencies.add(type);
+          typesAndDependencies.add(dependencies);
+        }
+      } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+          declaration.typeVariables != null) {
+        List<Object> dependencies =
+            findInboundReferences(declaration.typeVariables);
+        if (dependencies.length != 0) {
+          typesAndDependencies.add(type);
+          typesAndDependencies.add(dependencies);
+        }
+      }
+    } else {
+      for (TypeBuilder argument in type.arguments) {
+        typesAndDependencies
+            .addAll(findRawTypesWithInboundReferences(argument));
+      }
+    }
+  } else if (type is FunctionTypeBuilder) {
+    typesAndDependencies
+        .addAll(findRawTypesWithInboundReferences(type.returnType));
+    if (type.typeVariables != null) {
+      for (TypeVariableBuilder<TypeBuilder, Object> variable
+          in type.typeVariables) {
+        if (variable.bound != null) {
+          typesAndDependencies
+              .addAll(findRawTypesWithInboundReferences(variable.bound));
+        }
+        if (variable.defaultType != null) {
+          typesAndDependencies
+              .addAll(findRawTypesWithInboundReferences(variable.defaultType));
+        }
+      }
+    }
+    if (type.formals != null) {
+      for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+        typesAndDependencies
+            .addAll(findRawTypesWithInboundReferences(formal.type));
+      }
+    }
+  }
+  return typesAndDependencies;
+}
+
+/// Finds issues by raw generic types with inbound references in type variables.
+///
+/// Returns flattened list of triplets.  The first element of the triplet is the
+/// [TypeDeclarationBuilder] for the type variable from [variables] that has raw
+/// generic types with inbound references in its bound.  The second element of
+/// the triplet is the error message.  The third element is the context.
+List<Object> getInboundReferenceIssues(
+    List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+  var issues = <Object>[];
+  for (TypeVariableBuilder<TypeBuilder, Object> variable in variables) {
+    if (variable.bound != null) {
+      List<Object> rawTypesAndMutualDependencies =
+          findRawTypesWithInboundReferences(variable.bound);
+      for (int i = 0; i < rawTypesAndMutualDependencies.length; i += 2) {
+        NamedTypeBuilder<TypeBuilder, Object> type =
+            rawTypesAndMutualDependencies[i];
+        List<Object> variablesAndDependencies =
+            rawTypesAndMutualDependencies[i + 1];
+        for (int j = 0; j < variablesAndDependencies.length; j += 2) {
+          TypeVariableBuilder<TypeBuilder, Object> dependent =
+              variablesAndDependencies[j];
+          List<NamedTypeBuilder<TypeBuilder, Object>> dependencies =
+              variablesAndDependencies[j + 1];
+          for (NamedTypeBuilder<TypeBuilder, Object> dependency
+              in dependencies) {
+            issues.add(variable);
+            issues.add(templateBoundIssueViaRawTypeWithNonSimpleBounds
+                .withArguments(type.declaration.name));
+            issues.add(<LocatedMessage>[
+              templateNonSimpleBoundViaVariable
+                  .withArguments(dependency.declaration.name)
+                  .withLocation(dependent.fileUri, dependent.charOffset,
+                      dependent.name.length)
+            ]);
+          }
+        }
+        if (variablesAndDependencies.length == 0) {
+          // The inbound references are in a compiled declaration in a .dill.
+          issues.add(variable);
+          issues.add(templateBoundIssueViaRawTypeWithNonSimpleBounds
+              .withArguments(type.declaration.name));
+          issues.add(const <LocatedMessage>[]);
+        }
+      }
+    }
+  }
+  return issues;
+}
+
+/// Finds raw type paths starting from those in [start] and ending with [end].
+///
+/// Returns list of found paths.  Each path is represented as a list of
+/// alternating builders of the raw generic types from the path and builders of
+/// type variables of the immediately preceding types that contain the reference
+/// to the next raw generic type in the path.  The list ends with the type
+/// builder for [end].
+///
+/// The reason for putting the type variables into the paths as well as for
+/// using type for [start], and not the corresponding type declaration,
+/// is better error reporting.
+List<List<Object>> findRawTypePathsToDeclaration(
+    TypeBuilder start, TypeDeclarationBuilder<TypeBuilder, Object> end,
+    [Set<TypeDeclarationBuilder<TypeBuilder, Object>> visited]) {
+  visited ??= new Set<TypeDeclarationBuilder<TypeBuilder, Object>>.identity();
+  var paths = <List<Object>>[];
+  if (start is NamedTypeBuilder<TypeBuilder, Object>) {
+    TypeDeclarationBuilder<TypeBuilder, Object> declaration = start.declaration;
+    if (start.arguments == null) {
+      if (start.declaration == end) {
+        paths.add(<Object>[start]);
+      } else if (visited.add(start.declaration)) {
+        if (declaration is ClassBuilder<TypeBuilder, Object> &&
+            declaration.typeVariables != null) {
+          for (TypeVariableBuilder<TypeBuilder, Object> variable
+              in declaration.typeVariables) {
+            if (variable.bound != null) {
+              for (List<Object> path in findRawTypePathsToDeclaration(
+                  variable.bound, end, visited)) {
+                paths.add(<Object>[start, variable]..addAll(path));
+              }
+            }
+          }
+        } else if (declaration
+                is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+            declaration.typeVariables != null) {
+          for (TypeVariableBuilder<TypeBuilder, Object> variable
+              in declaration.typeVariables) {
+            if (variable.bound != null) {
+              for (List<Object> dependencyPath in findRawTypePathsToDeclaration(
+                  variable.bound, end, visited)) {
+                paths.add(<Object>[start, variable]..addAll(dependencyPath));
+              }
+            }
+          }
+        }
+        visited.remove(start.declaration);
+      }
+    } else {
+      for (TypeBuilder argument in start.arguments) {
+        paths.addAll(findRawTypePathsToDeclaration(argument, end, visited));
+      }
+    }
+  } else if (start is FunctionTypeBuilder) {
+    paths.addAll(findRawTypePathsToDeclaration(start.returnType, end, visited));
+    if (start.typeVariables != null) {
+      for (TypeVariableBuilder<TypeBuilder, Object> variable
+          in start.typeVariables) {
+        if (variable.bound != null) {
+          paths.addAll(
+              findRawTypePathsToDeclaration(variable.bound, end, visited));
+        }
+        if (variable.defaultType != null) {
+          paths.addAll(findRawTypePathsToDeclaration(
+              variable.defaultType, end, visited));
+        }
+      }
+    }
+    if (start.formals != null) {
+      for (FormalParameterBuilder<TypeBuilder> formal in start.formals) {
+        paths.addAll(findRawTypePathsToDeclaration(formal.type, end, visited));
+      }
+    }
+  }
+  return paths;
+}
+
+/// Finds raw generic type cycles ending and starting with [declaration].
+///
+/// Returns list of found cycles.  Each cycle is represented as a list of
+/// alternating raw generic types from the cycle and type variables of the
+/// immediately preceding type that reference the next type in the cycle.  The
+/// cycle starts with a type variable from [declaration] and ends with a type
+/// that has [declaration] as its declaration.
+///
+/// The reason for putting the type variables into the cycles is better error
+/// reporting.
+List<List<Object>> findRawTypeCycles(
+    TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+  var cycles = <List<Object>>[];
+  if (declaration is ClassBuilder<TypeBuilder, Object> &&
+      declaration.typeVariables != null) {
+    for (TypeVariableBuilder<TypeBuilder, Object> variable
+        in declaration.typeVariables) {
+      if (variable.bound != null) {
+        for (List<Object> path
+            in findRawTypePathsToDeclaration(variable.bound, declaration)) {
+          cycles.add(<Object>[variable]..addAll(path));
+        }
+      }
+    }
+  } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+      declaration.typeVariables != null) {
+    for (TypeVariableBuilder<TypeBuilder, Object> variable
+        in declaration.typeVariables) {
+      if (variable.bound != null) {
+        for (List<Object> dependencyPath
+            in findRawTypePathsToDeclaration(variable.bound, declaration)) {
+          cycles.add(<Object>[variable]..addAll(dependencyPath));
+        }
+      }
+    }
+  }
+  return cycles;
+}
+
+/// Converts raw generic type [cycles] for [declaration] into reportable issues.
+///
+/// The [cycles] are expected to be in the format specified for the return value
+/// of [findRawTypeCycles].
+///
+/// Returns flattened list of triplets.  The first element of the triplet is the
+/// [TypeDeclarationBuilder] for the type variable from [variables] that has raw
+/// generic types with inbound references in its bound.  The second element of
+/// the triplet is the error message.  The third element is the context.
+List<Object> convertRawTypeCyclesIntoIssues(
+    TypeDeclarationBuilder<TypeBuilder, Object> declaration,
+    List<List<Object>> cycles) {
+  List<Object> issues = <Object>[];
+  for (List<Object> cycle in cycles) {
+    if (cycle.length == 2) {
+      // Loop.
+      TypeVariableBuilder<TypeBuilder, Object> variable = cycle[0];
+      NamedTypeBuilder<TypeBuilder, Object> type = cycle[1];
+      issues.add(variable);
+      issues.add(templateBoundIssueViaLoopNonSimplicity
+          .withArguments(type.declaration.name));
+      issues.add(null); // Context.
+    } else {
+      var context = <LocatedMessage>[];
+      for (int i = 0; i < cycle.length; i += 2) {
+        TypeVariableBuilder<TypeBuilder, Object> variable = cycle[i];
+        NamedTypeBuilder<TypeBuilder, Object> type = cycle[i + 1];
+        context.add(templateNonSimpleBoundViaReference
+            .withArguments(type.declaration.name)
+            .withLocation(
+                variable.fileUri, variable.charOffset, variable.name.length));
+      }
+      NamedTypeBuilder<TypeBuilder, Object> firstEncounteredType = cycle[1];
+
+      issues.add(declaration);
+      issues.add(templateBoundIssueViaCycleNonSimplicity.withArguments(
+          declaration.name, firstEncounteredType.declaration.name));
+      issues.add(context);
+    }
+  }
+  return issues;
+}
+
+/// Finds issues by cycles of raw generic types containing [declaration].
+///
+/// Returns flattened list of triplets according to the format specified by
+/// [convertRawTypeCyclesIntoIssues].
+List<Object> getRawTypeCycleIssues(
+    TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+  return convertRawTypeCyclesIntoIssues(
+      declaration, findRawTypeCycles(declaration));
+}
+
+/// Finds non-simplicity issues for the given set of [variables].
+///
+/// The issues are those caused by raw types with inbound references in the
+/// bounds of their type variables.
+///
+/// Returns flattened list of triplets, each triplet representing an issue.  The
+/// first element in the triplet is the type declaration that has the issue.
+/// The second element in the triplet is the error message.  The third element
+/// in the triplet is the context.
+List<Object> getNonSimplicityIssuesForTypeVariables(
+    List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+  if (variables == null) return <Object>[];
+  return getInboundReferenceIssues(variables);
+}
+
+/// Finds non-simplicity issues for the given [declaration].
+///
+/// The issues are those caused by raw types with inbound references in the
+/// bounds of type variables from [declaration] and by cycles of raw types
+/// containing [declaration].
+///
+/// Returns flattened list of triplets, each triplet representing an issue.  The
+/// first element in the triplet is the type declaration that has the issue.
+/// The second element in the triplet is the error message.  The third element
+/// in the triplet is the context.
+List<Object> getNonSimplicityIssuesForDeclaration(
+    TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+  var issues = <Object>[];
+  if (declaration is ClassBuilder<TypeBuilder, Object> &&
+      declaration.typeVariables != null) {
+    issues.addAll(getInboundReferenceIssues(declaration.typeVariables));
+  } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+      declaration.typeVariables != null) {
+    issues.addAll(getInboundReferenceIssues(declaration.typeVariables));
+  }
+  List<List<Object>> cyclesToReport = <List<Object>>[];
+  for (List<Object> cycle in findRawTypeCycles(declaration)) {
+    // To avoid reporting the same error for each element of the cycle, we only
+    // do so if it comes the first in the lexicographical order.  Note that
+    // one-element cycles shouldn't be checked, as they are loops.
+    if (cycle.length == 2) {
+      cyclesToReport.add(cycle);
+    } else {
+      String declarationPathAndName =
+          "${declaration.fileUri}:${declaration.name}";
+      String lexMinPathAndName = null;
+      for (int i = 1; i < cycle.length; i += 2) {
+        NamedTypeBuilder<TypeBuilder, Object> type = cycle[i];
+        String pathAndName =
+            "${type.declaration.fileUri}:${type.declaration.name}";
+        if (lexMinPathAndName == null ||
+            lexMinPathAndName.compareTo(pathAndName) > 0) {
+          lexMinPathAndName = pathAndName;
+        }
+      }
+      if (declarationPathAndName == lexMinPathAndName) {
+        cyclesToReport.add(cycle);
+      }
+    }
+  }
+  issues.addAll(convertRawTypeCyclesIntoIssues(declaration, cyclesToReport));
+  return issues;
+}
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 0abc7d3..a9d32fe 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -392,8 +392,8 @@
   }
 
   @override
-  void beginTypeVariable(Token name) {
-    listener?.beginTypeVariable(name);
+  void beginTypeVariable(Token token) {
+    listener?.beginTypeVariable(token);
   }
 
   @override
@@ -842,13 +842,13 @@
   }
 
   @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
-    listener?.endTypeVariable(token, extendsOrSuper);
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    listener?.endTypeVariable(token, index, extendsOrSuper);
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
-    listener?.endTypeVariables(count, beginToken, endToken);
+  void endTypeVariables(Token beginToken, Token endToken) {
+    listener?.endTypeVariables(beginToken, endToken);
   }
 
   @override
@@ -1285,6 +1285,11 @@
   }
 
   @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    listener?.handleTypeVariablesDefined(token, count);
+  }
+
+  @override
   void handleUnaryPostfixAssignmentExpression(Token token) {
     listener?.handleUnaryPostfixAssignmentExpression(token);
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 601835b..43c121c 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../../scanner/token.dart' show Token;
+import '../../scanner/token.dart' show Token, TokenType;
 
 import '../fasta_codes.dart' show Message, Template, templateExpectedIdentifier;
 
@@ -12,6 +12,8 @@
 
 import 'parser.dart' show Parser;
 
+import 'util.dart' show isOneOfOrEof, optional;
+
 /// Information about the parser state that is passed to the listener at the
 /// time an identifier is encountered. It is also used by the parser for error
 /// recovery when a recovery template is defined.
@@ -269,5 +271,45 @@
   }
 }
 
+/// Return `true` if the given [token] should be treated like the start of
+/// an expression for the purposes of recovery.
+bool looksLikeExpressionStart(Token next) =>
+    next.isIdentifier ||
+    next.isKeyword && !looksLikeStatementStart(next) ||
+    next.type == TokenType.DOUBLE ||
+    next.type == TokenType.HASH ||
+    next.type == TokenType.HEXADECIMAL ||
+    next.type == TokenType.IDENTIFIER ||
+    next.type == TokenType.INT ||
+    next.type == TokenType.STRING ||
+    optional('{', next) ||
+    optional('(', next) ||
+    optional('[', next) ||
+    optional('[]', next) ||
+    optional('<', next) ||
+    optional('!', next) ||
+    optional('-', next) ||
+    optional('~', next) ||
+    optional('++', next) ||
+    optional('--', next);
+
+/// Return `true` if the given [token] should be treated like the start of
+/// a new statement for the purposes of recovery.
+bool looksLikeStatementStart(Token token) => isOneOfOrEof(token, const [
+      'assert',
+      'break',
+      'continue',
+      'do',
+      'final',
+      'for',
+      'if',
+      'return',
+      'switch',
+      'try',
+      'var',
+      'void',
+      'while'
+    ]);
+
 // TODO(ahe): Remove when analyzer supports generalized function syntax.
 typedef _MessageWithArgument<T> = Message Function(T);
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index e8cab59..c79c8a4 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -31,7 +31,7 @@
 
     // Recovery
     parser.reportRecoverableError(identifier, fasta.messageCatchSyntax);
-    if (looksLikeStartOfNextStatement(identifier) ||
+    if (looksLikeStatementStart(identifier) ||
         isOneOfOrEof(identifier, const [',', ')'])) {
       return parser.rewriter.insertSyntheticIdentifier(token);
     } else if (!identifier.isKeywordOrIdentifier) {
@@ -291,16 +291,18 @@
     // Recovery
     parser.reportRecoverableErrorWithToken(
         identifier, fasta.templateExpectedIdentifier);
-    if (identifier.isKeywordOrIdentifier) {
-      if (!isOneOfOrEof(identifier, const ['as', 'is'])) {
-        return identifier;
+    if (!looksLikeStatementStart(identifier)) {
+      if (identifier.isKeywordOrIdentifier) {
+        if (!isOneOfOrEof(identifier, const ['as', 'is'])) {
+          return identifier;
+        }
+      } else if (!identifier.isOperator &&
+          !isOneOfOrEof(identifier,
+              const ['.', ',', '(', ')', '[', ']', '}', '?', ':', ';'])) {
+        // When in doubt, consume the token to ensure we make progress
+        token = identifier;
+        identifier = token.next;
       }
-    } else if (!identifier.isOperator &&
-        !isOneOfOrEof(identifier,
-            const ['.', ',', '(', ')', '[', ']', '}', '?', ':', ';'])) {
-      // When in doubt, consume the token to ensure we make progress
-      token = identifier;
-      identifier = token.next;
     }
     // Insert a synthetic identifier to satisfy listeners.
     return parser.rewriter.insertSyntheticIdentifier(token);
@@ -377,7 +379,7 @@
     // Recovery
     const followingValues = const [':', '=', ',', '(', ')', '[', ']', '{', '}'];
     if (looksLikeStartOfNextClassMember(identifier) ||
-        looksLikeStartOfNextStatement(identifier) ||
+        looksLikeStatementStart(identifier) ||
         isOneOfOrEof(identifier, followingValues)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
@@ -474,7 +476,7 @@
 
     // Recovery
     if (isOneOfOrEof(identifier, const ['.', '(', '{', '=>']) ||
-        looksLikeStartOfNextStatement(identifier)) {
+        looksLikeStatementStart(identifier)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
     } else {
@@ -506,7 +508,7 @@
 
     // Recovery
     if (isOneOfOrEof(identifier, const [':']) ||
-        looksLikeStartOfNextStatement(identifier)) {
+        looksLikeStatementStart(identifier)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
     } else {
@@ -622,7 +624,7 @@
 
     // Recovery
     if (isOneOfOrEof(identifier, const [';', '=', ',', '{', '}']) ||
-        looksLikeStartOfNextStatement(identifier)) {
+        looksLikeStatementStart(identifier)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
     } else {
@@ -664,7 +666,7 @@
     if (isOneOfOrEof(identifier, const ['{', '}', '(', ')', ']']) ||
         looksLikeStartOfNextTopLevelDeclaration(identifier) ||
         looksLikeStartOfNextClassMember(identifier) ||
-        looksLikeStartOfNextStatement(identifier)) {
+        looksLikeStatementStart(identifier)) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
     } else {
@@ -908,7 +910,7 @@
     const followingValues = const ['<', '>', ';', '}', 'extends', 'super'];
     if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
         looksLikeStartOfNextClassMember(identifier) ||
-        looksLikeStartOfNextStatement(identifier) ||
+        looksLikeStatementStart(identifier) ||
         isOneOfOrEof(identifier, followingValues)) {
       parser.reportRecoverableErrorWithToken(
           identifier, fasta.templateExpectedIdentifier);
@@ -944,23 +946,6 @@
 bool looksLikeStartOfNextClassMember(Token token) =>
     token.isModifier || isOneOfOrEof(token, const ['get', 'set', 'void']);
 
-bool looksLikeStartOfNextStatement(Token token) => isOneOfOrEof(token, const [
-      'assert',
-      'break',
-      'const',
-      'continue',
-      'do',
-      'final',
-      'for',
-      'if',
-      'return',
-      'switch',
-      'try',
-      'var',
-      'void',
-      'while'
-    ]);
-
 bool looksLikeStartOfNextTopLevelDeclaration(Token token) =>
     token.isTopLevelKeyword ||
     isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index b75076e..40995c9 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -904,20 +904,28 @@
   /// Substructures:
   /// - Metadata
   /// - Name (identifier)
-  void beginTypeVariable(Token name) {}
+  void beginTypeVariable(Token token) {}
 
-  /// Handle the end of a type formal parameter (e.g. "X extends Y").
+  /// Called when [beginTypeVariable] has been called for all of the variables
+  /// in a group, and before [endTypeVariable] has been called for any of the
+  /// variables in that same group.
+  void handleTypeVariablesDefined(Token token, int count) {}
+
+  /// Handle the end of a type formal parameter (e.g. "X extends Y")
+  /// where [index] is the index of the type variable in the list of
+  /// type variables being declared.
+  ///
   /// Substructures:
   /// - Type bound
   ///
   /// See [beginTypeVariable] for additional substructures.
-  void endTypeVariable(Token token, Token extendsOrSuper) {
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
     logEvent("TypeVariable");
   }
 
   void beginTypeVariables(Token token) {}
 
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
+  void endTypeVariables(Token beginToken, Token endToken) {
     logEvent("TypeVariables");
   }
 
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 4921416..6178e4b 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -49,8 +49,6 @@
         STRING_INTERPOLATION_TOKEN,
         STRING_TOKEN;
 
-import '../util/link.dart' show Link;
-
 import 'assert.dart' show Assert;
 
 import 'async_modifier.dart' show AsyncModifier;
@@ -65,7 +63,8 @@
 
 import 'forwarding_listener.dart' show ForwardingListener;
 
-import 'identifier_context.dart' show IdentifierContext;
+import 'identifier_context.dart'
+    show IdentifierContext, looksLikeExpressionStart;
 
 import 'listener.dart' show Listener;
 
@@ -80,8 +79,6 @@
 
 import 'token_stream_rewriter.dart' show TokenStreamRewriter;
 
-import 'type_continuation.dart' show TypeContinuation;
-
 import 'type_info.dart'
     show
         TypeInfo,
@@ -89,7 +86,6 @@
         computeMethodTypeArguments,
         computeType,
         computeTypeParamOrArg,
-        isGeneralizedFunctionType,
         isValidTypeReference,
         noType,
         noTypeParamOrArg;
@@ -1908,27 +1904,6 @@
     return identifier;
   }
 
-  /// Return `true` if the given [token] should be treated like the start of
-  /// an expression for the purposes of recovery.
-  bool isExpressionStartForRecovery(Token next) =>
-      next.isKeywordOrIdentifier ||
-      next.type == TokenType.DOUBLE ||
-      next.type == TokenType.HASH ||
-      next.type == TokenType.HEXADECIMAL ||
-      next.type == TokenType.IDENTIFIER ||
-      next.type == TokenType.INT ||
-      next.type == TokenType.STRING ||
-      optional('{', next) ||
-      optional('(', next) ||
-      optional('[', next) ||
-      optional('[]', next) ||
-      optional('<', next) ||
-      optional('!', next) ||
-      optional('-', next) ||
-      optional('~', next) ||
-      optional('++', next) ||
-      optional('--', next);
-
   Token expect(String string, Token token) {
     // TODO(danrubel): update all uses of expect(';'...) to ensureSemicolon
     // then add assert(!identical(';', string));
@@ -1940,295 +1915,13 @@
     return token.next;
   }
 
-  /// ```
-  /// typeVariable:
-  ///   metadata? identifier (('extends' | 'super') typeName)?
-  /// ;
-  /// ```
-  Token parseTypeVariable(Token token) {
-    token = parseMetadataStar(token);
-    token = ensureIdentifier(token, IdentifierContext.typeVariableDeclaration);
-    listener.beginTypeVariable(token);
-    Token extendsOrSuper = null;
-    Token next = token.next;
-    if (optional('extends', next) || optional('super', next)) {
-      extendsOrSuper = next;
-      token = parseType(next);
-    } else {
-      listener.handleNoType(token);
-    }
-    listener.endTypeVariable(token.next, extendsOrSuper);
-    return token;
-  }
-
   bool notEofOrValue(String value, Token token) {
     return !identical(token.kind, EOF_TOKEN) &&
         !identical(value, token.stringValue);
   }
 
-  /// Parse a type, if it is appropriate to do so.
-  ///
-  /// If this method can parse a type, it will return the next (non-null) token
-  /// after the type. Otherwise, it returns null.
-  Token parseType(Token token,
-      [TypeContinuation continuation = TypeContinuation.Required,
-      IdentifierContext continuationContext,
-      MemberKind memberKind,
-      Token varFinalOrConst]) {
-    /// True if we've seen the `var` keyword.
-    bool hasVar = false;
-
-    /// The token before [token].
-    Token beforeToken;
-
-    /// The token before the `begin` token.
-    Token beforeBegin;
-
-    /// Where the type begins.
-    Token begin;
-
-    /// Non-null if 'void' is the first token.
-    Token voidToken;
-
-    /// True if the tokens at [begin] looks like a type.
-    bool looksLikeType = false;
-
-    /// True if a type that could be a return type for a generalized function
-    /// type was seen during analysis.
-    bool hasReturnType = false;
-
-    /// The identifier context to use for parsing the type.
-    IdentifierContext context = IdentifierContext.typeReference;
-
-    /// Non-null if type arguments were seen during analysis.
-    Token typeArguments;
-
-    /// The number of function types seen during analysis.
-    int functionTypes = 0;
-
-    /// The tokens before the start of type variables of function types seen
-    /// during analysis. Notice that the tokens in this list might precede
-    /// either `'<'` or `'('` as not all function types have type parameters.
-    /// Also, it is safe to assume that token.endGroup will return
-    /// non-null for all of the tokens following these tokens.
-    Link<Token> typeVariableStarters = const Link<Token>();
-
-    {
-      // Analyse the next tokens to see if they could be a type.
-
-      beforeToken = beforeBegin = token;
-      token = begin = token.next;
-
-      if (optional("void", token)) {
-        // `void` is a type.
-        looksLikeType = true;
-        beforeToken = voidToken = token;
-        token = token.next;
-      } else if (isValidTypeReference(token) &&
-          !isGeneralizedFunctionType(token)) {
-        // We're looking at an identifier that could be a type (or `dynamic`).
-        looksLikeType = true;
-        beforeToken = token;
-        token = token.next;
-        if (optional(".", token) && isValidTypeReference(token.next)) {
-          // We're looking at `prefix '.' identifier`.
-          context = IdentifierContext.prefixedTypeReference;
-          beforeToken = token.next;
-          token = beforeToken.next;
-        }
-        if (optional("<", token)) {
-          Token close = token.endGroup;
-          if (close != null &&
-              (optional(">", close) || optional(">>", close))) {
-            // We found some type arguments.
-            typeArguments = token;
-            beforeToken = close;
-            token = close.next;
-          }
-        }
-      } else if (token.isModifier && isValidTypeReference(token.next)) {
-        // Recovery - report error and skip modifier
-        reportRecoverableErrorWithToken(token, fasta.templateExpectedType);
-        return parseType(token, continuation, continuationContext, memberKind);
-      }
-
-      // If what we have seen so far looks like a type, that could be a return
-      // type for a generalized function type.
-      hasReturnType = looksLikeType;
-
-      while (optional("Function", token)) {
-        Token typeVariableStart = token;
-        if (optional("<", token.next)) {
-          Token close = token.next.endGroup;
-          if (close != null && optional(">", close)) {
-            beforeToken = previousToken(token, close);
-            token = close;
-          } else {
-            break; // Not a function type.
-          }
-        }
-        if (optional("(", token.next)) {
-          // This is a function type.
-          Token close = token.next.endGroup;
-          assert(optional(")", close));
-          looksLikeType = true;
-          functionTypes++;
-          typeVariableStarters =
-              typeVariableStarters.prepend(typeVariableStart);
-          beforeToken = close;
-          token = close.next;
-        } else {
-          break; // Not a function type.
-        }
-      }
-    }
-
-    /// Call this function when it's known that [begin] is a type. This
-    /// function will call the appropriate event methods on [listener] to
-    /// handle the type.
-    Token commitType() {
-      int count = 0;
-      for (Token typeVariableStart in typeVariableStarters) {
-        count++;
-        parseTypeVariablesOpt(typeVariableStart);
-        listener.beginFunctionType(begin);
-      }
-      assert(count == functionTypes);
-
-      if (functionTypes > 0 && !hasReturnType) {
-        // A function type without return type.
-        // Push the non-existing return type first. The loop below will
-        // generate the full type.
-        listener.handleNoType(beforeBegin);
-        token = beforeBegin;
-      } else if (voidToken != null) {
-        listener.handleVoidKeyword(voidToken);
-        token = voidToken;
-      } else {
-        token = ensureIdentifier(beforeBegin, context);
-        token = parseQualifiedRestOpt(
-            token, IdentifierContext.typeReferenceContinuation);
-        assert(typeArguments == null || typeArguments == token.next);
-        token = parseTypeArgumentsOpt(token);
-        listener.handleType(begin, token.next);
-      }
-
-      for (int i = 0; i < functionTypes; i++) {
-        Token next = token.next;
-        assert(optional('Function', next));
-        Token functionToken = next;
-        if (optional("<", next.next)) {
-          // Skip type parameters, they were parsed above.
-          next = next.next.endGroup;
-        }
-        token = parseFormalParametersRequiredOpt(
-            next, MemberKind.GeneralizedFunctionType);
-        listener.endFunctionType(functionToken, token.next);
-      }
-
-      if (hasVar) {
-        reportRecoverableError(begin, fasta.messageTypeAfterVar);
-      }
-
-      return token;
-    }
-
-    switch (continuation) {
-      case TypeContinuation.Required:
-        // If the token after the type is not an identifier,
-        // the report a missing type
-        if (!token.isIdentifier) {
-          if (memberKind == MemberKind.TopLevelField ||
-              memberKind == MemberKind.NonStaticField ||
-              memberKind == MemberKind.StaticField ||
-              memberKind == MemberKind.Local) {
-            reportRecoverableError(
-                begin, fasta.messageMissingConstFinalVarOrType);
-            listener.handleNoType(beforeBegin);
-            return beforeBegin;
-          }
-        }
-        return commitType();
-
-      optional:
-      case TypeContinuation.Optional:
-        if (looksLikeType) {
-          if (functionTypes > 0) {
-            return commitType(); // Parse function type.
-          }
-          if (voidToken != null) {
-            listener.handleVoidKeyword(voidToken);
-            return voidToken;
-          }
-          if (token.isIdentifier || optional('this', token)) {
-            return commitType(); // Parse type.
-          }
-        }
-        listener.handleNoType(beforeBegin);
-        return beforeBegin;
-
-      case TypeContinuation.OptionalAfterVar:
-        hasVar = true;
-        continue optional;
-    }
-
-    throw "Internal error: Unhandled continuation '$continuation'.";
-  }
-
-  Token parseTypeArgumentsOpt(Token token) {
-    Token next = token.next;
-    if (optional('<', next)) {
-      BeginToken begin = next;
-      rewriteLtEndGroupOpt(begin);
-      listener.beginTypeArguments(begin);
-      int count = 0;
-      do {
-        token = parseType(next);
-        next = token.next;
-        ++count;
-      } while (optional(',', next));
-      if (next == begin.endToken) {
-        token = next;
-      } else if (begin.endToken != null) {
-        reportRecoverableError(
-            next, fasta.templateExpectedToken.withArguments('>'));
-        token = begin.endToken;
-      } else {
-        token = begin.endToken = ensureGt(token);
-      }
-      listener.endTypeArguments(count, begin, token);
-    } else {
-      listener.handleNoTypeArguments(next);
-    }
-    return token;
-  }
-
   Token parseTypeVariablesOpt(Token token) {
-    Token next = token.next;
-    if (optional('<', next)) {
-      BeginToken begin = next;
-      rewriteLtEndGroupOpt(begin);
-      listener.beginTypeVariables(begin);
-      int count = 0;
-      do {
-        token = parseTypeVariable(next);
-        next = token.next;
-        ++count;
-      } while (optional(',', next));
-      if (next == begin.endToken) {
-        token = next;
-      } else if (begin.endToken != null) {
-        reportRecoverableError(
-            next, fasta.templateExpectedToken.withArguments('>'));
-        token = begin.endToken;
-      } else {
-        token = begin.endToken = ensureGt(token);
-      }
-      listener.endTypeVariables(count, begin, token);
-    } else {
-      listener.handleNoTypeVariables(next);
-    }
-    return token;
+    return computeTypeParamOrArg(token, true).parseVariables(token, this);
   }
 
   /// Parse a top level field or function.
@@ -4297,7 +3990,7 @@
         }
 
         // Recovery
-        if (!isExpressionStartForRecovery(next)) {
+        if (!looksLikeExpressionStart(next)) {
           if (beginToken.endGroup.isSynthetic) {
             // The scanner has already reported an error,
             // but inserted `]` in the wrong place.
@@ -4357,7 +4050,7 @@
           break;
         }
         // Recovery
-        if (isExpressionStartForRecovery(next)) {
+        if (looksLikeExpressionStart(next)) {
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           next = rewriteAndRecover(
@@ -4774,7 +4467,7 @@
           break;
         }
         // Recovery
-        if (isExpressionStartForRecovery(next)) {
+        if (looksLikeExpressionStart(next)) {
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           next = rewriteAndRecover(
@@ -5761,31 +5454,35 @@
     Token commaToken = null;
     bool old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
-    token = parseExpression(token).next;
-    if (optional(',', token)) {
-      if (optional(')', token.next)) {
-        token = token.next;
-      } else {
+
+    token = parseExpression(token);
+    if (optional(',', token.next)) {
+      token = token.next;
+      if (!optional(')', token.next)) {
         commaToken = token;
-        token = parseExpression(token).next;
-      }
-    }
-    if (optional(',', token)) {
-      Token firstExtra = token.next;
-      if (optional(')', firstExtra)) {
-        token = firstExtra;
-      } else {
-        while (optional(',', token)) {
-          Token begin = token.next;
-          token = parseExpression(token).next;
-          // TODO(danrubel): Consider removing the message argument.
-          listener.handleExtraneousExpression(
-              begin, fasta.messageAssertExtraneousArgument);
+        token = parseExpression(token);
+        if (optional(',', token.next)) {
+          // Trailing comma is ignored.
+          token = token.next;
         }
-        reportRecoverableError(
-            firstExtra, fasta.messageAssertExtraneousArgument);
       }
     }
+
+    Token endGroup = leftParenthesis.endGroup;
+    if (token.next == endGroup) {
+      token = endGroup;
+    } else {
+      // Recovery
+      if (endGroup.isSynthetic) {
+        // The scanner did not place the synthetic ')' correctly, so move it.
+        token = rewriter.moveSynthetic(token, endGroup);
+      } else {
+        reportRecoverableErrorWithToken(
+            token.next, fasta.templateUnexpectedToken);
+        token = endGroup;
+      }
+    }
+
     assert(optional(')', token));
     mayParseFunctionExpressions = old;
     if (kind == Assert.Expression) {
diff --git a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart b/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
deleted file mode 100644
index 32effd3..0000000
--- a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library fasta.parser.type_continuation;
-
-/// Indication of how the parser should continue after (attempting) to parse a
-/// type.
-///
-/// Depending on the continuation, the parser may not parse a type at all.
-enum TypeContinuation {
-  /// Indicates that a type is unconditionally expected.
-  Required,
-
-  /// Indicates that a type may follow. If the following matches one of these
-  /// productions, it is parsed as a type:
-  ///
-  ///  - `'void'`
-  ///  - `'Function' ( '(' | '<' )`
-  ///  - `identifier ('.' identifier)? ('<' ... '>')? identifer`
-  ///
-  /// Otherwise, do nothing.
-  Optional,
-
-  /// Same as [Optional], but we have seen `var`.
-  OptionalAfterVar,
-}
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index 1370d5a..9a1a945 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -513,10 +513,11 @@
     listener.endMetadataStar(0);
     listener.handleIdentifier(token, IdentifierContext.typeVariableDeclaration);
     listener.beginTypeVariable(token);
+    listener.handleTypeVariablesDefined(token, 1);
     listener.handleNoType(token);
     token = processEndGroup(token, start, parser);
-    listener.endTypeVariable(token, null);
-    listener.endTypeVariables(1, start, token);
+    listener.endTypeVariable(token, 0, null);
+    listener.endTypeVariables(start, token);
     return token;
   }
 
@@ -654,25 +655,32 @@
   @override
   Token parseVariables(Token token, Parser parser) {
     Token next = start;
+    Listener listener = parser.listener;
+    listener.beginTypeVariables(start);
     Token innerEndGroup = processBeginGroup(start, parser);
-    parser.listener.beginTypeVariables(start);
     int count = 0;
+
+    Link<Token> typeStarts = const Link<Token>();
+    Link<TypeInfo> superTypeInfos = const Link<TypeInfo>();
+
     while (true) {
       token = parser.parseMetadataStar(next);
       token = parser.ensureIdentifier(
           token, IdentifierContext.typeVariableDeclaration);
-      parser.listener.beginTypeVariable(token);
-      Token extendsOrSuper = null;
+      listener.beginTypeVariable(token);
+      typeStarts = typeStarts.prepend(token);
+
       next = token.next;
       if (optional('extends', next) || optional('super', next)) {
-        extendsOrSuper = next;
-        token = computeType(next, true, inDeclaration, innerEndGroup)
-            .ensureTypeOrVoid(next, parser);
+        TypeInfo typeInfo =
+            computeType(next, true, inDeclaration, innerEndGroup);
+        token = typeInfo.skipType(next);
         next = token.next;
+        superTypeInfos = superTypeInfos.prepend(typeInfo);
       } else {
-        parser.listener.handleNoType(token);
+        superTypeInfos = superTypeInfos.prepend(null);
       }
-      parser.listener.endTypeVariable(next, extendsOrSuper);
+
       ++count;
       if (!optional(',', next)) {
         if (!looksLikeTypeParamOrArg(inDeclaration, next)) {
@@ -688,8 +696,39 @@
             .next;
       }
     }
+
+    assert(count > 0);
+    assert(typeStarts.slowLength() == count);
+    assert(superTypeInfos.slowLength() == count);
+    listener.handleTypeVariablesDefined(token, count);
+
+    token = null;
+    while (typeStarts.isNotEmpty) {
+      Token token2 = typeStarts.head;
+      TypeInfo typeInfo = superTypeInfos.head;
+
+      Token extendsOrSuper = null;
+      Token next2 = token2.next;
+      if (typeInfo != null) {
+        assert(optional('extends', next2) || optional('super', next2));
+        extendsOrSuper = next2;
+        token2 = typeInfo.ensureTypeOrVoid(next2, parser);
+        next2 = token2.next;
+      } else {
+        assert(!optional('extends', next2) && !optional('super', next2));
+        listener.handleNoType(token2);
+      }
+      // Type variables are "completed" in reverse order, so capture the last
+      // consumed token from the first "completed" type variable.
+      token ??= token2;
+      listener.endTypeVariable(next2, --count, extendsOrSuper);
+
+      typeStarts = typeStarts.tail;
+      superTypeInfos = superTypeInfos.tail;
+    }
+
     end = processEndGroup(token, start, parser);
-    parser.listener.endTypeVariables(count, start, end);
+    listener.endTypeVariables(start, end);
     return end;
   }
 
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 961ebe3..722435f 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -447,13 +447,18 @@
   }
 
   @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
-    debugEvent("TypeVariable");
+  void beginTypeVariable(Token token) {
+    debugEvent("beginTypeVariable");
     discard(2); // Name and metadata.
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    debugEvent("endTypeVariable");
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
     debugEvent("TypeVariables");
   }
 
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 3a98d19..5fe18f8 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -80,8 +80,7 @@
     show
         KernelFormalParameterBuilder,
         KernelNamedTypeBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder;
+        KernelTypeBuilder;
 
 enum MethodBody {
   Abstract,
@@ -130,10 +129,10 @@
     String postfix = popIfNotNull(periodBeforeName);
     List<TypeBuilder> typeArguments = pop();
     if (arguments == null) {
-      int charOffset = pop();
+      pop(); // charOffset
       Object expression = pop();
       push(new MetadataBuilder.fromExpression(
-          expression, postfix, library, charOffset));
+          expression, postfix, library, beginToken.charOffset));
     } else {
       int charOffset = pop();
       Object typeName = pop();
@@ -465,6 +464,9 @@
     }
     List<MetadataBuilder> metadata = pop();
 
+    final int startCharOffset =
+        metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+
     library.addClass(
         documentationComment,
         metadata,
@@ -473,6 +475,7 @@
         typeVariables,
         supertype,
         interfaces,
+        startCharOffset,
         charOffset,
         endToken.charOffset,
         supertypeOffset);
@@ -521,6 +524,8 @@
     library
         .endNestedDeclaration("#method")
         .resolveTypes(typeVariables, library);
+    final int startCharOffset =
+        metadata == null ? beginToken.charOffset : metadata.first.charOffset;
     library.addProcedure(
         documentationComment,
         metadata,
@@ -530,6 +535,7 @@
         typeVariables,
         formals,
         computeProcedureKind(getOrSet),
+        startCharOffset,
         charOffset,
         formalsOffset,
         endToken.charOffset,
@@ -710,6 +716,8 @@
             messageConstructorWithReturnType, beginToken, beginToken);
         returnType = null;
       }
+      final int startCharOffset =
+          metadata == null ? beginToken.charOffset : metadata.first.charOffset;
       library.addConstructor(
           documentationComment,
           metadata,
@@ -719,6 +727,7 @@
           constructorName,
           typeVariables,
           formals,
+          startCharOffset,
           charOffset,
           formalsOffset,
           endToken.charOffset,
@@ -728,6 +737,8 @@
         addCompileTimeError(messageConstMethod, varFinalOrConstOffset, 5);
         modifiers &= ~constMask;
       }
+      final int startCharOffset =
+          metadata == null ? beginToken.charOffset : metadata.first.charOffset;
       library.addProcedure(
           documentationComment,
           metadata,
@@ -737,6 +748,7 @@
           typeVariables,
           formals,
           kind,
+          startCharOffset,
           charOffset,
           formalsOffset,
           endToken.charOffset,
@@ -806,21 +818,6 @@
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
-    debugEvent("TypeVariables");
-    push(popList(
-            count,
-            new List<KernelTypeVariableBuilder>.filled(count, null,
-                growable: true)) ??
-        NullValue.TypeVariables);
-    if (inConstructorName) {
-      addProblem(messageConstructorWithTypeParameters,
-          offsetForToken(beginToken), lengthOfSpan(beginToken, endToken));
-      inConstructorName = false;
-    }
-  }
-
-  @override
   void handleNoTypeVariables(Token token) {
     super.handleNoTypeVariables(token);
     inConstructorName = false;
@@ -1109,18 +1106,41 @@
   @override
   void beginTypeVariable(Token token) {
     debugEvent("beginTypeVariable");
-  }
-
-  @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
-    debugEvent("endTypeVariable");
-    TypeBuilder bound = pop();
     int charOffset = pop();
     String name = pop();
     // TODO(paulberry): type variable metadata should not be ignored.  See
     // dartbug.com/28981.
     /* List<MetadataBuilder> metadata = */ pop();
-    push(library.addTypeVariable(name, bound, charOffset));
+
+    push(library.addTypeVariable(name, null, charOffset));
+  }
+
+  @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    debugEvent("TypeVariablesDefined");
+    assert(count > 0);
+    push(popList(count, new List<TypeVariableBuilder>(count)));
+  }
+
+  @override
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    debugEvent("endTypeVariable");
+    TypeBuilder bound = pop();
+    // Peek to leave type parameters on top of stack.
+    List typeParameters = peek();
+
+    typeParameters[index].bound = bound;
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
+    debugEvent("endTypeVariables");
+
+    if (inConstructorName) {
+      addProblem(messageConstructorWithTypeParameters,
+          offsetForToken(beginToken), lengthOfSpan(beginToken, endToken));
+      inConstructorName = false;
+    }
   }
 
   @override
@@ -1183,6 +1203,7 @@
         name,
         formals,
         redirectionTarget,
+        beginToken.charOffset,
         charOffset,
         formalsOffset,
         endToken.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index ebb30da..041c161 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -47,10 +47,14 @@
     List<TypeVariableBuilder> typeVariables,
     String name,
     KernelLibraryBuilder parent,
+    int startCharOffset,
     int charOffset,
     int charEndOffset) {
   cls ??= new ShadowClass(name: name);
   cls.fileUri ??= parent.fileUri;
+  if (cls.startFileOffset == TreeNode.noOffset) {
+    cls.startFileOffset = startCharOffset;
+  }
   if (cls.fileOffset == TreeNode.noOffset) {
     cls.fileOffset = charOffset;
   }
@@ -87,12 +91,13 @@
       Scope constructors,
       LibraryBuilder parent,
       this.constructorReferences,
+      int startCharOffset,
       int charOffset,
       int charEndOffset,
       [ShadowClass cls,
       this.mixedInType])
-      : actualCls = initializeClass(
-            cls, typeVariables, name, parent, charOffset, charEndOffset),
+      : actualCls = initializeClass(cls, typeVariables, name, parent,
+            startCharOffset, charOffset, charEndOffset),
         super(metadata, modifiers, name, typeVariables, supertype, interfaces,
             scope, constructors, parent, charOffset) {
     ShadowClass.setBuilder(this.cls, this);
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index d6e591c..355804a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -338,6 +338,7 @@
       List<TypeVariableBuilder> typeVariables,
       T supertype,
       List<T> interfaces,
+      int startCharOffset,
       int charOffset,
       int charEndOffset,
       int supertypeOffset);
@@ -388,6 +389,7 @@
       String constructorName,
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
@@ -402,6 +404,7 @@
       List<TypeVariableBuilder> typeVariables,
       List<FormalParameterBuilder> formals,
       ProcedureKind kind,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
@@ -437,6 +440,7 @@
       Object name,
       List<FormalParameterBuilder> formals,
       ConstructorReferenceBuilder redirectionTarget,
+      int startCharOffset,
       int charOffset,
       int charOpenParenOffset,
       int charEndOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 5221c08..5398291 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -243,7 +243,7 @@
       }
     }
     KernelProcedureBuilder builder = new KernelProcedureBuilder(null, 0, null,
-        "debugExpr", null, null, ProcedureKind.Method, library, 0, -1, -1)
+        "debugExpr", null, null, ProcedureKind.Method, library, 0, 0, -1, -1)
       ..parent = parent;
     BodyBuilder listener = dietListener.createListener(
         builder, dietListener.memberScope, isInstanceMember);
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 009b3e0..20febc0 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -289,7 +289,7 @@
   return process.output;
 }
 
-Future openWrite(Uri uri, f(IOSink sink)) async {
+Future<void> openWrite(Uri uri, f(IOSink sink)) async {
   IOSink sink = new File.fromUri(uri).openWrite();
   try {
     await f(sink);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index d7c29df..c85918e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:kernel/ast.dart' show FunctionType;
+import 'package:kernel/ast.dart' show Arguments, Expression, FunctionType;
 
 import '../fasta_codes.dart' show LocatedMessage, Message;
 
-abstract class InferenceHelper<Expression, Statement, Arguments> {
+abstract class InferenceHelper {
   Expression wrapInCompileTimeError(Expression expression, Message message);
 
   Expression buildCompileTimeError(Message message, int charOffset, int length,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 0fc6eb5..e414ffe5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -537,6 +537,7 @@
         isForwardingStub: true,
         fileUri: enclosingClass.fileUri,
         forwardingStubInterfaceTarget: finalTarget)
+      ..startFileOffset = enclosingClass.fileOffset
       ..fileOffset = enclosingClass.fileOffset
       ..parent = enclosingClass;
   }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index fcf385f..2440504 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -6,8 +6,14 @@
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
+import '../../scanner/token.dart' show Token;
+
 import '../kernel/kernel_shadow_ast.dart'
-    show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+    show
+        ExpressionJudgment,
+        InitializerJudgment,
+        StatementJudgment,
+        SwitchCaseJudgment;
 
 /// Callback interface used by [TypeInferrer] to report the results of type
 /// inference to a client.
@@ -24,21 +30,50 @@
 abstract class TypeInferenceListener<Location, Declaration, Reference,
     PrefixInfo> {
   void asExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+      ExpressionJudgment judgment,
+      Location location,
+      void expression,
+      Token asOperator,
+      void literalType,
+      DartType inferredType);
 
-  void assertInitializer(InitializerJudgment judgment, Location location);
+  void assertInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis);
 
-  void assertStatement(StatementJudgment judgment, Location location);
+  void assertStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis,
+      Token semicolon);
 
-  void awaitExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void awaitExpression(ExpressionJudgment judgment, Location location,
+      Token awaitKeyword, void expression, DartType inferredType);
 
-  void block(StatementJudgment judgment, Location location);
+  void block(StatementJudgment judgment, Location location, Token leftBracket,
+      List<void> statements, Token rightBracket);
 
-  void boolLiteral(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void boolLiteral(ExpressionJudgment judgment, Location location,
+      Token literal, bool value, DartType inferredType);
 
-  void breakStatement(StatementJudgment judgment, Location location);
+  void breakStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token breakKeyword,
+      void label,
+      Token semicolon,
+      covariant Object labelBinder);
 
   void cascadeExpression(
       ExpressionJudgment judgment, Location location, DartType inferredType);
@@ -46,80 +81,201 @@
   void catchStatement(
       Catch judgment,
       Location location,
+      Token onKeyword,
+      void type,
+      Token catchKeyword,
+      Token leftParenthesis,
+      Token exceptionParameter,
+      Token comma,
+      Token stackTraceParameter,
+      Token rightParenthesis,
+      void body,
       DartType guardType,
-      Location exceptionLocation,
+      covariant Object exceptionBinder,
       DartType exceptionType,
-      Location stackTraceLocation,
+      covariant Object stackTraceBinder,
       DartType stackTraceType);
 
   void conditionalExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+      ExpressionJudgment judgment,
+      Location location,
+      void condition,
+      Token question,
+      void thenExpression,
+      Token colon,
+      void elseExpression,
+      DartType inferredType);
 
   void constructorInvocation(ExpressionJudgment judgment, Location location,
       Reference expressionTarget, DartType inferredType);
 
-  void continueSwitchStatement(StatementJudgment judgment, Location location);
+  void continueStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant Object labelBinder);
+
+  void continueSwitchStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant Object labelBinder);
 
   void deferredCheck(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
-  void doStatement(StatementJudgment judgment, Location location);
+  void doStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token doKeyword,
+      void body,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      Token semicolon);
 
-  void doubleLiteral(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void doubleLiteral(ExpressionJudgment judgment, Location location,
+      Token literal, double value, DartType inferredType);
 
-  void expressionStatement(StatementJudgment judgment, Location location);
+  void emptyStatement(Token semicolon);
 
-  void fieldInitializer(InitializerJudgment judgment, Location location,
+  void expressionStatement(StatementJudgment judgment, Location location,
+      void expression, Token semicolon);
+
+  void fieldInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token thisKeyword,
+      Token period,
+      Token fieldName,
+      Token equals,
+      void expression,
       Reference initializerField);
 
   void forInStatement(
       StatementJudgment judgment,
       Location location,
-      Location variableLocation,
-      DartType variableType,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      Object loopVariable,
+      Token identifier,
+      Token inKeyword,
+      void iterator,
+      Token rightParenthesis,
+      void body,
+      covariant Object loopVariableBinder,
+      DartType loopVariableType,
       Location writeLocation,
       DartType writeVariableType,
       Declaration writeVariable,
       Reference writeTarget);
 
-  void forStatement(StatementJudgment judgment, Location location);
+  void forStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token forKeyword,
+      Token leftParenthesis,
+      List<Object> variableList,
+      void initialization,
+      Token leftSeparator,
+      void condition,
+      Token rightSeparator,
+      void updaters,
+      Token rightParenthesis,
+      void body);
 
-  void functionDeclaration(
-      StatementJudgment judgment, Location location, FunctionType inferredType);
+  void functionDeclaration(covariant Object binder, FunctionType inferredType);
+
+  Object binderForFunctionDeclaration(
+      StatementJudgment judgment, Location location, String name);
 
   void functionExpression(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
-  void ifNull(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
+      Token operator, void rightOperand, DartType inferredType);
 
-  void ifStatement(StatementJudgment judgment, Location location);
+  void ifStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token ifKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void thenStatement,
+      Token elseKeyword,
+      void elseStatement);
 
   void indexAssign(ExpressionJudgment judgment, Location location,
       Reference writeMember, Reference combiner, DartType inferredType);
 
-  void intLiteral(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
+      num value, DartType inferredType);
 
   void invalidInitializer(InitializerJudgment judgment, Location location);
 
-  void isExpression(ExpressionJudgment judgment, Location location,
-      DartType testedType, DartType inferredType);
+  void isExpression(
+      ExpressionJudgment judgment,
+      Location location,
+      void expression,
+      Token isOperator,
+      void literalType,
+      DartType testedType,
+      DartType inferredType);
 
-  void isNotExpression(ExpressionJudgment judgment, Location location,
-      DartType type, DartType inferredType);
+  void isNotExpression(
+      ExpressionJudgment judgment,
+      Location location,
+      void expression,
+      Token isOperator,
+      Token notOperator,
+      void literalType,
+      DartType type,
+      DartType inferredType);
 
-  void labeledStatement(StatementJudgment judgment, Location location);
+  void labeledStatement(List<Object> labels, void statement);
+
+  Object statementLabel(covariant Object binder, Token label, Token colon);
+
+  Object binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name);
 
   void listLiteral(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+      ExpressionJudgment judgment,
+      Location location,
+      Token constKeyword,
+      covariant Object typeArguments,
+      Token leftBracket,
+      void elements,
+      Token rightBracket,
+      DartType inferredType);
 
   void logicalExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+      ExpressionJudgment judgment,
+      Location location,
+      void leftOperand,
+      Token operator,
+      void rightOperand,
+      DartType inferredType);
 
   void mapLiteral(
-      ExpressionJudgment judgment, Location location, DartType typeContext);
+      ExpressionJudgment judgment,
+      Location location,
+      Token constKeyword,
+      covariant Object typeArguments,
+      Token leftBracket,
+      List<Object> entries,
+      Token rightBracket,
+      DartType inferredType);
+
+  void mapLiteralEntry(
+      Object judgment, int fileOffset, void key, Token separator, void value);
 
   void methodInvocation(
       ExpressionJudgment judgment,
@@ -140,14 +296,14 @@
       Substitution substitution,
       DartType inferredType);
 
-  void namedFunctionExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void namedFunctionExpression(ExpressionJudgment judgment,
+      covariant Object binder, DartType inferredType);
 
-  void not(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void not(ExpressionJudgment judgment, Location location, Token operator,
+      void operand, DartType inferredType);
 
   void nullLiteral(ExpressionJudgment judgment, Location location,
-      bool isSynthetic, DartType inferredType);
+      Token literal, bool isSynthetic, DartType inferredType);
 
   void propertyAssign(
       ExpressionJudgment judgment,
@@ -166,13 +322,20 @@
   void propertySet(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
-  void redirectingInitializer(InitializerJudgment judgment, Location location,
+  void redirectingInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token thisKeyword,
+      Token period,
+      Token constructorName,
+      covariant Object argumentList,
       Reference initializerTarget);
 
-  void rethrow_(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void rethrow_(ExpressionJudgment judgment, Location location,
+      Token rethrowKeyword, DartType inferredType);
 
-  void returnStatement(StatementJudgment judgment, Location location);
+  void returnStatement(StatementJudgment judgment, Location location,
+      Token returnKeyword, void expression, Token semicolon);
 
   void staticAssign(
       ExpressionJudgment judgment,
@@ -197,25 +360,60 @@
   void stringConcatenation(
       ExpressionJudgment judgment, Location location, DartType inferredType);
 
-  void stringLiteral(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void stringLiteral(ExpressionJudgment judgment, Location location,
+      Token literal, String value, DartType inferredType);
 
-  void superInitializer(InitializerJudgment judgment, Location location);
+  void superInitializer(
+      InitializerJudgment judgment,
+      Location location,
+      Token superKeyword,
+      Token period,
+      Token constructorName,
+      covariant Object argumentList);
 
-  void switchStatement(StatementJudgment judgment, Location location);
+  Object switchCase(SwitchCaseJudgment switchCase, List<Object> labels,
+      Token keyword, void expression, Token colon, List<void> statements);
+
+  Object switchLabel(covariant Object binder, Token label, Token colon);
+
+  Object binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name);
+
+  void switchStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token switchKeyword,
+      Token leftParenthesis,
+      void expression,
+      Token rightParenthesis,
+      Token leftBracket,
+      void members,
+      Token rightBracket);
 
   void symbolLiteral(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+      ExpressionJudgment judgment,
+      Location location,
+      Token poundSign,
+      List<Token> components,
+      String value,
+      DartType inferredType);
 
-  void thisExpression(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void thisExpression(ExpressionJudgment judgment, Location location,
+      Token thisKeyword, DartType inferredType);
 
-  void throw_(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void throw_(ExpressionJudgment judgment, Location location,
+      Token throwKeyword, void expression, DartType inferredType);
 
   void tryCatch(StatementJudgment judgment, Location location);
 
-  void tryFinally(StatementJudgment judgment, Location location);
+  void tryFinally(
+      StatementJudgment judgment,
+      Location location,
+      Token tryKeyword,
+      void body,
+      void catchClauses,
+      Token finallyKeyword,
+      void finallyBlock);
 
   void typeLiteral(ExpressionJudgment judgment, Location location,
       Reference expressionType, DartType inferredType);
@@ -228,18 +426,26 @@
       Reference combiner,
       DartType inferredType);
 
-  void variableDeclaration(StatementJudgment judgment, Location location,
-      DartType statementType, DartType inferredType);
+  void variableDeclaration(
+      covariant Object binder, DartType statementType, DartType inferredType);
+
+  Object binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name);
 
   void variableGet(ExpressionJudgment judgment, Location location,
-      bool isInCascade, Declaration expressionVariable, DartType inferredType);
+      bool isInCascade, covariant Object variableBinder, DartType inferredType);
 
-  void variableSet(
-      ExpressionJudgment judgment, Location location, DartType inferredType);
+  void whileStatement(
+      StatementJudgment judgment,
+      Location location,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void body);
 
-  void whileStatement(StatementJudgment judgment, Location location);
-
-  void yieldStatement(StatementJudgment judgment, Location location);
+  void yieldStatement(StatementJudgment judgment, Location location,
+      Token yieldKeyword, Token star, void expression, Token semicolon);
 
   void storePrefixInfo(Location location, PrefixInfo prefixInfo);
 
@@ -253,28 +459,47 @@
 class KernelTypeInferenceListener
     implements TypeInferenceListener<int, int, Node, int> {
   @override
-  void asExpression(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void asExpression(ExpressionJudgment judgment, location, void expression,
+      Token asOperator, void literalType, DartType inferredType) {}
 
   @override
-  void assertInitializer(InitializerJudgment judgment, location) {}
+  void assertInitializer(
+      InitializerJudgment judgment,
+      location,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis) {}
 
   @override
-  void assertStatement(StatementJudgment judgment, location) {}
+  void assertStatement(
+      StatementJudgment judgment,
+      location,
+      Token assertKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token comma,
+      void message,
+      Token rightParenthesis,
+      Token semicolon) {}
 
   @override
-  void awaitExpression(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void awaitExpression(ExpressionJudgment judgment, location,
+      Token awaitKeyword, void expression, DartType inferredType) {}
 
   @override
-  void block(StatementJudgment judgment, location) {}
+  void block(StatementJudgment judgment, location, Token leftBracket,
+      List<void> statements, Token rightBracket) {}
 
   @override
-  void boolLiteral(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void boolLiteral(ExpressionJudgment judgment, location, Token literal,
+      bool value, DartType inferredType) {}
 
   @override
-  void breakStatement(StatementJudgment judgment, location) {}
+  void breakStatement(StatementJudgment judgment, location, Token breakKeyword,
+      void label, Token semicolon, covariant void labelBinder) {}
 
   @override
   void cascadeExpression(
@@ -284,102 +509,229 @@
   void catchStatement(
       Catch judgment,
       location,
+      Token onKeyword,
+      void type,
+      Token catchKeyword,
+      Token leftParenthesis,
+      Token exceptionParameter,
+      Token comma,
+      Token stackTraceParameter,
+      Token rightParenthesis,
+      void body,
       DartType guardType,
-      exceptionLocation,
+      covariant void exceptionBinder,
       DartType exceptionType,
-      stackTraceLocation,
+      covariant void stackTraceBinder,
       DartType stackTraceType) {}
 
   @override
   void conditionalExpression(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+      ExpressionJudgment judgment,
+      location,
+      void condition,
+      Token question,
+      void thenExpression,
+      Token colon,
+      void elseExpression,
+      DartType inferredType) {}
 
   @override
   void constructorInvocation(ExpressionJudgment judgment, location,
       expressionTarget, DartType inferredType) {}
 
   @override
-  void continueSwitchStatement(StatementJudgment judgment, location) {}
+  void continueStatement(
+      StatementJudgment judgment,
+      location,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant void labelBinder) {}
+
+  @override
+  void continueSwitchStatement(
+      StatementJudgment judgment,
+      location,
+      Token continueKeyword,
+      void label,
+      Token semicolon,
+      covariant void labelBinder) {}
 
   @override
   void deferredCheck(
       ExpressionJudgment judgment, location, DartType inferredType) {}
 
   @override
-  void doStatement(StatementJudgment judgment, location) {}
+  void doStatement(
+      StatementJudgment judgment,
+      location,
+      Token doKeyword,
+      void body,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      Token semicolon) {}
 
   @override
-  void doubleLiteral(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void doubleLiteral(ExpressionJudgment judgment, location, Token literal,
+      double value, DartType inferredType) {}
 
   @override
-  void expressionStatement(StatementJudgment judgment, location) {}
+  void emptyStatement(Token semicolon) {}
+
+  @override
+  void expressionStatement(
+      StatementJudgment judgment, location, void expression, Token semicolon) {}
 
   @override
   void fieldInitializer(
-      InitializerJudgment judgment, location, initializerField) {}
+      InitializerJudgment judgment,
+      location,
+      Token thisKeyword,
+      Token period,
+      Token fieldName,
+      Token equals,
+      void expression,
+      initializerField) {}
 
   @override
   void forInStatement(
       StatementJudgment judgment,
       location,
-      variableLocation,
-      DartType variableType,
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      covariant Object loopVariable,
+      Token identifier,
+      Token inKeyword,
+      void iterator,
+      Token rightParenthesis,
+      void body,
+      covariant void loopVariableBinder,
+      DartType loopVariableType,
       writeLocation,
       DartType writeVariableType,
       writeVariable,
       writeTarget) {}
 
   @override
-  void forStatement(StatementJudgment judgment, location) {}
+  void forStatement(
+      StatementJudgment judgment,
+      location,
+      Token forKeyword,
+      Token leftParenthesis,
+      Object variableDeclarationList,
+      void initialization,
+      Token leftSeparator,
+      void condition,
+      Token rightSeparator,
+      void updaters,
+      Token rightParenthesis,
+      void body) {}
 
   @override
-  void functionDeclaration(
-      StatementJudgment judgment, location, FunctionType inferredType) {}
+  void functionDeclaration(covariant void binder, FunctionType inferredType) {}
+
+  @override
+  void binderForFunctionDeclaration(
+      StatementJudgment judgment, location, String name) {}
 
   @override
   void functionExpression(
       ExpressionJudgment judgment, location, DartType inferredType) {}
 
   @override
-  void ifNull(ExpressionJudgment judgment, location, DartType inferredType) {}
+  void ifNull(ExpressionJudgment judgment, location, void leftOperand,
+      Token operator, void rightOperand, DartType inferredType) {}
 
   @override
-  void ifStatement(StatementJudgment judgment, location) {}
+  void ifStatement(
+      StatementJudgment judgment,
+      location,
+      Token ifKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void thenStatement,
+      Token elseKeyword,
+      void elseStatement) {}
 
   @override
   void indexAssign(ExpressionJudgment judgment, location, writeMember, combiner,
       DartType inferredType) {}
 
   @override
-  void intLiteral(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void intLiteral(ExpressionJudgment judgment, location, Token literal,
+      num value, DartType inferredType) {}
 
   @override
   void invalidInitializer(InitializerJudgment judgment, location) {}
 
   @override
-  void isExpression(ExpressionJudgment judgment, location, DartType testedType,
+  void isExpression(
+      ExpressionJudgment judgment,
+      location,
+      void expression,
+      Token isOperator,
+      void literalType,
+      DartType testedType,
       DartType inferredType) {}
 
   @override
-  void isNotExpression(ExpressionJudgment judgment, location, DartType type,
+  void isNotExpression(
+      ExpressionJudgment judgment,
+      location,
+      void expression,
+      Token isOperator,
+      Token notOperator,
+      void literalType,
+      DartType type,
       DartType inferredType) {}
 
   @override
-  void labeledStatement(StatementJudgment judgment, location) {}
+  void labeledStatement(List<Object> labels, void statement) {}
+
+  @override
+  void statementLabel(covariant void binder, Token label, Token colon) {}
+
+  @override
+  void binderForStatementLabel(
+      StatementJudgment judgment, int fileOffset, String name) {}
 
   @override
   void listLiteral(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+      ExpressionJudgment judgment,
+      location,
+      Token constKeyword,
+      covariant Object typeArguments,
+      Token leftBracket,
+      void elements,
+      Token rightBracket,
+      DartType inferredType) {}
 
   @override
   void logicalExpression(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+      ExpressionJudgment judgment,
+      location,
+      void leftOperand,
+      Token operator,
+      void rightOperand,
+      DartType inferredType) {}
 
   @override
   void mapLiteral(
-      ExpressionJudgment judgment, location, DartType typeContext) {}
+      ExpressionJudgment judgment,
+      location,
+      Token constKeyword,
+      Object typeArguments,
+      Token leftBracket,
+      List<Object> entries,
+      Token rightBracket,
+      DartType inferredType) {}
+
+  void mapLiteralEntry(
+      Object judgment, int fileOffset, void key, Token separator, void value) {}
 
   @override
   void methodInvocation(
@@ -403,17 +755,18 @@
       DartType inferredType) {}
 
   @override
-  void namedFunctionExpression(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void namedFunctionExpression(ExpressionJudgment judgment,
+      covariant void binder, DartType inferredType) {}
 
   @override
-  void not(ExpressionJudgment judgment, location, DartType inferredType) {}
-
-  @override
-  void nullLiteral(ExpressionJudgment judgment, location, bool isSynthetic,
+  void not(ExpressionJudgment judgment, location, Token operator, void operand,
       DartType inferredType) {}
 
   @override
+  void nullLiteral(ExpressionJudgment judgment, location, Token literal,
+      bool isSynthetic, DartType inferredType) {}
+
+  @override
   void propertyAssign(ExpressionJudgment judgment, location, writeMember,
       DartType writeContext, combiner, DartType inferredType) {}
 
@@ -431,13 +784,21 @@
 
   @override
   void redirectingInitializer(
-      InitializerJudgment judgment, location, initializerTarget) {}
+      InitializerJudgment judgment,
+      location,
+      Token thisKeyword,
+      Token period,
+      Token constructorName,
+      covariant Object argumentList,
+      initializerTarget) {}
 
   @override
-  void rethrow_(ExpressionJudgment judgment, location, DartType inferredType) {}
+  void rethrow_(ExpressionJudgment judgment, location, Token rethrowKeyword,
+      DartType inferredType) {}
 
   @override
-  void returnStatement(StatementJudgment judgment, location) {}
+  void returnStatement(StatementJudgment judgment, location,
+      Token returnKeyword, void expression, Token semicolon) {}
 
   @override
   void staticAssign(ExpressionJudgment judgment, location, writeMember,
@@ -468,31 +829,59 @@
       ExpressionJudgment judgment, location, DartType inferredType) {}
 
   @override
-  void stringLiteral(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void stringLiteral(ExpressionJudgment judgment, location, Token literal,
+      String value, DartType inferredType) {}
 
   @override
-  void superInitializer(InitializerJudgment judgment, location) {}
+  void superInitializer(
+      InitializerJudgment judgment,
+      location,
+      Token superKeyword,
+      Token period,
+      Token constructorName,
+      covariant Object argumentList) {}
 
   @override
-  void switchStatement(StatementJudgment judgment, location) {}
+  void switchCase(SwitchCaseJudgment switchCase, covariant List<Object> labels,
+      Token keyword, void expression, Token colon, List<void> statements) {}
 
   @override
-  void symbolLiteral(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void switchLabel(covariant void binder, Token label, Token colon) {}
 
   @override
-  void thisExpression(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void binderForSwitchLabel(
+      SwitchCaseJudgment judgment, int fileOffset, String name) {}
 
   @override
-  void throw_(ExpressionJudgment judgment, location, DartType inferredType) {}
+  void switchStatement(
+      StatementJudgment judgment,
+      location,
+      Token switchKeyword,
+      Token leftParenthesis,
+      void expression,
+      Token rightParenthesis,
+      Token leftBracket,
+      void members,
+      Token rightBracket) {}
+
+  @override
+  void symbolLiteral(ExpressionJudgment judgment, location, Token poundSign,
+      List<Token> components, String value, DartType inferredType) {}
+
+  @override
+  void thisExpression(ExpressionJudgment judgment, location, Token thisKeyword,
+      DartType inferredType) {}
+
+  @override
+  void throw_(ExpressionJudgment judgment, location, Token throwKeyword,
+      void expression, DartType inferredType) {}
 
   @override
   void tryCatch(StatementJudgment judgment, location) {}
 
   @override
-  void tryFinally(StatementJudgment judgment, location) {}
+  void tryFinally(StatementJudgment judgment, location, Token tryKeyword,
+      void body, void catchClauses, Token finallyKeyword, void finallyBlock) {}
 
   @override
   void typeLiteral(ExpressionJudgment judgment, location, expressionType,
@@ -503,20 +892,28 @@
       DartType writeContext, writeVariable, combiner, DartType inferredType) {}
 
   @override
-  void variableDeclaration(StatementJudgment judgment, location,
-      DartType statementType, DartType inferredType) {}
+  void variableDeclaration(
+      covariant void binder, DartType statementType, DartType inferredType) {}
+
+  @override
+  void binderForVariableDeclaration(
+      StatementJudgment judgment, int fileOffset, String name) {}
 
   @override
   void variableGet(ExpressionJudgment judgment, location, bool isInCascade,
       expressionVariable, DartType inferredType) {}
 
   @override
-  void variableSet(
-      ExpressionJudgment judgment, location, DartType inferredType) {}
+  void whileStatement(
+      StatementJudgment judgment,
+      location,
+      Token whileKeyword,
+      Token leftParenthesis,
+      void condition,
+      Token rightParenthesis,
+      void body) {}
 
   @override
-  void whileStatement(StatementJudgment judgment, location) {}
-
-  @override
-  void yieldStatement(StatementJudgment judgment, location) {}
+  void yieldStatement(StatementJudgment judgment, location, Token yieldKeyword,
+      Token star, void expression, Token semicolon) {}
 }
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 521c12f..962d38a 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
@@ -86,12 +86,13 @@
 
 import '../kernel/kernel_shadow_ast.dart'
     show
+        ArgumentsJudgment,
         ExpressionJudgment,
+        NullJudgment,
         ShadowClass,
-        ShadowConstructorInvocation,
+        ConstructorInvocationJudgment,
         ShadowField,
         ShadowMember,
-        NullJudgment,
         VariableDeclarationJudgment,
         getExplicitTypeArguments;
 
@@ -1090,17 +1091,18 @@
 
   /// Performs the type inference steps that are shared by all kinds of
   /// invocations (constructors, instance methods, and static methods).
-  DartType inferInvocation<Expression, Statement, Initializer, Type>(
-      Factory<Expression, Statement, Initializer, Type> factory,
-      DartType typeContext,
-      int offset,
-      FunctionType calleeType,
-      DartType returnType,
-      Arguments arguments,
-      {bool isOverloadedArithmeticOperator: false,
-      DartType receiverType,
-      bool skipTypeArgumentInference: false,
-      bool isConst: false}) {
+  ExpressionInferenceResult
+      inferInvocation<Expression, Statement, Initializer, Type>(
+          Factory<Expression, Statement, Initializer, Type> factory,
+          DartType typeContext,
+          int offset,
+          FunctionType calleeType,
+          DartType returnType,
+          ArgumentsJudgment arguments,
+          {bool isOverloadedArithmeticOperator: false,
+          DartType receiverType,
+          bool skipTypeArgumentInference: false,
+          bool isConst: false}) {
     lastInferredSubstitution = null;
     lastCalleeType = null;
     var calleeTypeParameters = calleeType.typeParameters;
@@ -1224,15 +1226,16 @@
     inferredType = substitution == null
         ? returnType
         : substitution.substituteType(returnType);
-    return inferredType;
+    return new ExpressionInferenceResult(null, inferredType);
   }
 
-  DartType inferLocalFunction<Expression, Statement, Initializer, Type>(
-      Factory<Expression, Statement, Initializer, Type> factory,
-      FunctionNode function,
-      DartType typeContext,
-      int fileOffset,
-      DartType returnContext) {
+  ExpressionInferenceResult
+      inferLocalFunction<Expression, Statement, Initializer, Type>(
+          Factory<Expression, Statement, Initializer, Type> factory,
+          FunctionNode function,
+          DartType typeContext,
+          int fileOffset,
+          DartType returnContext) {
     bool hasImplicitReturnType = false;
     if (returnContext == null) {
       hasImplicitReturnType = true;
@@ -1245,7 +1248,7 @@
         inferMetadataKeepingHelper(factory, parameter.annotations);
         if (i >= function.requiredParameterCount &&
             parameter.initializer == null) {
-          parameter.initializer = new NullJudgment()..parent = parameter;
+          parameter.initializer = new NullJudgment(null)..parent = parameter;
         }
         if (parameter.initializer != null) {
           inferExpression(
@@ -1255,7 +1258,7 @@
       for (var parameter in function.namedParameters) {
         inferMetadataKeepingHelper(factory, parameter.annotations);
         if (parameter.initializer == null) {
-          parameter.initializer = new NullJudgment()..parent = parameter;
+          parameter.initializer = new NullJudgment(null)..parent = parameter;
         }
         inferExpression(factory, parameter.initializer, parameter.type, false);
       }
@@ -1377,7 +1380,7 @@
           closureContext._wrapAsyncOrGenerator(this, const DynamicType());
     }
     this.closureContext = oldClosureContext;
-    return function.functionType;
+    return new ExpressionInferenceResult(null, function.functionType);
   }
 
   @override
@@ -1413,18 +1416,19 @@
 
   /// Performs the core type inference algorithm for method invocations (this
   /// handles both null-aware and non-null-aware method invocations).
-  DartType inferMethodInvocation<Expression, Statement, Initializer, Type>(
-      Factory<Expression, Statement, Initializer, Type> factory,
-      kernel.Expression expression,
-      kernel.Expression receiver,
-      int fileOffset,
-      bool isImplicitCall,
-      DartType typeContext,
-      {VariableDeclaration receiverVariable,
-      MethodInvocation desugaredInvocation,
-      Object interfaceMember,
-      Name methodName,
-      Arguments arguments}) {
+  ExpressionInferenceResult
+      inferMethodInvocation<Expression, Statement, Initializer, Type>(
+          Factory<Expression, Statement, Initializer, Type> factory,
+          kernel.Expression expression,
+          kernel.Expression receiver,
+          int fileOffset,
+          bool isImplicitCall,
+          DartType typeContext,
+          {VariableDeclaration receiverVariable,
+          MethodInvocation desugaredInvocation,
+          Object interfaceMember,
+          Name methodName,
+          Arguments arguments}) {
     // First infer the receiver so we can look up the method that was invoked.
     var receiverType = receiver == null
         ? thisType
@@ -1447,10 +1451,11 @@
         getCalleeFunctionType(interfaceMember, receiverType, !isImplicitCall);
     var checkKind = preCheckInvocationContravariance(receiver, receiverType,
         interfaceMember, desugaredInvocation, arguments, expression);
-    var inferredType = inferInvocation(factory, typeContext, fileOffset,
+    var inferenceResult = inferInvocation(factory, typeContext, fileOffset,
         calleeType, calleeType.returnType, arguments,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         receiverType: receiverType);
+    var inferredType = inferenceResult.type;
     if (methodName.name == '==') {
       inferredType = coreTypes.boolClass.rawType;
     }
@@ -1491,7 +1496,7 @@
           lastInferredSubstitution,
           inferredType);
     }
-    return inferredType;
+    return new ExpressionInferenceResult(null, inferredType);
   }
 
   @override
@@ -1790,7 +1795,7 @@
       return templateInvalidCastFunctionExpr;
     }
     if (expression is ConstructorInvocation) {
-      if (ShadowConstructorInvocation.isRedirected(expression)) {
+      if (ConstructorInvocationJudgment.isRedirected(expression)) {
         return null;
       } else {
         return templateInvalidCastNewExpr;
@@ -1977,3 +1982,11 @@
     }
   }
 }
+
+/// The result of an expression inference.
+class ExpressionInferenceResult<Expression> {
+  final Expression expression;
+  final DartType type;
+
+  ExpressionInferenceResult(this.expression, this.type);
+}
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 7820263..c811a73 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -84,6 +84,8 @@
 ConstEvalNegativeShift/example: Fail
 ConstEvalNonConstantLiteral/dart2jsCode: Fail
 ConstEvalNonConstantLiteral/example: Fail
+ConstEvalNonConstantVariableGet/dart2jsCode: Fail
+ConstEvalNonConstantVariableGet/example: Fail
 ConstEvalZeroDivisor/example: Fail
 ConstFieldWithoutInitializer/example: Fail
 ConstructorNotFound/analyzerCode: Fail
@@ -409,5 +411,7 @@
 UnterminatedString/script8: Fail
 UnterminatedToken/analyzerCode: Fail
 UnterminatedToken/example: Fail
+WebLiteralCannotBeRepresentedExactly/analyzerCode: Fail
+WebLiteralCannotBeRepresentedExactly/example: Fail
 YieldAsIdentifier/example: Fail
 YieldNotGenerator/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 7292c04..e51c39a 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -131,6 +131,10 @@
   template: "This assertion failed with message: #string"
   analyzerCode: CONST_EVAL_THROWS_EXCEPTION
 
+ConstEvalNonConstantVariableGet:
+  template: "The variable '#string' is not a constant, only constant expressions are allowed."
+  analyzerCode: NON_CONSTANT_VALUE_IN_INITIALIZER
+
 NonAsciiIdentifier:
   template: "The non-ASCII character '#character' (#unicode) can't be used in identifiers, only in strings and comments."
   tip: "Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)."
@@ -2332,3 +2336,46 @@
 MissingExplicitTypeArguments:
   template: "No type arguments provided, #count possible."
   severity: IGNORED
+
+WebLiteralCannotBeRepresentedExactly:
+  template: "The integer literal #string can't be represented exactly in JavaScript."
+  tip: "Try changing the literal to something that can be represented in Javascript. In Javascript #string2 is the nearest value that can be represented exactly."
+  severity: ERROR
+  dart2jsCode: "*fatal*"
+
+BoundIssueViaRawTypeWithNonSimpleBounds:
+  template: "Generic type '#name' can't be used without type arguments in a type variable bound."
+  tip: "Try providing type arguments to '#name' here."
+  severity: ERROR
+  analyzerCode: STRONG_MODE_NOT_INSTANTIATED_BOUND
+  dart2jsCode: "*fatal*"
+  script: >
+    class Hest<X extends Hest<X>> {}
+    class Fisk<Y extends Hest> {}
+
+NonSimpleBoundViaVariable:
+  template: "Bound of this variable references variable '#name' from the same declaration."
+  severity: CONTEXT
+
+BoundIssueViaLoopNonSimplicity:
+  template: "Generic type '#name' can't be used without type arguments in the bounds of its own type variables."
+  tip: "Try providing type arguments to '#name' here."
+  severity: ERROR
+  analyzerCode: STRONG_MODE_NOT_INSTANTIATED_BOUND
+  dart2jsCode: "*fatal*"
+  script: >
+    class Hest<X extends Hest> {}
+
+BoundIssueViaCycleNonSimplicity:
+  template: "Generic type '#name' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '#name2'."
+  tip: "Try providing type arguments to '#name2' here or to some other raw types in the bounds along the reference chain."
+  severity: ERROR
+  analyzerCode: STRONG_MODE_NOT_INSTANTIATED_BOUND
+  dart2jsCode: "*fatal*"
+  script: >
+    class Hest<X extends Fisk> {}
+    class Fisk<Y extends Hest> {}
+
+NonSimpleBoundViaReference:
+  template: "Bound of this variable references raw type '#name'."
+  severity: CONTEXT
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 86c698f..dd18315 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -20,7 +20,8 @@
 dev_dependencies:
   analyzer: '>=0.31.0 <0.33.0'
   args: '>=0.13.0 <2.0.0'
-  build_integration: ^0.0.1
+  build_integration:
+    path: ../build_integration
   dart_style: '^1.0.7'
   json_rpc_2: ^2.0.4
   mockito: ^2.0.2
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index 91f716e..b2b315c 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -298,6 +298,8 @@
       File dillFile = new File.fromUri(dillFileUri);
       if (!await dillFile.exists()) {
         await writeComponentToFile(component, dillFileUri);
+        context.fileSystem.entityForUri(dillFileUri).writeAsBytesSync(
+            await new File.fromUri(dillFileUri).readAsBytes());
       }
 
       var dillCompiler =
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 08dfb3a..84af3a4 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -18,7 +18,6 @@
         Name,
         Procedure,
         ProcedureKind,
-        Statement,
         StringLiteral,
         TypeParameter,
         VariableDeclaration,
@@ -80,8 +79,7 @@
 
 import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
 
-void check(
-    String expected, Generator<Expression, Statement, Arguments> generator) {
+void check(String expected, Generator generator) {
   Expect.stringEquals(expected, "$generator");
 }
 
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 9889ccd..6cde453 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:front_end/src/fasta/messages.dart';
 import 'package:front_end/src/fasta/parser.dart';
-import 'package:front_end/src/fasta/parser/type_continuation.dart';
 import 'package:front_end/src/fasta/parser/type_info.dart';
 import 'package:front_end/src/fasta/parser/type_info_impl.dart';
 import 'package:front_end/src/fasta/scanner.dart';
@@ -286,9 +285,10 @@
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 1',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 1 < >',
+      'endTypeVariable > 0 null',
+      'endTypeVariables < >',
       'beginFunctionType Function',
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
@@ -308,7 +308,7 @@
       'handleType int )',
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
-      'beginTypeVariables null null ) FormalParameterKind.mandatory '
+      'endFormalParameter null null ) FormalParameterKind.mandatory '
           'MemberKind.GeneralizedFunctionType',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function m',
@@ -319,9 +319,10 @@
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 1',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 1 < >',
+      'endTypeVariable > 0 null',
+      'endTypeVariables < >',
       'beginFunctionType Function',
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
@@ -333,7 +334,7 @@
       'handleType int )',
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
-      'beginTypeVariables null null ) FormalParameterKind.mandatory'
+      'endFormalParameter null null ) FormalParameterKind.mandatory'
           ' MemberKind.GeneralizedFunctionType',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function m',
@@ -688,18 +689,20 @@
           'endMetadataStar 0',
           'handleIdentifier T typeVariableDeclaration',
           'beginTypeVariable T',
+          'handleTypeVariablesDefined T 1',
           'handleNoType T',
-          'endTypeVariable > null',
-          'endTypeVariables 1 < >',
+          'endTypeVariable > 0 null',
+          'endTypeVariables < >',
           'beginFunctionType C',
           'beginTypeVariables <',
           'beginMetadataStar T',
           'endMetadataStar 0',
           'handleIdentifier T typeVariableDeclaration',
           'beginTypeVariable T',
+          'handleTypeVariablesDefined T 1',
           'handleNoType T',
-          'endTypeVariable > null',
-          'endTypeVariables 1 < >',
+          'endTypeVariable > 0 null',
+          'endTypeVariables < >',
           'beginFunctionType C',
           'handleIdentifier C prefixedTypeReference',
           'handleIdentifier a typeReferenceContinuation',
@@ -719,7 +722,7 @@
           'handleType int x',
           'handleIdentifier x formalParameterDeclaration',
           'handleFormalParameterWithoutValue )',
-          'beginTypeVariables null null x FormalParameterKind.mandatory '
+          'endFormalParameter null null x FormalParameterKind.mandatory '
               'MemberKind.GeneralizedFunctionType',
           'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
           'endFunctionType Function Function',
@@ -732,7 +735,7 @@
           'handleType int x',
           'handleIdentifier x formalParameterDeclaration',
           'handleFormalParameterWithoutValue )',
-          'beginTypeVariables null null x FormalParameterKind.mandatory '
+          'endFormalParameter null null x FormalParameterKind.mandatory '
               'MemberKind.GeneralizedFunctionType',
           'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
           'endFunctionType Function ',
@@ -867,9 +870,10 @@
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 1',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 1 < >',
+      'endTypeVariable > 0 null',
+      'endTypeVariables < >',
     ]);
     expect(listener.errors, isNull);
   }
@@ -1045,15 +1049,16 @@
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
-      'handleNoType S',
-      'endTypeVariable , null',
       'beginMetadataStar T',
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 2',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 2 < >',
+      'endTypeVariable > 1 null',
+      'handleNoType S',
+      'endTypeVariable , 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<S extends T>', expectedCalls: [
       'beginTypeVariables <',
@@ -1061,11 +1066,12 @@
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
+      'handleTypeVariablesDefined T 1',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
       'handleType T >',
-      'endTypeVariable > extends',
-      'endTypeVariables 1 < >',
+      'endTypeVariable > 0 extends',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<S super T>', expectedCalls: [
       'beginTypeVariables <',
@@ -1073,11 +1079,12 @@
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
+      'handleTypeVariablesDefined T 1',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
       'handleType T >',
-      'endTypeVariable > super',
-      'endTypeVariables 1 < >',
+      'endTypeVariable > 0 super',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<S extends List<T>>', expectedCalls: [
       'beginTypeVariables <',
@@ -1085,6 +1092,7 @@
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
+      'handleTypeVariablesDefined > 1',
       'handleIdentifier List typeReference',
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
@@ -1092,8 +1100,8 @@
       'handleType T >',
       'endTypeArguments 1 < >',
       'handleType List >',
-      'endTypeVariable > extends',
-      'endTypeVariables 1 < >',
+      'endTypeVariable > 0 extends',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<R, S extends void Function()>', expectedCalls: [
       'beginTypeVariables <',
@@ -1101,20 +1109,21 @@
       'endMetadataStar 0',
       'handleIdentifier R typeVariableDeclaration',
       'beginTypeVariable R',
-      'handleNoType R',
-      'endTypeVariable , null',
       'beginMetadataStar S',
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
+      'handleTypeVariablesDefined ) 2',
       'handleNoTypeVariables (',
       'beginFunctionType void',
       'handleVoidKeyword void',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
       'endFunctionType Function >',
-      'endTypeVariable > extends',
-      'endTypeVariables 2 < >',
+      'endTypeVariable > 1 extends',
+      'handleNoType R',
+      'endTypeVariable , 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<@A S,T>', expectedCalls: [
       'beginTypeVariables <',
@@ -1127,15 +1136,16 @@
       'endMetadataStar 1',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
-      'handleNoType S',
-      'endTypeVariable , null',
       'beginMetadataStar T',
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 2',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 2 < >',
+      'endTypeVariable > 1 null',
+      'handleNoType S',
+      'endTypeVariable , 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<@A() S,T>', expectedCalls: [
       'beginTypeVariables <',
@@ -1149,15 +1159,16 @@
       'endMetadataStar 1',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
-      'handleNoType S',
-      'endTypeVariable , null',
       'beginMetadataStar T',
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 2',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 2 < >',
+      'endTypeVariable > 1 null',
+      'handleNoType S',
+      'endTypeVariable , 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<@A() @B S,T>', expectedCalls: [
       'beginTypeVariables <',
@@ -1176,15 +1187,16 @@
       'endMetadataStar 2',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
-      'handleNoType S',
-      'endTypeVariable , null',
       'beginMetadataStar T',
       'endMetadataStar 0',
       'handleIdentifier T typeVariableDeclaration',
       'beginTypeVariable T',
+      'handleTypeVariablesDefined T 2',
       'handleNoType T',
-      'endTypeVariable > null',
-      'endTypeVariables 2 < >',
+      'endTypeVariable > 1 null',
+      'handleNoType S',
+      'endTypeVariable , 0 null',
+      'endTypeVariables < >',
     ]);
   }
 
@@ -1197,9 +1209,10 @@
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
+      'handleTypeVariablesDefined S 1',
       'handleNoType S',
-      'endTypeVariable Function null',
-      'endTypeVariables 1 < >',
+      'endTypeVariable Function 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<void Function()>', expectedErrors: [
       error(codeExpectedIdentifier, 1, 4),
@@ -1210,9 +1223,10 @@
       'endMetadataStar 0',
       'handleIdentifier  typeVariableDeclaration',
       'beginTypeVariable ',
+      'handleTypeVariablesDefined  1',
       'handleNoType ',
-      'endTypeVariable void null',
-      'endTypeVariables 1 < >',
+      'endTypeVariable void 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<S<T>>', expectedErrors: [
       error(codeUnexpectedToken, 2, 1),
@@ -1222,9 +1236,10 @@
       'endMetadataStar 0',
       'handleIdentifier S typeVariableDeclaration',
       'beginTypeVariable S',
+      'handleTypeVariablesDefined S 1',
       'handleNoType S',
-      'endTypeVariable < null',
-      'endTypeVariables 1 < >',
+      'endTypeVariable < 0 null',
+      'endTypeVariables < >',
     ]);
     expectComplexTypeParam('<S T>', inDeclaration: true, expectedErrors: [
       error(codeExpectedButGot, 3, 1),
@@ -1235,6 +1250,95 @@
     expectComplexTypeParam('<@Foo S',
         inDeclaration: true, expectedErrors: [error(codeExpectedButGot, 7, 0)]);
   }
+
+  void test_computeTypeParam_31846() {
+    expectComplexTypeParam('<T extends Comparable<T>>', expectedCalls: [
+      'beginTypeVariables <',
+      'beginMetadataStar T',
+      'endMetadataStar 0',
+      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
+      'handleTypeVariablesDefined > 1',
+      'handleIdentifier Comparable typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 1 < >',
+      'handleType Comparable >',
+      'endTypeVariable > 0 extends',
+      'endTypeVariables < >',
+    ]);
+    expectComplexTypeParam('<T extends Comparable<S>, S>', expectedCalls: [
+      'beginTypeVariables <',
+      'beginMetadataStar T',
+      'endMetadataStar 0',
+      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
+      'beginMetadataStar S',
+      'endMetadataStar 0',
+      'handleIdentifier S typeVariableDeclaration',
+      'beginTypeVariable S',
+      'handleTypeVariablesDefined S 2',
+      'handleNoType S',
+      'endTypeVariable > 1 null',
+      'handleIdentifier Comparable typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments >',
+      'handleType S >',
+      'endTypeArguments 1 < >',
+      'handleType Comparable ,',
+      'endTypeVariable , 0 extends',
+      'endTypeVariables < >'
+    ]);
+    expectComplexTypeParam('<T extends Function(T)>', expectedCalls: [
+      'beginTypeVariables <',
+      'beginMetadataStar T',
+      'endMetadataStar 0',
+      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
+      'handleTypeVariablesDefined ) 1',
+      'handleNoTypeVariables (',
+      'beginFunctionType Function',
+      'handleNoType extends',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'beginMetadataStar T',
+      'endMetadataStar 0',
+      'beginFormalParameter T MemberKind.GeneralizedFunctionType',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments )',
+      'handleType T )',
+      'handleNoName )',
+      'handleFormalParameterWithoutValue )',
+      'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function >',
+      'endTypeVariable > 0 extends',
+      'endTypeVariables < >'
+    ]);
+    expectComplexTypeParam('<T extends List<List<T>>>', expectedCalls: [
+      'beginTypeVariables <',
+      'beginMetadataStar T',
+      'endMetadataStar 0',
+      'handleIdentifier T typeVariableDeclaration',
+      'beginTypeVariable T',
+      'handleTypeVariablesDefined >> 1',
+      'handleIdentifier List typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier List typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T >',
+      'endTypeArguments 1 < >',
+      'handleType List >',
+      'endTypeArguments 1 < >',
+      'handleType List >',
+      'endTypeVariable > 0 extends',
+      'endTypeVariables < >'
+    ]);
+  }
 }
 
 void expectInfo(expectedInfo, String source, {bool required}) {
@@ -1314,18 +1418,7 @@
 
   expectEnd(expectedAfter, actualEnd);
   if (expectedCalls != null) {
-    try {
-      expect(listener.calls, expectedCalls, reason: source);
-    } catch (e) {
-      TypeInfoListener listener2 = new TypeInfoListener();
-      new Parser(listener2).parseType(start, TypeContinuation.Required);
-      print('[');
-      for (String call in listener2.calls) {
-        print("'$call',");
-      }
-      print(']');
-      rethrow;
-    }
+    expect(listener.calls, expectedCalls, reason: source);
   }
   expect(listener.errors, expectedErrors, reason: source);
   return typeInfo;
@@ -1356,18 +1449,7 @@
   expectEnd(expectedAfter, actualEnd);
 
   if (expectedCalls != null) {
-    try {
-      expect(listener.calls, expectedCalls, reason: source);
-    } catch (e) {
-      TypeInfoListener listener2 = new TypeInfoListener();
-      new Parser(listener2).parseTypeArgumentsOpt(start);
-      print('Events from parseTypeArgumentsOpt: [');
-      for (String call in listener2.calls) {
-        print("  '$call',");
-      }
-      print(']');
-      rethrow;
-    }
+    expect(listener.calls, expectedCalls, reason: source);
   }
   expect(listener.errors, expectedErrors, reason: source);
 }
@@ -1397,18 +1479,7 @@
   expectEnd(expectedAfter, actualEnd);
 
   if (expectedCalls != null) {
-    try {
-      expect(listener.calls, expectedCalls, reason: source);
-    } catch (e) {
-      TypeInfoListener listener2 = new TypeInfoListener(metadataAllowed: true);
-      new Parser(listener2).parseTypeVariablesOpt(start);
-      print('Events from parseTypeVariablesOpt: [');
-      for (String call in listener2.calls) {
-        print("  '$call',");
-      }
-      print(']');
-      rethrow;
-    }
+    expect(listener.calls, expectedCalls, reason: source);
   }
   expect(listener.errors, expectedErrors, reason: source);
 }
@@ -1513,8 +1584,8 @@
   }
 
   @override
-  void beginTypeVariable(Token name) {
-    calls.add('beginTypeVariable $name');
+  void beginTypeVariable(Token token) {
+    calls.add('beginTypeVariable $token');
   }
 
   @override
@@ -1540,7 +1611,7 @@
   @override
   void endFormalParameter(Token thisKeyword, Token periodAfterThis,
       Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
-    calls.add('beginTypeVariables $thisKeyword $periodAfterThis '
+    calls.add('endFormalParameter $thisKeyword $periodAfterThis '
         '$nameToken $kind $memberKind');
   }
 
@@ -1569,13 +1640,13 @@
   }
 
   @override
-  void endTypeVariable(Token token, Token extendsOrSuper) {
-    calls.add('endTypeVariable $token $extendsOrSuper');
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    calls.add('endTypeVariable $token $index $extendsOrSuper');
   }
 
   @override
-  void endTypeVariables(int count, Token beginToken, Token endToken) {
-    calls.add('endTypeVariables $count $beginToken $endToken');
+  void endTypeVariables(Token beginToken, Token endToken) {
+    calls.add('endTypeVariables $beginToken $endToken');
   }
 
   @override
@@ -1636,6 +1707,11 @@
   }
 
   @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    calls.add('handleTypeVariablesDefined $token $count');
+  }
+
+  @override
   void handleVoidKeyword(Token token) {
     calls.add('handleVoidKeyword $token');
   }
diff --git a/pkg/front_end/test/fasta/unlinked_scope_test.dart b/pkg/front_end/test/fasta/unlinked_scope_test.dart
index 1f6c28f..3b1fd5e 100644
--- a/pkg/front_end/test/fasta/unlinked_scope_test.dart
+++ b/pkg/front_end/test/fasta/unlinked_scope_test.dart
@@ -57,7 +57,7 @@
 
   KernelProcedureBuilder mockProcedure(String name) {
     return new KernelProcedureBuilder(null, 0, null, name, null, null,
-        ProcedureKind.Getter, this, -1, -1, -1);
+        ProcedureKind.Getter, this, -1, -1, -1, -1);
   }
 }
 
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 9e14f0e..45c3553 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -36,7 +36,7 @@
 import "package:testing/testing.dart"
     show Chain, ChainContext, Result, Step, TestDescription, runMe;
 
-import "package:yaml/yaml.dart" show YamlMap, loadYamlNode;
+import "package:yaml/yaml.dart" show YamlList, YamlMap, loadYamlNode;
 
 import "incremental_utils.dart" as util;
 
@@ -115,10 +115,11 @@
   }
 }
 
-Future<Null> basicTest(Map<String, String> sourceFiles, String entryPoint,
-    bool strong, List<String> invalidate, Directory outDir) async {
+Future<Null> basicTest(YamlMap sourceFiles, String entryPoint, bool strong,
+    YamlList invalidate, Directory outDir) async {
   Uri entryPointUri = outDir.uri.resolve(entryPoint);
-  Set<String> invalidateFilenames = invalidate?.toSet() ?? new Set<String>();
+  Set<String> invalidateFilenames =
+      invalidate == null ? new Set<String>() : new Set<String>.from(invalidate);
   List<Uri> invalidateUris = <Uri>[];
   Uri packagesUri;
   for (String filename in sourceFiles.keys) {
@@ -191,7 +192,7 @@
   Map<String, String> sourceFiles;
   CompilerOptions options;
   TestIncrementalCompiler compiler;
-  for (Map<String, dynamic> world in worlds) {
+  for (YamlMap world in worlds) {
     bool brandNewWorld = true;
     if (world["worldType"] == "updated") {
       brandNewWorld = false;
@@ -212,7 +213,7 @@
     if (brandNewWorld) {
       sourceFiles = new Map<String, String>.from(world["sources"]);
     } else {
-      sourceFiles.addAll(world["sources"]);
+      sourceFiles.addAll(new Map<String, String>.from(world["sources"]));
     }
     Uri packagesUri;
     for (String filename in sourceFiles.keys) {
@@ -255,9 +256,12 @@
       compiler = new TestIncrementalCompiler(options, entry, initializeFrom);
     }
 
+    List<Uri> invalidated = new List<Uri>();
     if (world["invalidate"] != null) {
       for (String filename in world["invalidate"]) {
-        compiler.invalidate(base.resolve(filename));
+        Uri uri = base.resolve(filename);
+        invalidated.add(uri);
+        compiler.invalidate(uri);
       }
     }
 
@@ -282,18 +286,20 @@
           "$expectInitializeFromDill but was ${compiler.initializedFromDill}";
     }
     if (world["checkInvalidatedFiles"] != false) {
+      Set<Uri> filteredInvalidated =
+          compiler.getFilteredInvalidatedImportUrisForTesting(invalidated);
       if (world["invalidate"] != null) {
-        Expect.equals(world["invalidate"].length,
-            compiler.invalidatedImportUrisForTesting?.length ?? 0);
+        Expect.equals(
+            world["invalidate"].length, filteredInvalidated?.length ?? 0);
         List expectedInvalidatedUri = world["expectedInvalidatedUri"];
         if (expectedInvalidatedUri != null) {
           Expect.setEquals(
               expectedInvalidatedUri
                   .map((s) => Uri.parse(substituteVariables(s, base))),
-              compiler.invalidatedImportUrisForTesting);
+              filteredInvalidated);
         }
       } else {
-        Expect.isNull(compiler.invalidatedImportUrisForTesting);
+        Expect.isNull(filteredInvalidated);
         Expect.isNull(world["expectedInvalidatedUri"]);
       }
     }
@@ -313,7 +319,7 @@
 }
 
 void performErrorAndWarningCheck(
-    Map<String, dynamic> world,
+    YamlMap world,
     bool gotError,
     List<String> formattedErrors,
     bool gotWarning,
@@ -388,8 +394,10 @@
   bool result = compiler.initializedFromDill;
   new File.fromUri(output)
       .writeAsBytesSync(util.postProcess(initializedComponent));
-  int actuallyInvalidatedCount =
-      compiler.invalidatedImportUrisForTesting?.length ?? 0;
+  int actuallyInvalidatedCount = compiler
+          .getFilteredInvalidatedImportUrisForTesting(invalidateUris)
+          ?.length ??
+      0;
   if (result && actuallyInvalidatedCount < invalidateUris.length) {
     Expect.fail("Expected at least ${invalidateUris.length} invalidated uris, "
         "got $actuallyInvalidatedCount");
@@ -409,8 +417,10 @@
 
   Component partialComponent = await compiler.computeDelta();
   util.throwOnEmptyMixinBodies(partialComponent);
-  actuallyInvalidatedCount =
-      (compiler.invalidatedImportUrisForTesting?.length ?? 0);
+  actuallyInvalidatedCount = (compiler
+          .getFilteredInvalidatedImportUrisForTesting(invalidateUris)
+          ?.length ??
+      0);
   if (actuallyInvalidatedCount < invalidateUris.length) {
     Expect.fail("Expected at least ${invalidateUris.length} invalidated uris, "
         "got $actuallyInvalidatedCount");
@@ -441,8 +451,28 @@
 
 class TestIncrementalCompiler extends IncrementalCompiler {
   Set<Uri> invalidatedImportUrisForTesting;
+  final Uri entryPoint;
 
-  TestIncrementalCompiler(CompilerOptions options, Uri entryPoint,
+  /// Filter out the automatically added entryPoint, unless it's explicitly
+  /// specified as being invalidated.
+  /// This is not perfect, but works for what it's currently used for.
+  Set<Uri> getFilteredInvalidatedImportUrisForTesting(
+      List<Uri> invalidatedUris) {
+    if (invalidatedImportUrisForTesting == null) return null;
+    Set<String> invalidatedFilenames =
+        invalidatedUris.map((uri) => uri.pathSegments.last).toSet();
+    if (invalidatedFilenames.contains(entryPoint.pathSegments.last)) {
+      return invalidatedImportUrisForTesting;
+    }
+
+    Set<Uri> result = new Set<Uri>();
+    for (Uri uri in invalidatedImportUrisForTesting) {
+      if (invalidatedFilenames.contains(uri.pathSegments.last)) result.add(uri);
+    }
+    return result;
+  }
+
+  TestIncrementalCompiler(CompilerOptions options, this.entryPoint,
       [Uri initializeFrom])
       : super(new CompilerContext(new ProcessedOptions(options, [entryPoint])),
             initializeFrom);
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index 3588ea8..e705c97 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -14,9 +14,12 @@
     var summary = await summarize(['a.dart'], allSources);
     var component = loadComponentFromBytes(summary);
 
-    // Note: the kernel representation always has a null key in the map,
-    // but otherwise no other data is included here.
-    expect(component.uriToSource.keys.single, null);
+    // Note: the kernel representation always includes the Uri entries, but
+    // doesn't include the actual source here.
+    for (Source source in component.uriToSource.values) {
+      expect(source.source.length, 0);
+      expect(source.lineStarts.length, 0);
+    }
   });
 
   test('summary includes declarations, but no method bodies', () async {
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 1623e1d..bdcce31 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -45,6 +45,10 @@
 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
 
+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
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
+
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
 rasta/bad_continue: Fail
@@ -102,6 +106,7 @@
 regress/issue_29976: RuntimeError # Issue 29976.
 regress/issue_29982: Fail # Issue 29982.
 regress/issue_30836: RuntimeError # Issue 30836.
+regress/issue_33452: RuntimeError # Test has an intentional error
 
 runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
 runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
deleted file mode 100644
index 9471d94..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
-class C extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    (dynamic) → dynamic b;
-  }
-}
-static method main() → dynamic {
-  (dynamic) → dynamic b;
-}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
deleted file mode 100644
index 9471d94..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
-class C extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    (dynamic) → dynamic b;
-  }
-}
-static method main() → dynamic {
-  (dynamic) → dynamic b;
-}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
deleted file mode 100644
index f49fc49..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
-class C extends core::Object {
-  synthetic constructor •() → void
-    ;
-  method foo() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
deleted file mode 100644
index 4024856..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<U extends (U) → dynamic> = (U) → dynamic;
-class C extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    ((core::Null) → dynamic) → dynamic b;
-  }
-}
-static method main() → dynamic {
-  ((core::Null) → dynamic) → dynamic b;
-}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart
new file mode 100644
index 0000000..b63fbe0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.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.
+
+// This test checks that a compile-time error is generated when instantaite to
+// bound can't be applied due to raw types with non-simple bounds.  The
+// non-simplicity in this test is due to having another raw type in the bound
+// that in its turn has type variables with non-simple bounds.
+
+class A<TypeT, TypeS extends TypeT> {}
+
+class B<TypeU extends A> {}
+
+class C<TypeV extends B> {}
+
+C c;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
new file mode 100644
index 0000000..cc42cff
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field self::C<dynamic> c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
new file mode 100644
index 0000000..cc42cff
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field self::C<dynamic> c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
new file mode 100644
index 0000000..0c77499
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static field self::C<dynamic> c;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
new file mode 100644
index 0000000..a4a2719
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C<TypeV extends self::B<dynamic> = self::B<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+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
new file mode 100644
index 0000000..a4a2719
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C<TypeV extends self::B<dynamic> = self::B<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart
new file mode 100644
index 0000000..6d25acd
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that a compile-time error is generated when instantiate to
+// bound can't be applied due to raw types with non-simple bounds.  The
+// non-simplicity in this test is due to dependencies between type variables.
+
+class A<TypeT, TypeS extends TypeT> {}
+
+class B<TypeU extends A> {}
+
+B b;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
new file mode 100644
index 0000000..dfed3ee
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field self::B<dynamic> b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
new file mode 100644
index 0000000..dfed3ee
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static field self::B<dynamic> b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
new file mode 100644
index 0000000..0108401
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static field self::B<dynamic> b;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
new file mode 100644
index 0000000..02c4ed2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+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
new file mode 100644
index 0000000..02c4ed2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+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_parametrized_typedef_cycle.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart
new file mode 100644
index 0000000..d3acace
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the cyclic non-simplicity issues are detected in case
+// when both class declaration and a parametrized typedef participate in the
+// cycle.
+
+class Hest<TypeX extends Fisk> {}
+
+typedef Fisk = void Function<TypeY extends Hest>();
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
new file mode 100644
index 0000000..967b3da
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
new file mode 100644
index 0000000..967b3da
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
new file mode 100644
index 0000000..6ac4a79
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart
new file mode 100644
index 0000000..5aebdc0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.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.
+
+// This test checks that the cyclic non-simplicity detection works in case when
+// both class declarations and typedefs participate in the cycle.
+
+class Hest<TypeX extends Fisk> {}
+
+typedef void Fisk<TypeY extends Hest>();
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
new file mode 100644
index 0000000..8ff7174
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
+class Hest<TypeX extends () → void = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
new file mode 100644
index 0000000..8ff7174
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
+class Hest<TypeX extends () → void = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
new file mode 100644
index 0000000..57f4622
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
+class Hest<TypeX extends () → void = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..152e48b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<() → void> = dynamic> = () → void;
+class Hest<TypeX extends () → void = () → void> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..152e48b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<() → void> = dynamic> = () → void;
+class Hest<TypeX extends () → void = () → void> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart
new file mode 100644
index 0000000..5df69f7
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the use of a raw generic type in the bounds of its own
+// type variables is recognized and reported as a compile-time error.
+
+class Hest<TypeX extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
new file mode 100644
index 0000000..246facc
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
new file mode 100644
index 0000000..246facc
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
new file mode 100644
index 0000000..0db76ef
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..192b8ba
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..192b8ba
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart
new file mode 100644
index 0000000..2703630
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the error is reported for all type variables that
+// reference the raw generic type they are defined on.
+
+class Hest<TypeX extends Hest, TypeY extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
new file mode 100644
index 0000000..e96669a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
new file mode 100644
index 0000000..e96669a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
new file mode 100644
index 0000000..6e46804
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..8499ca8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..8499ca8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart
new file mode 100644
index 0000000..a72f472
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the error message is not duplicated in case when the
+// raw generic type is used more than once in the bound of its own type
+// variable.
+
+class Hest<TypeX extends Map<Hest, Hest>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
new file mode 100644
index 0000000..9d87952
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
new file mode 100644
index 0000000..9d87952
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
new file mode 100644
index 0000000..5abeb79
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..6760128
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..6760128
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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_folded_regress.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart
new file mode 100644
index 0000000..91a3b2b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.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.
+
+// This test checks that same generic type passed as a type argument to itself
+// doesn't cause issues in the mechanism for detection of non-simple bounds.
+
+class Hest<TypeX> {}
+
+class Fisk<TypeY extends Hest<Hest<Object>>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
new file mode 100644
index 0000000..cc9040b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
new file mode 100644
index 0000000..cc9040b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
new file mode 100644
index 0000000..65514b1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
new file mode 100644
index 0000000..a2ec755
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = self::Hest<self::Hest<core::Object>>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
new file mode 100644
index 0000000..a2ec755
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = self::Hest<self::Hest<core::Object>>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart
new file mode 100644
index 0000000..e7415fe
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that an error is reported on all type variables that have a
+// raw generic type in their bounds in case this generic type has non-simple
+// bounds.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
new file mode 100644
index 0000000..8b2d1c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
new file mode 100644
index 0000000..8b2d1c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
new file mode 100644
index 0000000..731612d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..5ae9bde
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic, TypeZ extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..5ae9bde
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic, TypeZ extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart
new file mode 100644
index 0000000..696a47f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the use of a raw generic type with non-simple bounds in
+// a bound of a type variable is detected when that generic type comes from a
+// compiled .dill file.
+//
+// Note that the type variable of LinkedListEntry has non-simple bound because
+// it references itself.
+// https://api.dartlang.org/stable/1.24.3/dart-collection/LinkedListEntry-class.html
+
+import 'dart:collection';
+
+class Hest<X extends LinkedListEntry> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
new file mode 100644
index 0000000..ae3f2f3
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
new file mode 100644
index 0000000..ae3f2f3
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
new file mode 100644
index 0000000..910725d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..6b7a848
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..6b7a848
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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_generic_function_in_bound_regress.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart
new file mode 100644
index 0000000..18d2e53
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the use of generic function types in the bound of a
+// type variable is detected early and doesn't cause issues to the mechanism for
+// detection of non-simple bounds.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Function<TypeZ extends Hest<Null>>(TypeZ)> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
new file mode 100644
index 0000000..a5a23c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
new file mode 100644
index 0000000..a5a23c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
new file mode 100644
index 0000000..f5b927f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
new file mode 100644
index 0000000..372b447
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
new file mode 100644
index 0000000..372b447
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart
new file mode 100644
index 0000000..496b166
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.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.
+
+// This test checks that an error is reported on all raw generic types with
+// non-simple bounds used in the bound of the same type variable.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Fisk<TypeY>> {}
+
+class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
new file mode 100644
index 0000000..1ebf46d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
new file mode 100644
index 0000000..1ebf46d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
new file mode 100644
index 0000000..037cda9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..1e2ebae
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = self::Fisk<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<self::Hest<dynamic>>, self::Fisk<self::Fisk<dynamic>>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..1e2ebae
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = self::Fisk<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<self::Hest<dynamic>>, self::Fisk<self::Fisk<dynamic>>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart
new file mode 100644
index 0000000..e2c8f9c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that a cyclic dependence is not reported twice in case the
+// class declarations from the cycle are in different libraries, but have the
+// same name within their respective libraries.
+
+import './non_simple_many_libs_same_name_cycle_lib.dart' as lib;
+
+class Hest<TypeX extends lib.Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
new file mode 100644
index 0000000..0bdaa11
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
new file mode 100644
index 0000000..0bdaa11
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
new file mode 100644
index 0000000..b2d8428
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..aea6b8d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..aea6b8d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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_lib.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart
new file mode 100644
index 0000000..a716476
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that a cyclic dependence is not reported twice in case the
+// class declarations from the cycle are in different libraries, but have the
+// same name within their respective libraries.
+//
+// This file is the supplement library for
+// 'non_simple_many_libs_same_name_cycle.dart'.
+
+library non_simple_many_libs_same_name_cycle_lib;
+
+import './non_simple_many_libs_same_name_cycle.dart' as lib;
+
+class Hest<TypeY extends lib.Hest> {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart
new file mode 100644
index 0000000..dbedd5a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the error message is not duplicated in the case when
+// the same raw generic type with non-simple bounds is used in the bound of a
+// type variable.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Map<Hest, Hest>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
new file mode 100644
index 0000000..2cc8768
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
new file mode 100644
index 0000000..2cc8768
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
new file mode 100644
index 0000000..a3d3fb5
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..bf31ea9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<self::Hest<dynamic>>, self::Hest<self::Hest<dynamic>>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..bf31ea9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<self::Hest<dynamic>>, self::Hest<self::Hest<dynamic>>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
new file mode 100644
index 0000000..9e41974
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that in the case of an error on a class related to
+// non-simple bounds, the implied errors on other classes that reference the
+// erronious one in the bounds of their type variables is not reported.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Hest> {}
+
+class Naebdyr<TypeZ extends Fisk> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
new file mode 100644
index 0000000..a2c2f96
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
new file mode 100644
index 0000000..a2c2f96
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
new file mode 100644
index 0000000..e70601a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..c1297fa
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = self::Fisk<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..c1297fa
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = self::Fisk<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : 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 b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart
new file mode 100644
index 0000000..8dc56a0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.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.
+
+// This test checks that an attempt to use a raw generic type with non-simple
+// bounds is detected and reported as a compile-time error in case the
+// non-simple bound is due to the use of the type variable from the same
+// declaration.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
new file mode 100644
index 0000000..ccff566
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
new file mode 100644
index 0000000..ccff566
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
new file mode 100644
index 0000000..082d2fd
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+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
new file mode 100644
index 0000000..67f553b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..67f553b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+  synthetic constructor •() → void
+    : 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/typedef_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
deleted file mode 100644
index caa1662..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
-static field (dynamic) → dynamic b;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
deleted file mode 100644
index caa1662..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
-static field (dynamic) → dynamic b;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
deleted file mode 100644
index 68eb853..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
-static field (dynamic) → dynamic b;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
deleted file mode 100644
index 7f1e93d..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<S extends (S) → dynamic> = (S) → dynamic;
-static field ((core::Null) → dynamic) → dynamic b;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 9cdafa9..1159e1b 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -252,3 +252,6 @@
 rasta/issue_000047: Fail
 rasta/native_is_illegal: Pass # Issue 29763
 rasta/type_with_parse_error: Fail
+
+instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart b/pkg/front_end/testcases/regress/issue_33452.dart
new file mode 100644
index 0000000..faffe5d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class ExistingClass {}
+
+main() {
+  var x = new ExistingClass.nonExistingConstructor();
+  x = new NonExistingClass();
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
new file mode 100644
index 0000000..3d768b8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#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.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
new file mode 100644
index 0000000..3d768b8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#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.outline.expect b/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
new file mode 100644
index 0000000..da89296
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  synthetic constructor •() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
new file mode 100644
index 0000000..71970d1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  synthetic constructor •() → void
+    : 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
new file mode 100644
index 0000000..71970d1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  synthetic constructor •() → void
+    : 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/strong.status b/pkg/front_end/testcases/strong.status
index b0858b9..d0d42f8 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -112,8 +112,9 @@
 inference_new/infer_field_getter_setter_mismatch: TypeCheckError
 inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
 
-instantiate_to_bound/typedef_super_bounded_type: Fail
-instantiate_to_bound/body_typedef_super_bounded_type: Fail
+instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: Crash # Issue 33479
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
 
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
@@ -200,6 +201,7 @@
 regress/issue_30836: RuntimeError # Issue 30836.
 regress/issue_31184: TypeCheckError
 regress/issue_31299: TypeCheckError
+regress/issue_33452: RuntimeError # Test has an intentional error
 
 runtime_checks/forwarding_stub_with_default_values: RuntimeError # Bug 31027
 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 3159a05..eff9f14 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -131,7 +131,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 7;
+  UInt32 formatVersion = 8;
   Library[] libraries;
   UriSource sourceMap;
   List<CanonicalName> canonicalNames;
@@ -284,7 +284,8 @@
   CanonicalNameReference canonicalName;
   // An absolute path URI to the .dart file from which the class was created.
   UriReference fileUri;
-  FileOffset fileOffset;
+  FileOffset startFileOffset; // Offset of the start of the class including any annotations.
+  FileOffset fileOffset; // Offset of the name of the class.
   FileOffset fileEndOffset;
   Byte flags (levelBit0, levelBit1, isAbstract, isEnum, isAnonymousMixin,
               isEliminatedMixin); // Where level is index into ClassLevel
@@ -328,7 +329,8 @@
   Byte tag = 5;
   CanonicalNameReference canonicalName;
   UriReference fileUri;
-  FileOffset fileOffset;
+  FileOffset startFileOffset; // Offset of the start of the constructor including any annotations.
+  FileOffset fileOffset; // Offset of the constructor name.
   FileOffset fileEndOffset;
   Byte flags (isConst, isExternal, isSynthetic);
   Name name;
@@ -352,7 +354,8 @@
   CanonicalNameReference canonicalName;
   // An absolute path URI to the .dart file from which the class was created.
   UriReference fileUri;
-  FileOffset fileOffset;
+  FileOffset startFileOffset; // Offset of the start of the procedure including any annotations.
+  FileOffset fileOffset; // Offset of the procedure name.
   FileOffset fileEndOffset;
   Byte kind; // Index into the ProcedureKind enum above.
   Byte flags (isStatic, isAbstract, isExternal, isConst, isForwardingStub,
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index f55c28f..959a84b 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -672,6 +672,15 @@
 /// transform a mixin application to become a regular class, and vice versa.
 @coq
 class Class extends NamedNode implements FileUriNode {
+  /// Start offset of the class in the source file it comes from.
+  ///
+  /// Note that this includes annotations if any.
+  ///
+  /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+  /// start offset is not available (this is the default if none is specifically
+  /// set).
+  int startFileOffset = TreeNode.noOffset;
+
   /// End offset in the source file it comes from. Valid values are from 0 and
   /// up, or -1 ([TreeNode.noOffset]) if the file end offset is not available
   /// (this is the default if none is specifically set).
@@ -973,9 +982,11 @@
 
 @coq
 abstract class Member extends NamedNode implements FileUriNode {
-  /// End offset in the source file it comes from. Valid values are from 0 and
-  /// up, or -1 ([TreeNode.noOffset]) if the file end offset is not available
-  /// (this is the default if none is specifically set).
+  /// End offset in the source file it comes from.
+  ///
+  /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+  /// end offset is not available (this is the default if none is specifically
+  /// set).
   int fileEndOffset = TreeNode.noOffset;
 
   /// List of metadata annotations on the member.
@@ -1224,6 +1235,15 @@
 ///
 /// For unnamed constructors, the name is an empty string (in a [Name]).
 class Constructor extends Member {
+  /// Start offset of the constructor in the source file it comes from.
+  ///
+  /// Note that this includes annotations if any.
+  ///
+  /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+  /// start offset is not available (this is the default if none is specifically
+  /// set).
+  int startFileOffset = TreeNode.noOffset;
+
   int flags = 0;
   FunctionNode function;
   List<Initializer> initializers;
@@ -1450,6 +1470,15 @@
 /// except for the unary minus operator, whose name is `unary-`.
 @coq
 class Procedure extends Member {
+  /// Start offset of the function in the source file it comes from.
+  ///
+  /// Note that this includes annotations if any.
+  ///
+  /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+  /// start offset is not available (this is the default if none is specifically
+  /// set).
+  int startFileOffset = TreeNode.noOffset;
+
   ProcedureKind kind;
   int flags = 0;
   // function is null if and only if abstract, external.
@@ -3170,6 +3199,10 @@
 }
 
 class IntLiteral extends BasicLiteral {
+  /// Note that this value holds a uint64 value.
+  /// E.g. "0x8000000000000000" will be saved as "-9223372036854775808" despite
+  /// technically (on some platforms, particularly Javascript) being positive.
+  /// If the number is meant to be negative it will be wrapped in a "unary-".
   int value;
 
   IntLiteral(this.value);
@@ -5171,7 +5204,7 @@
 
   PrimitiveConstant(this.value);
 
-  String toString() => '${this.runtimeType}($value)';
+  String toString() => '$value';
 
   int get hashCode => value.hashCode;
 
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 56555cc..c088723 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -904,6 +904,7 @@
     }
 
     var fileUri = readUriReference();
+    node.startFileOffset = readOffset();
     node.fileOffset = readOffset();
     node.fileEndOffset = readOffset();
     int flags = readByte();
@@ -1013,6 +1014,7 @@
       node = new Constructor(null, reference: reference);
     }
     var fileUri = readUriReference();
+    var startFileOffset = readOffset();
     var fileOffset = readOffset();
     var fileEndOffset = readOffset();
     var flags = readByte();
@@ -1034,6 +1036,7 @@
     var transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
     if (shouldWriteData) {
+      node.startFileOffset = startFileOffset;
       node.fileOffset = fileOffset;
       node.fileEndOffset = fileEndOffset;
       node.flags = flags;
@@ -1057,6 +1060,7 @@
       node = new Procedure(null, null, null, reference: reference);
     }
     var fileUri = readUriReference();
+    var startFileOffset = readOffset();
     var fileOffset = readOffset();
     var fileEndOffset = readOffset();
     int kindIndex = readByte();
@@ -1081,6 +1085,7 @@
     var transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
     if (shouldWriteData) {
+      node.startFileOffset = startFileOffset;
       node.fileOffset = fileOffset;
       node.fileEndOffset = fileEndOffset;
       node.kind = kind;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index ed89e92..84a6e59 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -220,16 +220,9 @@
 
   // Returns the new active file uri.
   Uri writeUriReference(Uri uri) {
-    if (_knownSourceUri.contains(uri)) {
-      final int index = _sourceUriIndexer.put(uri);
-      writeUInt30(index);
-      return uri;
-    } else {
-      // This is equivalent to `index = _sourceUriIndexer[null];`.
-      final int index = 0;
-      writeUInt30(index);
-      return null;
-    }
+    final int index = _sourceUriIndexer.put(uri);
+    writeUInt30(index);
+    return uri;
   }
 
   void writeList<T>(List<T> items, void writeItem(T x)) {
@@ -496,8 +489,9 @@
     Utf8Encoder utf8Encoder = const Utf8Encoder();
     for (Uri uri in _sourceUriIndexer.index.keys) {
       index[i] = getBufferOffset();
-
-      Source source = uriToSource[uri] ?? new Source(<int>[], const <int>[]);
+      Source source =
+          (_knownSourceUri.contains(uri) ? uriToSource[uri] : null) ??
+              new Source(<int>[], const <int>[]);
 
       writeByteList(utf8Encoder.convert(uri == null ? "" : "$uri"));
       writeByteList(source.source);
@@ -746,8 +740,10 @@
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = writeUriReference(node.fileUri);
 
+    writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
+
     writeByte(flags);
     writeStringReference(node.name ?? '');
 
@@ -788,8 +784,10 @@
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = writeUriReference(node.fileUri);
 
+    writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
+
     writeByte(node.flags);
     writeName(node.name ?? _emptyName);
 
@@ -820,6 +818,7 @@
     final Uri activeFileUriSaved = _activeFileUri;
     _activeFileUri = writeUriReference(node.fileUri);
 
+    writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
     writeByte(node.kind.index);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 9bb574b0..44eb262 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 = 7;
+  static const int BinaryFormatVersion = 8;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index ab527e5..604208a 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -949,8 +949,27 @@
   void _buildDeclaredMembers(Class classNode, _ClassInfo info) {
     if (classNode.mixedInType != null) {
       _ClassInfo mixedInfo = _infoFor[classNode.mixedInType.classNode];
-      info.declaredGettersAndCalls = mixedInfo.declaredGettersAndCalls;
-      info.declaredSetters = mixedInfo.declaredSetters;
+
+      List<Member> declaredGettersAndCalls = <Member>[];
+      for (Member mixinMember in mixedInfo.declaredGettersAndCalls) {
+        if (mixinMember is! Procedure ||
+            (mixinMember is Procedure &&
+                !mixinMember.isNoSuchMethodForwarder)) {
+          declaredGettersAndCalls.add(mixinMember);
+        }
+      }
+
+      List<Member> declaredSetters = <Member>[];
+      for (Member mixinMember in mixedInfo.declaredSetters) {
+        if (mixinMember is! Procedure ||
+            (mixinMember is Procedure &&
+                !mixinMember.isNoSuchMethodForwarder)) {
+          declaredSetters.add(mixinMember);
+        }
+      }
+
+      info.declaredGettersAndCalls = declaredGettersAndCalls;
+      info.declaredSetters = declaredSetters;
     } else {
       var members = info.declaredGettersAndCalls = <Member>[];
       var setters = info.declaredSetters = <Member>[];
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 91f5fd6..f26f83c 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -406,7 +406,8 @@
       ..annotations = cloneAnnotations && !node.annotations.isEmpty
           ? node.annotations.map(clone).toList()
           : const <Expression>[]
-      ..flags = node.flags;
+      ..flags = node.flags
+      ..fileEqualsOffset = _cloneFileOffset(node.fileEqualsOffset);
   }
 
   visitFunctionDeclaration(FunctionDeclaration node) {
@@ -440,6 +441,7 @@
       ..annotations = cloneAnnotations && !node.annotations.isEmpty
           ? node.annotations.map(clone).toList()
           : const <Expression>[]
+      ..startFileOffset = _cloneFileOffset(node.startFileOffset)
       ..fileOffset = _cloneFileOffset(node.fileOffset)
       ..fileEndOffset = _cloneFileOffset(node.fileEndOffset)
       ..flags = node.flags;
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 6b03c7e..76fb9ff 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -192,6 +192,13 @@
   // we should at least unify the VM and non-VM variants.
   bool get nativeExtensionExpectsString => false;
 
+  /// Whether integer literals that cannot be represented exactly on the web
+  /// (i.e. in Javascript) should cause an error to be issued.
+  /// An example of such a number is `2^53 + 1` where in Javascript - because
+  /// integers are represented as doubles
+  /// `Math.pow(2, 53) = Math.pow(2, 53) + 1`.
+  bool get errorOnUnexactWebIntLiterals => false;
+
   /// Builds an expression that instantiates an [Invocation] that can be passed
   /// to [noSuchMethod].
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index 4e62d58..54d62ed 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -413,6 +413,14 @@
     }
   }
 
+  Constant runInsideContextIfNoContext(TreeNode node, Constant fun()) {
+    if (contextChain.isEmpty) {
+      return runInsideContext(node, fun);
+    } else {
+      return fun();
+    }
+  }
+
   pushContext(TreeNode contextNode) {
     contextChain.add(contextNode);
   }
@@ -533,11 +541,13 @@
 
     // Start building a new instance.
     return withNewInstanceBuilder(klass, typeArguments, () {
-      // "Run" the constructor (and any super constructor calls), which will
-      // initialize the fields of the new instance.
-      handleConstructorInvocation(
-          constructor, typeArguments, positionals, named);
-      return canonicalize(instanceBuilder.buildInstance());
+      return runInsideContextIfNoContext(node, () {
+        // "Run" the constructor (and any super constructor calls), which will
+        // initialize the fields of the new instance.
+        handleConstructorInvocation(
+            constructor, typeArguments, positionals, named);
+        return canonicalize(instanceBuilder.buildInstance());
+      });
     });
   }
 
@@ -901,13 +911,19 @@
     // TODO(kustermann): The heuristic of allowing all [VariableGet]s on [Let]
     // variables might allow more than it should.
     final VariableDeclaration variable = node.variable;
-    if (!variable.isConst &&
-        !_isFormalParameter(variable) &&
-        variable.parent is! Let) {
-      throw new Exception('The front-end should ensure we do not encounter a '
-          'variable get of a non-const variable.');
+    if (variable.parent is Let || _isFormalParameter(variable)) {
+      final Constant constant = env.lookupVariable(node.variable);
+      if (constant == null) {
+        errorReporter.nonConstantVariableGet(contextChain, node, variable.name);
+        throw const _AbortCurrentEvaluation();
+      }
+      return constant;
     }
-    return env.lookupVariable(node.variable);
+    if (variable.isConst) {
+      return evaluate(variable.initializer);
+    }
+    throw new Exception('The front-end should ensure we do not encounter a '
+        'variable get of a non-const variable.');
   }
 
   visitStaticGet(StaticGet node) {
@@ -1224,9 +1240,7 @@
   }
 
   Constant lookupVariable(VariableDeclaration variable) {
-    final Constant value = _variables[variable];
-    assert(value != null);
-    return value;
+    return _variables[variable];
   }
 
   DartType subsituteType(DartType type) {
@@ -1272,6 +1286,8 @@
   nonConstLiteral(List<TreeNode> context, TreeNode node, String klass);
   duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
   failedAssertion(List<TreeNode> context, TreeNode node, String message);
+  nonConstantVariableGet(
+      List<TreeNode> context, TreeNode node, String variableName);
 }
 
 abstract class ErrorReporterBase implements ErrorReporter {
@@ -1374,6 +1390,15 @@
         'The assertion condition evaluated to "false" with message "$message"',
         node);
   }
+
+  nonConstantVariableGet(
+      List<TreeNode> context, TreeNode node, String variableName) {
+    report(
+        context,
+        'The variable "$variableName" cannot be used inside a constant '
+        'expression.',
+        node);
+  }
 }
 
 class _SimpleErrorReporter extends ErrorReporterBase {
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index db64098..ac6ca9c2 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -17,9 +17,6 @@
   front_end: 0.1.1
   test: ^0.12.15+6
   stack_trace: ^1.6.6
-  ansicolor: ^0.0.9
   test_reflective_loader: ^0.1.0
   testing:
-    git:
-      url: https://github.com/peter-ahe-google/testing.git
-      ref: 2e196d5
+    path: ../testing
diff --git a/pkg/pkg.status b/pkg/pkg.status
index cc1fb23..cd5cb27 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -168,20 +168,13 @@
 analysis_server/test/services/refactoring/extract_local_test: Fail
 analyzer/test/generated/compile_time_error_code_driver_test: Fail
 analyzer/test/generated/compile_time_error_code_test: Fail
-analyzer/test/generated/declaration_resolver_test: Fail
 analyzer/test/generated/hint_code_driver_test: Fail
-analyzer/test/generated/hint_code_test: Fail
 analyzer/test/generated/invalid_code_driver_test: Fail
 analyzer/test/generated/non_error_resolver_driver_test: Fail
 analyzer/test/generated/non_error_resolver_test: Fail
-analyzer/test/generated/parser_test: Fail
 analyzer/test/generated/resolver_test: Fail
 analyzer/test/generated/utilities_test: Fail
 analyzer/test/src/context/context_test: Fail
-analyzer/test/src/dart/constant/evaluation_test: Fail
-analyzer/test/src/summary/prelinker_test: Fail
-analyzer/test/src/summary/summarize_ast_strong_test: Fail
-analyzer/test/src/summary/summarize_ast_test: Fail
 analyzer_plugin/test/src/utilities/completion/completion_target_test: Fail
 analyzer_plugin/test/src/utilities/completion/optype_test: Fail
 analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test: Fail
diff --git a/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart b/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
index d6291b9..068fcca 100644
--- a/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
@@ -186,30 +186,17 @@
   for (String prefix in prefixes) {
     map[prefix] = <Annotation>[];
   }
+  outer:
   for (Annotation annotation in annotatedCode.annotations) {
-    String annotationText = annotation.text;
-    String annotationPrefix;
-    bool not = false;
-    if (annotationText.startsWith('!')) {
-      annotationText = annotationText.substring(1);
-      not = true;
-    }
     for (String prefix in prefixes) {
-      if (annotationText.startsWith(prefix)) {
-        annotationPrefix = prefix;
-        annotation = new Annotation(annotation.lineNo, annotation.columnNo,
-            annotation.offset, annotationText.substring(prefix.length));
+      if (annotation.text.startsWith(prefix)) {
+        map[prefix].add(new Annotation(annotation.lineNo, annotation.columnNo,
+            annotation.offset, annotation.text.substring(prefix.length)));
+        continue outer;
       }
     }
-
     for (String prefix in prefixes) {
-      if (annotationPrefix == null) {
-        map[prefix].add(annotation);
-      } else if (annotationPrefix != prefix && not) {
-        map[prefix].add(annotation);
-      } else if (annotationPrefix == prefix && !not) {
-        map[prefix].add(annotation);
-      }
+      map[prefix].add(annotation);
     }
   }
   Map<String, AnnotatedCode> split = <String, AnnotatedCode>{};
diff --git a/pkg/status_file/bin/lint.dart b/pkg/status_file/bin/lint.dart
index d7e985d..17b84f47 100644
--- a/pkg/status_file/bin/lint.dart
+++ b/pkg/status_file/bin/lint.dart
@@ -62,7 +62,7 @@
     while (null != (readString = stdin.readLineSync())) {
       strings.add(readString);
     }
-  } on StdinException catch (e) {
+  } on StdinException {
     // I do not know why this happens.
   }
   if (!lintText(strings)) {
@@ -100,7 +100,7 @@
     var statusFile = new StatusFile.parse("stdin", text);
     return lintStatusFile(statusFile,
         checkForDisjunctions: checkForDisjunctions);
-  } on status_file.SyntaxError catch (error) {
+  } on status_file.SyntaxError {
     stderr.writeln("Could not parse stdin.");
   }
   return false;
diff --git a/pkg/status_file/lib/status_file_linter.dart b/pkg/status_file/lib/status_file_linter.dart
index 43b407b..fa98680 100644
--- a/pkg/status_file/lib/status_file_linter.dart
+++ b/pkg/status_file/lib/status_file_linter.dart
@@ -132,8 +132,11 @@
 /// Checks for duplicate section entries in the body of a section.
 Iterable<LintingError> lintSectionEntryDuplicates(StatusSection section) {
   var errors = <LintingError>[];
-  List<StatusEntry> statusEntries =
-      section.entries.where((entry) => entry is StatusEntry).toList();
+  // TODO(whereType): When whereType is supported, use that.
+  List<StatusEntry> statusEntries = section.entries
+      .where((entry) => entry is StatusEntry)
+      .cast<StatusEntry>()
+      .toList();
   for (var i = 0; i < statusEntries.length; i++) {
     var entry = statusEntries[i];
     for (var j = i + 1; j < statusEntries.length; j++) {
diff --git a/pkg/status_file/pubspec.yaml b/pkg/status_file/pubspec.yaml
index ddcbc45..7d000ed 100644
--- a/pkg/status_file/pubspec.yaml
+++ b/pkg/status_file/pubspec.yaml
@@ -1,12 +1,11 @@
 name: status_file
-author: Dart Team <misc@dartlang.org>
-description: Parses status files.
-homepage: http://www.dartlang.org
-#environment:
-#  sdk: '>=1.0.0 <2.0.0'
+# This package is not intended to be published.
+publish_to: none
+
 dependencies:
   path: "^1.4.0"
   args: "^0.13.7"
+
 dev_dependencies:
   expect:
     path: ../expect
diff --git a/pkg/status_file/test/repo_status_files_test.dart b/pkg/status_file/test/repo_status_files_test.dart
index ce57c42..8aacb64 100644
--- a/pkg/status_file/test/repo_status_files_test.dart
+++ b/pkg/status_file/test/repo_status_files_test.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:expect/expect.dart';
-import 'package:path/path.dart' as p;
 import 'package:status_file/status_file.dart';
 
 final Uri repoRoot = Platform.script.resolve("../../../");
diff --git a/pkg/vm/bin/frontend_server_starter.dart b/pkg/vm/bin/frontend_server_starter.dart
index f81d98b..dcbf63f 100644
--- a/pkg/vm/bin/frontend_server_starter.dart
+++ b/pkg/vm/bin/frontend_server_starter.dart
@@ -1,10 +1,9 @@
 library frontend_server;
 
 import 'dart:async';
-import 'dart:io';
 
 import '../lib/frontend_server.dart';
 
 Future<Null> main(List<String> args) async {
-  exit(await starter(args));
+  starter(args);
 }
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 7ec5b51..4d383d5 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -26,6 +26,7 @@
 import 'dart:isolate';
 import 'dart:typed_data' show Uint8List;
 
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_prototype/file_system.dart';
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
@@ -199,15 +200,16 @@
     {bool strongMode: false,
     bool suppressWarnings: false,
     bool syncAsync: false,
-    String packageConfig: null}) async {
+    String packageConfig: null,
+    String multirootFilepaths,
+    String multirootScheme}) async {
   IncrementalCompilerWrapper compiler = lookupIncrementalCompiler(isolateId);
   if (compiler != null) {
     updateSources(compiler, sourceFiles);
     invalidateSources(compiler, sourceFiles);
   } else {
-    final FileSystem fileSystem = sourceFiles.isEmpty && platformKernel == null
-        ? StandardFileSystem.instance
-        : _buildFileSystem(sourceFiles, platformKernel);
+    FileSystem fileSystem = _buildFileSystem(
+        sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
 
     // TODO(aam): IncrementalCompilerWrapper instance created below have to be
     // destroyed when corresponding isolate is shut down. To achieve that kernel
@@ -384,6 +386,8 @@
   final bool suppressWarnings = request[8];
   final bool syncAsync = request[9];
   final String packageConfig = request[10];
+  final String multirootFilepaths = request[11];
+  final String multirootScheme = request[12];
 
   Uri platformKernelPath = null;
   List<int> platformKernel = null;
@@ -436,11 +440,12 @@
         strongMode: strong,
         suppressWarnings: suppressWarnings,
         syncAsync: syncAsync,
-        packageConfig: packageConfig);
+        packageConfig: packageConfig,
+        multirootFilepaths: multirootFilepaths,
+        multirootScheme: multirootScheme);
   } else {
-    final FileSystem fileSystem = sourceFiles.isEmpty && platformKernel == null
-        ? StandardFileSystem.instance
-        : _buildFileSystem(sourceFiles, platformKernel);
+    FileSystem fileSystem = _buildFileSystem(
+        sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
     compiler = new SingleShotCompilerWrapper(fileSystem, platformKernelPath,
         requireMain: sourceFiles.isEmpty,
         strongMode: strong,
@@ -493,28 +498,46 @@
   }
 }
 
-/// Creates a file system containing the files specified in [namedSources] and
+/// Creates a file system containing the files specified in [sourceFiles] and
 /// that delegates to the underlying file system for any other file request.
-/// The [namedSources] list interleaves file name string and
+/// The [sourceFiles] list interleaves file name string and
 /// raw file content Uint8List.
 ///
 /// The result can be used instead of StandardFileSystem.instance by the
 /// frontend.
-FileSystem _buildFileSystem(List namedSources, List<int> platformKernel) {
-  MemoryFileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///'));
-  if (namedSources != null) {
-    for (int i = 0; i < namedSources.length ~/ 2; i++) {
-      fileSystem
-          .entityForUri(Uri.parse(namedSources[i * 2]))
-          .writeAsBytesSync(namedSources[i * 2 + 1]);
+FileSystem _buildFileSystem(List sourceFiles, List<int> platformKernel,
+    String multirootFilepaths, String multirootScheme) {
+  FileSystem fileSystem;
+
+  if (sourceFiles.isEmpty && platformKernel == null) {
+    fileSystem = StandardFileSystem.instance;
+  } else {
+    MemoryFileSystem memoryFileSystem =
+        new MemoryFileSystem(Uri.parse('file:///'));
+    if (sourceFiles != null) {
+      for (int i = 0; i < sourceFiles.length ~/ 2; i++) {
+        memoryFileSystem
+            .entityForUri(Uri.parse(sourceFiles[i * 2]))
+            .writeAsBytesSync(sourceFiles[i * 2 + 1]);
+      }
     }
+    if (platformKernel != null) {
+      memoryFileSystem
+          .entityForUri(Uri.parse(platformKernelFile))
+          .writeAsBytesSync(platformKernel);
+    }
+    fileSystem = new HybridFileSystem(memoryFileSystem);
   }
-  if (platformKernel != null) {
-    fileSystem
-        .entityForUri(Uri.parse(platformKernelFile))
-        .writeAsBytesSync(platformKernel);
+
+  if (multirootFilepaths != null) {
+    List<Uri> list = multirootFilepaths
+        .split(',')
+        .map((String s) => Uri.base.resolveUri(new Uri.file(s)))
+        .toList();
+    fileSystem = new MultiRootFileSystem(
+        multirootScheme ?? "org-dartlang-root", list, fileSystem);
   }
-  return new HybridFileSystem(fileSystem);
+  return fileSystem;
 }
 
 train(String scriptUri, String platformKernelPath) {
@@ -546,6 +569,8 @@
     false /* suppress warnings */,
     false /* synchronous async */,
     null /* package_config */,
+    null /* multirootFilepaths */,
+    null /* multirootScheme */,
   ];
   _processLoadRequest(request);
 }
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 599d4c1..986874d 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -169,9 +169,7 @@
     asm.emitNativeCall(nativeEntryCpIndex);
   }
 
-  LibraryIndex _libraryIndex;
-  LibraryIndex get libraryIndex =>
-      _libraryIndex ??= new LibraryIndex.coreLibraries(component);
+  LibraryIndex get libraryIndex => coreTypes.index;
 
   Procedure _listFromLiteral;
   Procedure get listFromLiteral => _listFromLiteral ??=
@@ -211,6 +209,11 @@
       _closureFunctionTypeArguments ??= libraryIndex.getMember(
           'dart:core', '_Closure', '_function_type_arguments');
 
+  Field _closureDelayedTypeArguments;
+  Field get closureDelayedTypeArguments =>
+      _closureDelayedTypeArguments ??= libraryIndex.getMember(
+          'dart:core', '_Closure', '_delayed_type_arguments');
+
   Field _closureFunction;
   Field get closureFunction => _closureFunction ??=
       libraryIndex.getMember('dart:core', '_Closure', '_function');
@@ -223,6 +226,10 @@
   Procedure get prependTypeArguments => _prependTypeArguments ??=
       libraryIndex.getTopLevelMember('dart:_internal', '_prependTypeArguments');
 
+  Procedure _futureValue;
+  Procedure get futureValue =>
+      _futureValue ??= libraryIndex.getMember('dart:async', 'Future', 'value');
+
   void _genConstructorInitializers(Constructor node) {
     bool isRedirecting =
         node.initializers.any((init) => init is RedirectingInitializer);
@@ -1109,9 +1116,18 @@
     asm.emitDrop1();
   }
 
-//  @override
-//  visitDirectMethodInvocation(DirectMethodInvocation node) {
-//  }
+  @override
+  visitDirectMethodInvocation(DirectMethodInvocation node) {
+    final args = node.arguments;
+    _genArguments(node.receiver, args);
+    final target = node.target;
+    if (target is Procedure && !target.isGetter && !target.isSetter) {
+      _genStaticCallWithArgs(target, args, hasReceiver: true);
+    } else {
+      throw new UnsupportedOperationError(
+          'Unsupported DirectMethodInvocation with target ${target.runtimeType} $target');
+    }
+  }
 
   @override
   visitDirectPropertyGet(DirectPropertyGet node) {
@@ -1125,22 +1141,58 @@
     }
   }
 
-//  @override
-//  visitDirectPropertySet(DirectPropertySet node) {
-//  }
+  @override
+  visitDirectPropertySet(DirectPropertySet node) {
+    node.receiver.accept(this);
+    node.value.accept(this);
+    final target = node.target;
+    if (target is Field || (target is Procedure && target.isSetter)) {
+      _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+    } else {
+      throw new UnsupportedOperationError(
+          'Unsupported DirectPropertySet with target ${target.runtimeType} $target');
+    }
+  }
 
   @override
   visitFunctionExpression(FunctionExpression node) {
     _genClosure(node, '<anonymous closure>', node.function);
   }
 
-//  @override
-//  visitInstantiation(Instantiation node) {
-//  }
-//
-//  @override
-//  visitInvalidExpression(InvalidExpression node) {
-//  }
+  @override
+  visitInstantiation(Instantiation node) {
+    final int oldClosure = locals.tempIndexInFrame(node, tempIndex: 0);
+    final int newClosure = locals.tempIndexInFrame(node, tempIndex: 1);
+
+    node.expression.accept(this);
+    asm.emitPopLocal(oldClosure);
+
+    assert(closureClass.typeParameters.isEmpty);
+    asm.emitAllocate(cp.add(new ConstantClass(closureClass)));
+    asm.emitStoreLocal(newClosure);
+
+    _genTypeArguments(node.typeArguments);
+    asm.emitStoreFieldTOS(
+        cp.add(new ConstantFieldOffset(closureDelayedTypeArguments)));
+
+    // Copy the rest of the fields from old closure to a new closure.
+    final fieldsToCopy = <Field>[
+      closureInstantiatorTypeArguments,
+      closureFunctionTypeArguments,
+      closureFunction,
+      closureContext,
+    ];
+
+    for (Field field in fieldsToCopy) {
+      final fieldOffsetCpIndex = cp.add(new ConstantFieldOffset(field));
+      asm.emitPush(newClosure);
+      asm.emitPush(oldClosure);
+      asm.emitLoadFieldTOS(fieldOffsetCpIndex);
+      asm.emitStoreFieldTOS(fieldOffsetCpIndex);
+    }
+
+    asm.emitPush(newClosure);
+  }
 
   @override
   visitIsExpression(IsExpression node) {
@@ -1322,7 +1374,7 @@
   @override
   visitSuperPropertyGet(SuperPropertyGet node) {
     _genPushReceiver();
-    Member target =
+    final Member target =
         hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
     if (target == null) {
       throw new UnsupportedOperationError(
@@ -1336,9 +1388,23 @@
     }
   }
 
-//  @override
-//  visitSuperPropertySet(SuperPropertySet node) {
-//  }
+  @override
+  visitSuperPropertySet(SuperPropertySet node) {
+    _genPushReceiver();
+    node.value.accept(this);
+    final Member target = hierarchy
+        .getDispatchTarget(enclosingClass.superclass, node.name, setter: true);
+    if (target == null) {
+      throw new UnsupportedOperationError(
+          'Unsupported SuperPropertySet without target');
+    }
+    if (target is Field || (target is Procedure && target.isSetter)) {
+      _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+    } else {
+      throw new UnsupportedOperationError(
+          'Unsupported SuperPropertySet with target ${target.runtimeType} $target');
+    }
+  }
 
   @override
   visitNot(Not node) {
@@ -1528,33 +1594,20 @@
     }
   }
 
-//  @override
-//  visitLoadLibrary(LoadLibrary node) {
-//  }
-//
-//  @override
-//  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
-//  }
-//
-//  @override
-//  visitVectorCreation(VectorCreation node) {
-//  }
-//
-//  @override
-//  visitVectorGet(VectorGet node) {
-//  }
-//
-//  @override
-//  visitVectorSet(VectorSet node) {
-//  }
-//
-//  @override
-//  visitVectorCopy(VectorCopy node) {
-//  }
-//
-//  @override
-//  visitClosureCreation(ClosureCreation node) {
-//  }
+  void _genFutureNull() {
+    _genPushNull();
+    _genStaticCall(futureValue, new ConstantArgDesc(1), 1);
+  }
+
+  @override
+  visitLoadLibrary(LoadLibrary node) {
+    _genFutureNull();
+  }
+
+  @override
+  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+    _genFutureNull();
+  }
 
   @override
   visitAssertStatement(AssertStatement node) {
@@ -2163,16 +2216,15 @@
     asm.emitDrop1();
   }
 
-//  @override
-//  visitLocalInitializer(LocalInitializer node) {
-//  }
-//
-//  @override
-//  visitAssertInitializer(AssertInitializer node) {
-//  }
-//
-//  @override
-//  visitInvalidInitializer(InvalidInitializer node) {}
+  @override
+  visitLocalInitializer(LocalInitializer node) {
+    node.variable.accept(this);
+  }
+
+  @override
+  visitAssertInitializer(AssertInitializer node) {
+    node.statement.accept(this);
+  }
 
   @override
   visitConstantExpression(ConstantExpression node) {
@@ -2226,8 +2278,9 @@
   int visitTearOffConstant(TearOffConstant node) =>
       cp.add(new ConstantTearOff(node.procedure));
 
-//  @override
-//  int visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+  @override
+  int visitTypeLiteralConstant(TypeLiteralConstant node) =>
+      cp.add(new ConstantType(node.type));
 }
 
 class UnsupportedOperationError {
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 5bea5f6..1c4edcd 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -994,4 +994,9 @@
   visitTryFinally(TryFinally node) {
     _visit(node, temps: 2);
   }
+
+  @override
+  visitInstantiation(Instantiation node) {
+    _visit(node, temps: 2);
+  }
 }
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 9d5797b..5c69abf 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -668,7 +668,7 @@
 /// processes user input.
 /// `compiler` is an optional parameter so it can be replaced with mocked
 /// version for testing.
-Future<int> starter(
+Future<void> starter(
   List<String> args, {
   CompilerInterface compiler,
   Stream<List<int>> input,
@@ -682,7 +682,7 @@
   } catch (error) {
     print('ERROR: $error\n');
     print(usage);
-    return 1;
+    exit(1);
   }
 
   if (options['train']) {
@@ -726,14 +726,12 @@
   );
 
   if (options.rest.isNotEmpty) {
-    return await compiler.compile(options.rest[0], options,
-            generator: generator)
+    exit(await compiler.compile(options.rest[0], options, generator: generator)
         ? 0
-        : 254;
+        : 254);
   }
 
   listenAndCompile(compiler, input ?? stdin, options, () {
     exit(0);
   }, generator: generator);
-  return 0;
 }
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 162890e..610f2a1 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -312,6 +312,13 @@
     reportIt(context, message, node);
   }
 
+  nonConstantVariableGet(
+      List<TreeNode> context, TreeNode node, String variableName) {
+    final message = codes.templateConstEvalNonConstantVariableGet
+        .withArguments(variableName);
+    reportIt(context, message, node);
+  }
+
   reportIt(List<TreeNode> context, codes.Message message, TreeNode node) {
     final Uri uri = getFileUri(node);
     final int fileOffset = getFileOffset(node);
@@ -339,7 +346,7 @@
   }
 
   getFileOffset(TreeNode node) {
-    while (node.fileOffset == TreeNode.noOffset) {
+    while (node?.fileOffset == TreeNode.noOffset) {
       node = node.parent;
     }
     return node == null ? TreeNode.noOffset : node.fileOffset;
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index c6632f8..eec95ba 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -1,13 +1,13 @@
+# This package is not intended to be published.
 name: vm
-version: 0.1.0-alpha.1
-author: Dart Team <misc@dartlang.org>
+# version: do-not-upload
 description: VM specific Dart code and helper scripts
-homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm
-environment:
-  sdk: ">=1.8.0 <2.0.0"
+
 dependencies:
-  build_integration: 0.0.1
+  build_integration:
+    path: ../build_integration
   front_end: 0.1.0-alpha.6
   kernel: 0.3.0-alpha.3
+
 dev_dependencies:
   args: ^0.13.0
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index 7efa188..5ffff46 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -29,7 +29,7 @@
     final CompilerInterface compiler = new _MockedCompiler();
 
     test('train with mocked compiler completes', () async {
-      expect(await starter(<String>['--train'], compiler: compiler), equals(0));
+      await starter(<String>['--train'], compiler: compiler);
     });
   });
 
@@ -44,8 +44,7 @@
         '--sdk-root',
         'sdkroot',
       ];
-      final int exitcode = await starter(args, compiler: compiler);
-      expect(exitcode, equals(0));
+      await starter(args, compiler: compiler);
       final List<ArgResults> capturedArgs = verify(compiler.compile(
         argThat(equals('server.dart')),
         captureAny,
@@ -62,8 +61,7 @@
         'sdkroot',
         '--strong',
       ];
-      final int exitcode = await starter(args, compiler: compiler);
-      expect(exitcode, equals(0));
+      await starter(args, compiler: compiler);
       final List<ArgResults> capturedArgs = verify(compiler.compile(
         argThat(equals('server.dart')),
         captureAny,
@@ -82,8 +80,7 @@
         '--strong',
         '--no-sync-async',
       ];
-      final int exitcode = await starter(args, compiler: compiler);
-      expect(exitcode, equals(0));
+      await starter(args, compiler: compiler);
       final List<ArgResults> capturedArgs = verify(compiler.compile(
         argThat(equals('server.dart')),
         captureAny,
@@ -101,8 +98,7 @@
         'sdkroot',
         '--link-platform',
       ];
-      final int exitcode = await starter(args, compiler: compiler);
-      expect(exitcode, equals(0));
+      await starter(args, compiler: compiler);
       final List<ArgResults> capturedArgs = verify(compiler.compile(
         argThat(equals('server.dart')),
         captureAny,
@@ -135,12 +131,11 @@
         compileCalled.sendPort.send(true);
       });
 
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: inputStreamController.stream,
       );
-      expect(exitcode, equals(0));
       inputStreamController.add('compile server.dart\n'.codeUnits);
       await compileCalled.first;
       inputStreamController.close();
@@ -173,12 +168,11 @@
         compileCalled.sendPort.send(true);
       });
 
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: inputStreamController.stream,
       );
-      expect(exitcode, equals(0));
       inputStreamController.add('compile server.dart\n'.codeUnits);
       await compileCalled.first;
       inputStreamController.close();
@@ -197,12 +191,11 @@
         compileCalled.sendPort.send(true);
       });
 
-      final int exitcode = await starter(
+      await starter(
         strongArgs,
         compiler: compiler,
         input: inputStreamController.stream,
       );
-      expect(exitcode, equals(0));
       inputStreamController.add('compile server.dart\n'.codeUnits);
       await compileCalled.first;
       inputStreamController.close();
@@ -223,12 +216,11 @@
         compileCalled.sendPort.send(true);
       });
 
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: streamController.stream,
       );
-      expect(exitcode, equals(0));
       streamController.add('compile server1.dart\n'.codeUnits);
       streamController.add('compile server2.dart\n'.codeUnits);
       await compileCalled.first;
@@ -256,12 +248,11 @@
           .thenAnswer((Invocation invocation) {
         recompileCalled.sendPort.send(true);
       });
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: streamController.stream,
       );
-      expect(exitcode, equals(0));
       streamController
           .add('recompile abc\nfile1.dart\nfile2.dart\nabc\n'.codeUnits);
       await recompileCalled.first;
@@ -283,12 +274,11 @@
           .thenAnswer((Invocation invocation) {
         recompileCalled.sendPort.send(true);
       });
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: streamController.stream,
       );
-      expect(exitcode, equals(0));
       streamController.add(
           'recompile file2.dart abc\nfile1.dart\nfile2.dart\nabc\n'.codeUnits);
       await recompileCalled.first;
@@ -308,12 +298,11 @@
       when(compiler.acceptLastDelta()).thenAnswer((Invocation invocation) {
         acceptCalled.sendPort.send(true);
       });
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: inputStreamController.stream,
       );
-      expect(exitcode, equals(0));
       inputStreamController.add('accept\n'.codeUnits);
       await acceptCalled.first;
       inputStreamController.close();
@@ -327,12 +316,11 @@
           .thenAnswer((Invocation invocation) {
         resetCalled.sendPort.send(true);
       });
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: inputStreamController.stream,
       );
-      expect(exitcode, equals(0));
       inputStreamController.add('reset\n'.codeUnits);
       await resetCalled.first;
       inputStreamController.close();
@@ -347,12 +335,11 @@
           .thenAnswer((Invocation invocation) {
         recompileCalled.sendPort.send(true);
       });
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: compiler,
         input: streamController.stream,
       );
-      expect(exitcode, equals(0));
       streamController.add('compile file1.dart\n'.codeUnits);
       streamController.add('accept\n'.codeUnits);
       streamController
@@ -413,7 +400,7 @@
           new _MockedBinaryPrinterFactory();
       when(printerFactory.newBinaryPrinter(any))
           .thenReturn(new _MockedBinaryPrinter());
-      final int exitcode = await starter(
+      await starter(
         args,
         compiler: null,
         input: streamController.stream,
@@ -421,7 +408,6 @@
         generator: generator,
         binaryPrinterFactory: printerFactory,
       );
-      expect(exitcode, equals(0));
 
       streamController.add('compile file1.dart\n'.codeUnits);
       await receivedResult.first;
@@ -448,8 +434,7 @@
           '--output-incremental-dill',
           '/foo/bar/server.incremental.dart.dill',
         ];
-        final int exitcode = await starter(args, compiler: compiler);
-        expect(exitcode, equals(0));
+        await starter(args, compiler: compiler);
         final List<ArgResults> capturedArgs = verify(compiler.compile(
           argThat(equals('server.dart')),
           captureAny,
@@ -516,9 +501,7 @@
         }
       });
 
-      int exitcode =
-          await starter(args, input: streamController.stream, output: ioSink);
-      expect(exitcode, equals(0));
+      await starter(args, input: streamController.stream, output: ioSink);
       streamController.add('compile ${file.path}\n'.codeUnits);
       int count = 0;
       Completer<bool> allDone = new Completer<bool>();
@@ -621,9 +604,7 @@
           }
         }
       });
-      int exitcode =
-          await starter(args, input: streamController.stream, output: ioSink);
-      expect(exitcode, equals(0));
+      await starter(args, input: streamController.stream, output: ioSink);
       streamController.add('compile ${file.path}\n'.codeUnits);
       int count = 0;
       Completer<bool> allDone = new Completer<bool>();
@@ -694,9 +675,7 @@
           }
         }
       });
-      int exitcode =
-          await starter(args, input: streamController.stream, output: ioSink);
-      expect(exitcode, equals(0));
+      await starter(args, input: streamController.stream, output: ioSink);
       streamController.add('compile ${file.path}\n'.codeUnits);
       int count = 0;
       Completer<bool> allDone = new Completer<bool>();
@@ -760,8 +739,7 @@
         '--filesystem-scheme=test-scheme',
         'test-scheme:///foo.dart'
       ];
-      int exitcode = await starter(args);
-      expect(exitcode, equals(0));
+      await starter(args);
     });
 
     test('compile and produce deps file', () async {
@@ -779,9 +757,7 @@
         '--depfile=${depFile.path}',
         file.path
       ];
-      int exitcode = await starter(args);
-      expect(exitcode, equals(0));
-
+      await starter(args);
       expect(depFile.existsSync(), true);
       var depContents = depFile.readAsStringSync();
       var depContentsParsed = depContents.split(': ');
@@ -840,9 +816,7 @@
           }
         });
 
-        int exitcode =
-            await starter(args, input: streamController.stream, output: ioSink);
-        expect(exitcode, equals(0));
+        await starter(args, input: streamController.stream, output: ioSink);
         streamController.add('compile ${dart2js.path}\n'.codeUnits);
         int count = 0;
         Completer<bool> allDone = new Completer<bool>();
diff --git a/pkg/vm/testcases/bytecode/closures.dart b/pkg/vm/testcases/bytecode/closures.dart
index 102cb0f..ff1c650 100644
--- a/pkg/vm/testcases/bytecode/closures.dart
+++ b/pkg/vm/testcases/bytecode/closures.dart
@@ -131,4 +131,12 @@
   }
 }
 
+typedef IntFunc(int arg);
+
+IntFunc testPartialInstantiation() {
+  void foo<T>(T t) {}
+  IntFunc intFunc = foo;
+  return intFunc;
+}
+
 main() {}
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 2080a18..2bece87 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -2,6 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
+typedef IntFunc = (core::int) → dynamic;
 class C1 extends core::Object {
 [@vm.bytecode=
 Bytecode {
@@ -1409,6 +1410,103 @@
 }
 [@vm.bytecode=
 Bytecode {
+  Entry                6
+  CheckStack
+  Allocate             CP#12
+  StoreLocal           r3
+  Push                 r3
+  PushConstant         CP#7
+  StoreFieldTOS        CP#13
+  Push                 r3
+  PushConstant         CP#7
+  StoreFieldTOS        CP#2
+  Push                 r3
+  PushConstant         CP#0
+  StoreFieldTOS        CP#14
+  Push                 r3
+  Push                 r0
+  StoreFieldTOS        CP#1
+  PopLocal             r2
+  Push                 r2
+  PopLocal             r3
+  Allocate             CP#12
+  StoreLocal           r5
+  PushConstant         CP#15
+  StoreFieldTOS        CP#16
+  Push                 r5
+  Push                 r3
+  LoadFieldTOS         CP#13
+  StoreFieldTOS        CP#13
+  Push                 r5
+  Push                 r3
+  LoadFieldTOS         CP#2
+  StoreFieldTOS        CP#2
+  Push                 r5
+  Push                 r3
+  LoadFieldTOS         CP#14
+  StoreFieldTOS        CP#14
+  Push                 r5
+  Push                 r3
+  LoadFieldTOS         CP#1
+  StoreFieldTOS        CP#1
+  Push                 r5
+  PopLocal             r4
+  Push                 r4
+  ReturnTOS
+  PushConstant         CP#7
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ClosureFunction foo <T extends dart.core::Object = dynamic>(T t) → void;
+  [1] = FieldOffset dart.core::_Closure::_context
+  [2] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [3] = Int 0
+  [4] = Int 1
+  [5] = ArgDesc num-args 4, num-type-args 0, names []
+  [6] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#5
+  [7] = Null
+  [8] = Type T
+  [9] = String 't'
+  [10] = SubtypeTestCache
+  [11] = EndClosureFunctionScope
+  [12] = Class dart.core::_Closure
+  [13] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [14] = FieldOffset dart.core::_Closure::_function
+  [15] = TypeArgs [dart.core::int]
+  [16] = FieldOffset dart.core::_Closure::_delayed_type_arguments
+}
+Closure CP#0 {
+  Entry                2
+  CheckStack
+  Push                 FP[-6]
+  LoadFieldTOS         CP#1
+  PopLocal             r0
+  Push                 FP[-7]
+  Push                 FP[-6]
+  LoadFieldTOS         CP#2
+  PushConstant         CP#3
+  PushConstant         CP#4
+  PushConstant         CP#6
+  IndirectStaticCall   4, CP#5
+  PopLocal             FP[-7]
+  Push                 FP[-5]
+  PushConstant         CP#7
+  Push                 FP[-7]
+  PushConstant         CP#8
+  PushConstant         CP#9
+  AssertAssignable     0, CP#10
+  Drop1
+  PushConstant         CP#7
+  ReturnTOS
+
+}
+]static method testPartialInstantiation() → (core::int) → dynamic {
+  function foo<T extends core::Object = dynamic>(T t) → void {}
+  (core::int) → dynamic intFunc = foo<core::int>;
+  return intFunc;
+}
+[@vm.bytecode=
+Bytecode {
   Entry                0
   CheckStack
   PushConstant         CP#0
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart b/pkg/vm/testcases/bytecode/deferred_lib.dart
new file mode 100644
index 0000000..b93cc06
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/deferred_lib.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "hello.dart" deferred as lib;
+
+callDeferred() => lib.main();
+
+testLoadLibrary() => lib.loadLibrary();
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart.expect b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
new file mode 100644
index 0000000..8d4cb94
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
@@ -0,0 +1,56 @@
+library #lib;
+import self as self;
+import "./hello.dart" as hel;
+
+[@vm.bytecode=
+Bytecode {
+  Entry                1
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  PopLocal             r0
+  PushConstant         CP#4
+  IndirectStaticCall   0, CP#3
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.async::Future::value', arg-desc CP#1
+  [3] = ArgDesc num-args 0, num-type-args 0, names []
+  [4] = StaticICData target '#lib1::main', arg-desc CP#3
+}
+]static method callDeferred() → dynamic
+  return let final dynamic #t1 = CheckLibraryIsLoaded(lib) in hel::main();
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  PushConstant         CP#2
+  IndirectStaticCall   1, CP#1
+  ReturnTOS
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = StaticICData target 'dart.async::Future::value', arg-desc CP#1
+}
+]static method testLoadLibrary() → dynamic
+  return LoadLibrary(lib);
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/literals.dart b/pkg/vm/testcases/bytecode/literals.dart
index 69a0e85..0acd65b 100644
--- a/pkg/vm/testcases/bytecode/literals.dart
+++ b/pkg/vm/testcases/bytecode/literals.dart
@@ -45,7 +45,7 @@
   print(42);
   print('foo');
   print(A.elem2);
-  print(const [42, 'foo']);
+  print(const [42, 'foo', int]);
   print(const <String, A>{'E2': A.elem2, 'E4': A.elem4});
   print(
       const D(const C(4, 5, 6), const {'foo': 42, 'bar': const B(c2.length)}));
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index a3c9ec2..7d6702f 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -360,19 +360,19 @@
   PushConstant         CP#9
   IndirectStaticCall   1, CP#1
   Drop1
-  PushConstant         CP#10
   PushConstant         CP#11
+  PushConstant         CP#12
   IndirectStaticCall   1, CP#1
   Drop1
-  PushConstant         CP#19
   PushConstant         CP#20
+  PushConstant         CP#21
   IndirectStaticCall   1, CP#1
   Drop1
-  PushConstant         CP#30
   PushConstant         CP#31
+  PushConstant         CP#32
   IndirectStaticCall   1, CP#1
   Drop1
-  PushConstant         CP#32
+  PushConstant         CP#33
   ReturnTOS
 }
 ConstantPool {
@@ -386,35 +386,36 @@
   [7] = String 'A.elem2'
   [8] = Instance #lib::A type-args CP#5 {index: 6, _name: 7}
   [9] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [10] = List type-arg dart.core::Object, entries CP# [0, 3]
-  [11] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [12] = TypeArgs [dart.core::String, #lib::A]
-  [13] = String 'E2'
-  [14] = String 'E4'
-  [15] = Int 3
-  [16] = String 'A.elem4'
-  [17] = Instance #lib::A type-args CP#5 {index: 15, _name: 16}
-  [18] = List type-arg dynamic, entries CP# [13, 8, 14, 17]
-  [19] = Instance dart.core::_ImmutableMap type-args CP#12 {_kvPairs: 18}
-  [20] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [21] = Int 9
-  [22] = Int 30
-  [23] = Instance #lib::C type-args CP#5 {j: 21, i: 22}
-  [24] = TypeArgs [dart.core::String, dart.core::Object]
-  [25] = String 'bar'
-  [26] = Int 6
-  [27] = Instance #lib::B type-args CP#5 {i: 26}
-  [28] = List type-arg dynamic, entries CP# [3, 0, 25, 27]
-  [29] = Instance dart.core::_ImmutableMap type-args CP#24 {_kvPairs: 28}
-  [30] = Instance #lib::D type-args CP#5 {x: 23, y: 29}
-  [31] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [32] = Null
+  [10] = Type dart.core::int
+  [11] = List type-arg dart.core::Object, entries CP# [0, 3, 10]
+  [12] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [13] = TypeArgs [dart.core::String, #lib::A]
+  [14] = String 'E2'
+  [15] = String 'E4'
+  [16] = Int 3
+  [17] = String 'A.elem4'
+  [18] = Instance #lib::A type-args CP#5 {index: 16, _name: 17}
+  [19] = List type-arg dynamic, entries CP# [14, 8, 15, 18]
+  [20] = Instance dart.core::_ImmutableMap type-args CP#13 {_kvPairs: 19}
+  [21] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [22] = Int 9
+  [23] = Int 30
+  [24] = Instance #lib::C type-args CP#5 {j: 22, i: 23}
+  [25] = TypeArgs [dart.core::String, dart.core::Object]
+  [26] = String 'bar'
+  [27] = Int 6
+  [28] = Instance #lib::B type-args CP#5 {i: 27}
+  [29] = List type-arg dynamic, entries CP# [3, 0, 26, 28]
+  [30] = Instance dart.core::_ImmutableMap type-args CP#25 {_kvPairs: 29}
+  [31] = Instance #lib::D type-args CP#5 {x: 24, y: 30}
+  [32] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [33] = Null
 }
 ]static method test_constants2() → void {
   core::print(42);
   core::print("foo");
   core::print(self::A::elem2);
-  core::print(const <core::Object>[42, "foo"]);
+  core::print(const <core::Object>[42, "foo", core::int]);
   core::print(const <core::String, self::A>{"E2": self::A::elem2, "E4": self::A::elem4});
   core::print(const self::D::•(const self::C::•(4, 5, 6), const <core::String, core::Object>{"foo": 42, "bar": const self::B::•(self::c2.{core::String::length})}));
 }
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index c53b8d1..5f1721d 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -61,20 +61,22 @@
 static char* GetDirectoryPrefixFromExeName() {
   const char* name = Platform::GetExecutableName();
   const char* sep = File::PathSeparator();
-  // Locate the last occurance of |sep| in |name|.
-  intptr_t i;
-  for (i = strlen(name) - 1; i >= 0; --i) {
+  const intptr_t sep_length = strlen(sep);
+
+  for (intptr_t i = strlen(name) - 1; i >= 0; --i) {
     const char* str = name + i;
-    if (strstr(str, sep) == str) {
-      break;
+    if (strncmp(str, sep, sep_length) == 0
+#if defined(HOST_OS_WINDOWS)
+        // TODO(aam): GetExecutableName doesn't work reliably on Windows,
+        // the code below is a workaround for that (we would be using
+        // just single Platform::Separator instead of both slashes if it did).
+        || *str == '/'
+#endif
+    ) {
+      return Utils::StrNDup(name, i + 1);
     }
   }
-
-  if (i < 0) {
-    return strdup("");
-  }
-
-  return Utils::StrNDup(name, i + 1);
+  return strdup("");
 }
 
 DFE::DFE()
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 76dec67..38b59c3 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -251,6 +251,9 @@
   }
 
   auto isolate_data = new IsolateData(script_uri, NULL, NULL, NULL);
+  // Kernel buffer released by ~IsolateData during isolate shutdown.
+  isolate_data->set_kernel_buffer(payload, payload_length,
+                                  true /*take ownership*/);
 
   // We bootstrap the isolate from the Kernel file (instead of using a
   // potentially linked-in kernel file).
@@ -263,7 +266,6 @@
 
   Dart_EnterScope();
   Dart_Handle library = Dart_LoadScriptFromKernel(payload, payload_length);
-  free(payload);
   CHECK_RESULT(library);
   Dart_Handle url = DartUtils::NewString("dart:_builtin");
   CHECK_RESULT(url);
diff --git a/runtime/configs.gni b/runtime/configs.gni
index 648083d..be99ecd 100644
--- a/runtime/configs.gni
+++ b/runtime/configs.gni
@@ -206,12 +206,6 @@
   if (defined(invoker.extra_deps)) {
     extra_deps += invoker.extra_deps
   }
-  not_needed(invoker,
-             [
-               "snapshot_sources",
-               "nosnapshot_sources",
-               "nosnapshot_deps",
-             ])
   foreach(conf, _all_configs) {
     target(invoker.target_type, "${target_name}${conf.suffix}") {
       forward_variables_from(invoker,
@@ -231,11 +225,20 @@
       }
       deps = configured_deps + extra_deps
       if (conf.snapshot) {
-        if (defined(invoker.snapshot_sources)) {
+        if (defined(snapshot_sources)) {
           sources += snapshot_sources
         }
+        if (defined(nosnapshot_sources)) {
+          not_needed([ "nosnapshot_sources" ])
+        }
+        if (defined(nosnapshot_deps)) {
+          not_needed([ "nosnapshot_deps" ])
+        }
       } else {
-        if (defined(invoker.nosnapshot_sources)) {
+        if (defined(snapshot_sources)) {
+          not_needed([ "snapshot_sources" ])
+        }
+        if (defined(nosnapshot_sources)) {
           sources += nosnapshot_sources
         }
         if (defined(nosnapshot_deps)) {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 4d54a54..3934bda 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -753,9 +753,11 @@
  * \param version Identifies the version of the struct used by the client.
  *   should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION.
  * \param vm_isolate_snapshot A buffer containing a snapshot of the VM isolate
- *   or NULL if no snapshot is provided.
+ *   or NULL if no snapshot is provided. If provided, the buffer must remain
+ *   valid until Dart_Cleanup returns.
  * \param instructions_snapshot A buffer containing a snapshot of precompiled
- *   instructions, or NULL if no snapshot is provided.
+ *   instructions, or NULL if no snapshot is provided. If provided, the buffer
+ *   must remain valid until Dart_Cleanup returns.
  * \param create A function to be called during isolate creation.
  *   See Dart_IsolateCreateCallback.
  * \param shutdown A function to be called when an isolate is shutdown.
@@ -846,7 +848,8 @@
  *   'main' or the name of the function passed to Isolate.spawn.
  * \param isolate_snapshot_data
  * \param isolate_snapshot_instructions Buffers containing a snapshot of the
- *   isolate or NULL if no snapshot is provided.
+ *   isolate or NULL if no snapshot is provided. If provided, the buffers must
+ *   remain valid until the isolate shuts down.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param callback_data Embedder data.  This data will be passed to
  *   the Dart_IsolateCreateCallback when new isolates are spawned from
@@ -883,7 +886,9 @@
  * \param main The name of the main entry point this isolate will run. Provided
  *   only for advisory purposes to improve debugging messages. Typically either
  *   'main' or the name of the function passed to Isolate.spawn.
- * \param kernel_program The `dart::kernel::Program` object.
+ * \param kernel_buffer
+ * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
+ *   remain valid until isolate shutdown.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param callback_data Embedder data.  This data will be passed to
  *   the Dart_IsolateCreateCallback when new isolates are spawned from
@@ -2990,7 +2995,8 @@
  * snapshot must have been created by Dart_CreateScriptSnapshot from a VM with
  * the same version.
  *
- * \param buffer A buffer which contains a snapshot of the script.
+ * \param buffer A buffer which contains a snapshot of the script. May be
+ *    released when this function returns.
  * \param buffer_len Length of the passed in buffer.
  *
  * \return If no error occurs, the Library object corresponding to the root
@@ -3006,7 +3012,7 @@
  * Requires there to be no current root library.
  *
  * \param buffer A buffer which contains a kernel binary (see
- *               pkg/kernel/binary.md).
+ *     pkg/kernel/binary.md). Must remain valid until isolate shutdown.
  * \param buffer_size Length of the passed in buffer.
  *
  * \return A handle to the root library, or an error.
@@ -3128,7 +3134,7 @@
  * library.
  *
  * \param buffer A buffer which contains a kernel binary (see
- *               pkg/kernel/binary.md).
+ *     pkg/kernel/binary.md). Must remain valid until isolate shutdown.
  * \param buffer_size Length of the passed in buffer.
  *
  * \return A handle to the main library of the compilation unit, or an error.
@@ -3313,7 +3319,9 @@
                             int source_files_count,
                             Dart_SourceFile source_files[],
                             bool incremental_compile,
-                            const char* package_config);
+                            const char* package_config,
+                            const char* multiroot_filepaths,
+                            const char* multiroot_scheme);
 
 DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies();
 
diff --git a/runtime/observatory/.packages b/runtime/observatory/.packages
index 5cd569a..08b8b0b 100644
--- a/runtime/observatory/.packages
+++ b/runtime/observatory/.packages
@@ -1,42 +1,14 @@
-# Generated by pub on 2017-07-31 13:06:32.808969.
-analyzer:../../third_party/observatory_pub_packages/packages/analyzer/lib/
-args:../../third_party/observatory_pub_packages/packages/args/lib/
-async:../../third_party/observatory_pub_packages/packages/async/lib/
-barback:../../third_party/observatory_pub_packages/packages/barback/lib/
-browser:../../third_party/observatory_pub_packages/packages/browser/lib/
-charcode:../../third_party/observatory_pub_packages/packages/charcode/lib/
-charted:../../third_party/observatory_pub_packages/packages/charted/lib/
-cli_util:../../third_party/observatory_pub_packages/packages/cli_util/lib/
-code_transformers:../../third_party/observatory_pub_packages/packages/code_transformers/lib/
-collection:../../third_party/observatory_pub_packages/packages/collection/lib/
-convert:../../third_party/observatory_pub_packages/packages/convert/lib/
-crypto:../../third_party/observatory_pub_packages/packages/crypto/lib/
-csslib:../../third_party/observatory_pub_packages/packages/csslib/lib/
-dart_style:../../third_party/observatory_pub_packages/packages/dart_style/lib/
-dart_to_js_script_rewriter:../../third_party/observatory_pub_packages/packages/dart_to_js_script_rewriter/lib/
-glob:../../third_party/observatory_pub_packages/packages/glob/lib/
-html:../../third_party/observatory_pub_packages/packages/html/lib/
-initialize:../../third_party/observatory_pub_packages/packages/initialize/lib/
-intl:../../third_party/observatory_pub_packages/packages/intl/lib/
-isolate:../../third_party/observatory_pub_packages/packages/isolate/lib/
-logging:../../third_party/observatory_pub_packages/packages/logging/lib/
-matcher:../../third_party/observatory_pub_packages/packages/matcher/lib/
-meta:../../third_party/observatory_pub_packages/packages/meta/lib/
-observable:../../third_party/observatory_pub_packages/packages/observable/lib/
-package_config:../../third_party/observatory_pub_packages/packages/package_config/lib/
-path:../../third_party/observatory_pub_packages/packages/path/lib/
-plugin:../../third_party/observatory_pub_packages/packages/plugin/lib/
-pool:../../third_party/observatory_pub_packages/packages/pool/lib/
-quiver:../../third_party/observatory_pub_packages/packages/quiver/lib/
-source_maps:../../third_party/observatory_pub_packages/packages/source_maps/lib/
-source_span:../../third_party/observatory_pub_packages/packages/source_span/lib/
-stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib/
-string_scanner:../../third_party/observatory_pub_packages/packages/string_scanner/lib/
-typed_data:../../third_party/observatory_pub_packages/packages/typed_data/lib/
-unittest:../../third_party/observatory_pub_packages/packages/unittest/lib/
-usage:../../third_party/observatory_pub_packages/packages/usage/lib/
-utf:../../third_party/observatory_pub_packages/packages/utf/lib/
-watcher:../../third_party/observatory_pub_packages/packages/watcher/lib/
-web_components:../../third_party/observatory_pub_packages/packages/web_components/lib/
-yaml:../../third_party/observatory_pub_packages/packages/yaml/lib/
+browser:../../third_party/observatory_pub_packages/packages/browser/lib
+charted:../../third_party/observatory_pub_packages/packages/charted/lib
+collection:../../third_party/observatory_pub_packages/packages/collection/lib
+intl:../../third_party/observatory_pub_packages/packages/intl/lib
+logging:../../third_party/observatory_pub_packages/packages/logging/lib
+matcher:../../third_party/observatory_pub_packages/packages/matcher/lib
+meta:../../third_party/observatory_pub_packages/packages/meta/lib
+observable:../../third_party/observatory_pub_packages/packages/observable/lib
+path:../../third_party/observatory_pub_packages/packages/path/lib
+quiver:../../third_party/observatory_pub_packages/packages/quiver/lib
+stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib
+unittest:../../third_party/observatory_pub_packages/packages/unittest/lib
+usage:../../third_party/observatory_pub_packages/packages/usage/lib
 observatory:lib/
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index af4db77..181a9cd 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -33,7 +33,7 @@
 
   sources = rebase_path(observatory_sources, "", ".")
 
-  inputs = sources + [ rebase_path("dart2js.packages") ]
+  inputs = sources + [ rebase_path(".packages") ]
 
   script = "../../tools/observatory_tool.py"
   args = build_args + [
@@ -44,7 +44,7 @@
            "build",
            rebase_path("web/main.dart"),
            rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
-           rebase_path("dart2js.packages"),
+           rebase_path(".packages"),
          ]
 
   outputs = [
diff --git a/runtime/observatory/dart2js.packages b/runtime/observatory/dart2js.packages
deleted file mode 100644
index b042c03..0000000
--- a/runtime/observatory/dart2js.packages
+++ /dev/null
@@ -1,24 +0,0 @@
-# Update if observatory dependencies change
-args:../../third_party/observatory_pub_packages/packages/args/lib
-async:../../third_party/observatory_pub_packages/packages/async/lib
-barback:../../third_party/observatory_pub_packages/packages/barback/lib
-browser:../../third_party/observatory_pub_packages/packages/browser/lib
-charcode:../../third_party/observatory_pub_packages/packages/charcode/lib
-charted:../../third_party/observatory_pub_packages/packages/charted/lib
-collection:../../third_party/observatory_pub_packages/packages/collection/lib
-csslib:../../third_party/observatory_pub_packages/packages/csslib/lib
-html:../../third_party/observatory_pub_packages/packages/html/lib
-intl:../../third_party/observatory_pub_packages/packages/intl/lib
-logging:../../third_party/observatory_pub_packages/packages/logging/lib
-matcher:../../third_party/observatory_pub_packages/packages/matcher/lib
-meta:../../third_party/observatory_pub_packages/packages/meta/lib
-observable:../../third_party/observatory_pub_packages/packages/observable/lib
-path:../../third_party/observatory_pub_packages/packages/path/lib
-pool:../../third_party/observatory_pub_packages/packages/pool/lib
-quiver:../../third_party/observatory_pub_packages/packages/quiver/lib
-source_span:../../third_party/observatory_pub_packages/packages/source_span/lib
-stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib
-unittest:../../third_party/observatory_pub_packages/packages/unittest/lib
-usage:../../third_party/observatory_pub_packages/packages/usage/lib
-utf:../../third_party/observatory_pub_packages/packages/utf/lib
-observatory:lib/
diff --git a/runtime/observatory/lib/src/app/analytics.dart b/runtime/observatory/lib/src/app/analytics.dart
index 8f09f61..484f7da 100644
--- a/runtime/observatory/lib/src/app/analytics.dart
+++ b/runtime/observatory/lib/src/app/analytics.dart
@@ -14,7 +14,7 @@
     // We only send screen views. This is allowed without user permission.
     // Note, before flipping this to be true we need a UI to allow users to
     // control this.
-    _googleAnalytics.optIn = false;
+    _googleAnalytics.analyticsOpt = AnalyticsOpt.optOut;
   }
 
   /// Called whenever an Observatory page is viewed.
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index 93cc57c..c3edda8 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -433,6 +433,8 @@
         return 'tag';
       case M.FunctionKind.signatureFunction:
         return 'signature function';
+      case M.FunctionKind.dynamicInvocationForwarder:
+        return 'dynamic invocation forwarder';
     }
     throw new Exception('Unknown Functionkind ($kind)');
   }
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 904038d..e619f5e 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -23,7 +23,8 @@
   native,
   stub,
   tag,
-  signatureFunction
+  signatureFunction,
+  dynamicInvocationForwarder
 }
 
 bool isSyntheticFunction(FunctionKind kind) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index ace655c..768262c 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -3112,6 +3112,8 @@
       return M.FunctionKind.tag;
     case 'SignatureFunction':
       return M.FunctionKind.signatureFunction;
+    case 'DynamicInvocationForwarder':
+      return M.FunctionKind.dynamicInvocationForwarder;
   }
   Logger.root.severe('Unrecognized function kind: $value');
   throw new FallThroughError();
diff --git a/runtime/observatory/maintainers/.gitignore b/runtime/observatory/maintainers/.gitignore
deleted file mode 100644
index 21a2d71..0000000
--- a/runtime/observatory/maintainers/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-observatory_pub_packages
-packages
-pubspec.yaml
-pubspec.lock
diff --git a/runtime/observatory/maintainers/pubspec.template b/runtime/observatory/maintainers/pubspec.template
deleted file mode 100644
index 87154f3..0000000
--- a/runtime/observatory/maintainers/pubspec.template
+++ /dev/null
@@ -1,20 +0,0 @@
-name: observatory
-version: 1.6.0-dev.1
-transformers:
-- polymer:
-    entry_points:
-    - web/index.html
-    inline_stylesheets:
-      lib/src/elements/css/shared.css: false
-- $dart2js:
-    $include: "**/*.polymer.bootstrap.dart"
-    suppressWarnings: false
-    commandLineOptions: [--show-package-warnings]
-dependencies:
-  args: any
-  charted: ^0.2.9
-  polymer: any
-  unittest: < 0.12.0
-  usage: any
-  code_transformers: 0.2.9
-
diff --git a/runtime/observatory/maintainers/snapshot_dependencies.sh b/runtime/observatory/maintainers/snapshot_dependencies.sh
deleted file mode 100755
index 68803cf..0000000
--- a/runtime/observatory/maintainers/snapshot_dependencies.sh
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/sh
-
-# This script will create a deep snapshot of all Observatory package
-# dependencies. The output will be in observatory_pub_packages which
-# then should be committed to third_party/observatory_pub_packages.
-
-
-PUBSPEC_INPUT="pubspec.template"
-PUBSPEC_OUTPUT="pubspec.yaml"
-PACKAGES_INPUT="packages"
-PACKAGES_OUTPUT="observatory_pub_packages"
-
-if [ ! -d "../maintainers" ]; then
-  echo "Please run this script from the maintainers directory"
-  exit
-fi
-
-if [ ! -f $PUBSPEC_INPUT ]; then
-  echo "Cannot find $PUBSPEC_INPUT"
-  exit
-fi
-
-# Cleanup leftovers
-rm -f $PUBSPEC_OUTPUT
-rm -rf $PACKAGES_INPUT
-rm -rf $PACKAGES_OUTPUT
-
-# Setup for pub get run
-cp $PUBSPEC_INPUT $PUBSPEC_OUTPUT
-
-# Run pub get
-pub get
-
-# Prepare for output
-mkdir $PACKAGES_OUTPUT
-
-OUTPUT_BASE=`realpath $PACKAGES_OUTPUT`
-# Copy necessary files
-pushd $PACKAGES_INPUT  > /dev/null
-for i in *; do
-  ACTUAL_PATH=`realpath $i`
-  mkdir $OUTPUT_BASE/$i
-  mkdir $OUTPUT_BASE/$i/lib
-  cp $ACTUAL_PATH/../pubspec.yaml $OUTPUT_BASE/$i/pubspec.yaml
-  rsync -Lr $ACTUAL_PATH/* $OUTPUT_BASE/$i/lib
-done
-popd > /dev/null
-
-echo '***'
-echo 'Dumping package dependencies:':
-echo ''
-echo 'dependency_overrides:'
-pushd $PACKAGES_OUTPUT > /dev/null
-for i in *; do
-  echo -e "  $i:\n    path: ../../third_party/$PACKAGES_OUTPUT/$i"
-done
-popd > /dev/null
-echo ''
-echo '***'
-echo -n 'Now run: rsync -a --delete observatory_pub_packages/ '
-echo '~/workspace/dart-third_party/observatory_pub_packages/'
-echo 'Then: '
-echo 'cd ~/workspace/dart-third_party/observatory_pub_packages/'
-echo "svn status | grep ^? | sed 's/?    //' | xargs svn add"
-echo "svn st | grep ^! | sed 's/!    //' | xargs svn rm"
-echo '***'
diff --git a/runtime/observatory/pubspec.lock b/runtime/observatory/pubspec.lock
deleted file mode 100644
index edcad95..0000000
--- a/runtime/observatory/pubspec.lock
+++ /dev/null
@@ -1,245 +0,0 @@
-# Generated by pub
-# See http://pub.dartlang.org/doc/glossary.html#lockfile
-packages:
-  analyzer:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/analyzer"
-      relative: true
-    source: path
-    version: "0.29.5"
-  args:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/args"
-      relative: true
-    source: path
-    version: "0.13.7"
-  async:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/async"
-      relative: true
-    source: path
-    version: "1.13.3"
-  barback:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/barback"
-      relative: true
-    source: path
-    version: "0.15.2+11"
-  browser:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/browser"
-      relative: true
-    source: path
-    version: "0.10.0+2"
-  charcode:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/charcode"
-      relative: true
-    source: path
-    version: "1.1.1"
-  charted:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/charted"
-      relative: true
-    source: path
-    version: "0.4.8"
-  cli_util:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/cli_util"
-      relative: true
-    source: path
-    version: "0.1.2"
-  code_transformers:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/code_transformers"
-      relative: true
-    source: path
-    version: "0.5.1+3"
-  collection:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/collection"
-      relative: true
-    source: path
-    version: "1.14.3"
-  convert:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/convert"
-      relative: true
-    source: path
-    version: "2.0.1"
-  crypto:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/crypto"
-      relative: true
-    source: path
-    version: "2.0.2"
-  csslib:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/csslib"
-      relative: true
-    source: path
-    version: "0.14.0"
-  dart_style:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/dart_style"
-      relative: true
-    source: path
-    version: "0.2.16"
-  dart_to_js_script_rewriter:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/dart_to_js_script_rewriter"
-      relative: true
-    source: path
-    version: "1.0.3"
-  glob:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/glob"
-      relative: true
-    source: path
-    version: "1.1.3"
-  html:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/html"
-      relative: true
-    source: path
-    version: "0.13.2"
-  initialize:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/initialize"
-      relative: true
-    source: path
-    version: "0.6.2+6"
-  intl:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/intl"
-      relative: true
-    source: path
-    version: "0.15.1"
-  isolate:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/isolate"
-      relative: true
-    source: path
-    version: "0.2.3"
-  logging:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/logging"
-      relative: true
-    source: path
-    version: "0.11.3+1"
-  matcher:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/matcher"
-      relative: true
-    source: path
-    version: "0.12.1+1"
-  meta:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/meta"
-      relative: true
-    source: path
-    version: "1.1.1"
-  observable:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/observable"
-      relative: true
-    source: path
-    version: "0.14.0+1"
-  package_config:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/package_config"
-      relative: true
-    source: path
-    version: "1.0.2"
-  path:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/path"
-      relative: true
-    source: path
-    version: "1.4.2"
-  plugin:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/plugin"
-      relative: true
-    source: path
-    version: "0.2.0+1"
-  pool:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/pool"
-      relative: true
-    source: path
-    version: "1.3.1"
-  quiver:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/quiver"
-      relative: true
-    source: path
-    version: "0.25.0"
-  source_maps:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/source_maps"
-      relative: true
-    source: path
-    version: "0.10.4"
-  source_span:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/source_span"
-      relative: true
-    source: path
-    version: "1.4.0"
-  stack_trace:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/stack_trace"
-      relative: true
-    source: path
-    version: "1.8.0"
-  string_scanner:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/string_scanner"
-      relative: true
-    source: path
-    version: "1.0.2"
-  typed_data:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/typed_data"
-      relative: true
-    source: path
-    version: "1.1.3"
-  unittest:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/unittest"
-      relative: true
-    source: path
-    version: "0.11.7"
-  usage:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/usage"
-      relative: true
-    source: path
-    version: "1.2.0"
-  utf:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/utf"
-      relative: true
-    source: path
-    version: "0.9.0+3"
-  watcher:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/watcher"
-      relative: true
-    source: path
-    version: "0.9.7+3"
-  web_components:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/web_components"
-      relative: true
-    source: path
-    version: "0.12.5"
-  yaml:
-    description:
-      path: "../../third_party/observatory_pub_packages/packages/yaml"
-      relative: true
-    source: path
-    version: "2.1.12"
-sdks:
-  dart: any
diff --git a/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html b/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/class_ref/element_test.html b/runtime/observatory/tests/observatory_ui/class_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/class_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/class_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/class_tree/element_test.html b/runtime/observatory/tests/observatory_ui/class_tree/element_test.html
index 8996ea9..bc26958 100644
--- a/runtime/observatory/tests/observatory_ui/class_tree/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/class_tree/element_test.html
@@ -15,7 +15,6 @@
        padding-right: 10%;
      }
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/code_ref/element_test.html b/runtime/observatory/tests/observatory_ui/code_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/code_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/code_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/context_ref/element_test.html b/runtime/observatory/tests/observatory_ui/context_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/context_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/context_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/context_view/element_test.html b/runtime/observatory/tests/observatory_ui/context_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/context_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/context_view/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html b/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html b/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html b/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/curly_block/element_test.html b/runtime/observatory/tests/observatory_ui/curly_block/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/curly_block/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/curly_block/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/error_ref/element_test.html b/runtime/observatory/tests/observatory_ui/error_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/error_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/error_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/error_view/element_test.html b/runtime/observatory/tests/observatory_ui/error_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/error_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/error_view/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/field_ref/element_test.html b/runtime/observatory/tests/observatory_ui/field_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/field_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/field_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/flag_list/element_test.html b/runtime/observatory/tests/observatory_ui/flag_list/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/flag_list/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/flag_list/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/function_ref/element_test.html b/runtime/observatory/tests/observatory_ui/function_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/function_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/function_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/general_error/element_test.html b/runtime/observatory/tests/observatory_ui/general_error/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/general_error/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/general_error/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html b/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html b/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html b/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html b/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html b/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html b/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html b/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html b/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html b/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/library_ref/element_test.html b/runtime/observatory/tests/observatory_ui/library_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/library_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/library_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html b/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html b/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html b/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html b/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html b/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html b/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html b/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html b/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html b/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/object_common/element_test.html b/runtime/observatory/tests/observatory_ui/object_common/element_test.html
index 4b01e65..39c5683 100644
--- a/runtime/observatory/tests/observatory_ui/object_common/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/object_common/element_test.html
@@ -10,7 +10,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html b/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html b/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html b/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html b/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html b/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/ports/element_test.html b/runtime/observatory/tests/observatory_ui/ports/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/ports/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/ports/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html b/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html b/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/script_ref/element_test.html b/runtime/observatory/tests/observatory_ui/script_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/script_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/script_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html b/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/source_link/element_test.html b/runtime/observatory/tests/observatory_ui/source_link/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/source_link/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/source_link/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html b/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html b/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html b/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/view_footer/element_test.html b/runtime/observatory/tests/observatory_ui/view_footer/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/view_footer/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/view_footer/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html b/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html
index 75fd7c6..92c3180 100644
--- a/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html
@@ -19,7 +19,6 @@
        height: 20px;
      }
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <div class="test_container">
diff --git a/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html b/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html b/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html
@@ -9,7 +9,6 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
 </head>
 <body>
   <script type="text/javascript"
diff --git a/runtime/observatory/tests/service/coverage_leaf_function_test.dart b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
index 51df112..4b70c13 100644
--- a/runtime/observatory/tests/service/coverage_leaf_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
@@ -45,12 +45,12 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': ifKernel(456, 26),
+      'startPos': ifKernel(449, 26),
       'endPos': ifKernel(499, 38),
       'compiled': true,
       'coverage': {
         'hits': ifKernel([], []),
-        'misses': ifKernel([456], [26])
+        'misses': ifKernel([449], [26])
       }
     };
 
@@ -86,11 +86,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': ifKernel(456, 26),
+      'startPos': ifKernel(449, 26),
       'endPos': ifKernel(499, 38),
       'compiled': true,
       'coverage': {
-        'hits': ifKernel([456], [26]),
+        'hits': ifKernel([449], [26]),
         'misses': ifKernel([], [])
       }
     };
diff --git a/runtime/observatory/tests/service/coverage_optimized_function_test.dart b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
index f883e9a..e7a38e7 100644
--- a/runtime/observatory/tests/service/coverage_optimized_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
@@ -37,11 +37,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': ifKernel(476, 26),
+      'startPos': ifKernel(469, 26),
       'endPos': ifKernel(536, 51),
       'compiled': true,
       'coverage': {
-        'hits': ifKernel([476, 509, 520, 524], [26, 37, 41, 45]),
+        'hits': ifKernel([469, 509, 520, 524], [26, 37, 41, 45]),
         'misses': ifKernel([], [])
       }
     };
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index d11c722..d1dda8d 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -61,11 +61,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': ifKernel(501, 40),
+      'startPos': ifKernel(489, 40),
       'endPos': ifKernel(633, 89),
       'compiled': true,
       'coverage': {
-        'hits': ifKernel([501, 539, 590, 619], [40, 55, 73, 83]),
+        'hits': ifKernel([489, 539, 590, 619], [40, 55, 73, 83]),
         'misses': ifKernel([552], [61])
       }
     };
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 1786a6f..87f2e7f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -101,6 +101,7 @@
 step_through_function_2_test: RuntimeError
 step_through_function_test: RuntimeError
 step_through_getter_test: RuntimeError
+step_through_mixin_from_sdk_test: RuntimeError
 step_through_property_get_test: RuntimeError
 step_through_property_set_test: RuntimeError
 step_through_setter_test: RuntimeError
diff --git a/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart b/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
new file mode 100644
index 0000000..a38c966
--- /dev/null
+++ b/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
@@ -0,0 +1,65 @@
+// 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 'test_helper.dart';
+import 'service_test_common.dart';
+import 'dart:collection';
+
+const int LINE = 13;
+const String file = "step_through_mixin_from_sdk_test.dart";
+
+code() {
+  Foo foo = new Foo();
+  if (foo.contains(43)) {
+    print("Contains 43!");
+  } else {
+    print("Doesn't contain 43!");
+  }
+}
+
+class Foo extends Object with ListMixin<int> {
+  @override
+  int length = 1;
+
+  @override
+  int operator [](int index) {
+    return 42;
+  }
+
+  @override
+  void operator []=(int index, int value) {}
+}
+
+List<String> stops = [];
+List<String> expected = [
+  "$file:${LINE+0}:17", // on "Foo" (in "new Foo()")
+  "$file:${LINE+1}:11", // on "="
+  "list.dart:105:24", // on parameter to "contains"
+  "list.dart:106:23", // on "length" in "this.length"
+  "list.dart:107:16", // on "=" in "i = 0"
+  "list.dart:107:23", // on "<" in "i < length"
+  "list.dart:108:15", // on "[" in "this[i]"
+  "$file:${LINE+13}:23", // on parameter in "operator []"
+  "$file:${LINE+14}:5", // on "return"
+  "list.dart:108:19", // on "=="
+  "list.dart:109:26", // on "length" in "this.length"
+  "list.dart:109:18", // on "!="
+  "list.dart:107:34", // on "++" in "i++"
+  "list.dart:107:23", // on "<" in "i < length"
+  "list.dart:113:5", // on "return"
+  "$file:${LINE+4}:5", // on "print"
+  "$file:${LINE+6}:1" // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtLine(LINE),
+  runStepIntoThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected, removeDuplicates: true)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/web/index.html b/runtime/observatory/web/index.html
index 2662c85..6369746 100644
--- a/runtime/observatory/web/index.html
+++ b/runtime/observatory/web/index.html
@@ -5,7 +5,6 @@
   <title>Dart VM Observatory</title>
   <link rel="stylesheet" href="packages/charted/charts/themes/quantum_theme.css">
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <script src="packages/web_components/webcomponents-lite.min.js"></script>
   <script defer src="main.dart.js"></script>
 </head>
 <body style="height: 100%">
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 84d44b4..cf862ab 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -314,8 +314,17 @@
                                      const uint8_t* kernel_buffer,
                                      intptr_t kernel_buffer_size) {
   Zone* zone = thread->zone();
-  kernel::Program* program =
-      kernel::Program::ReadFromBuffer(kernel_buffer, kernel_buffer_size, false);
+  const char* error = nullptr;
+  kernel::Program* program = kernel::Program::ReadFromBuffer(
+      kernel_buffer, kernel_buffer_size, &error);
+  if (program == nullptr) {
+    const intptr_t kMessageBufferSize = 512;
+    char message_buffer[kMessageBufferSize];
+    Utils::SNPrint(message_buffer, kMessageBufferSize,
+                   "Can't load Kernel binary: %s.", error);
+    const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
+    return ApiError::New(msg, Heap::kOld);
+  }
   kernel::KernelLoader loader(program);
   Isolate* isolate = thread->isolate();
 
diff --git a/runtime/vm/bootstrap_nocore.cc b/runtime/vm/bootstrap_nocore.cc
index 9938296..2b3d6b5 100644
--- a/runtime/vm/bootstrap_nocore.cc
+++ b/runtime/vm/bootstrap_nocore.cc
@@ -74,8 +74,17 @@
                               const uint8_t* kernel_buffer,
                               intptr_t kernel_buffer_size) {
   Zone* zone = thread->zone();
-  kernel::Program* program =
-      kernel::Program::ReadFromBuffer(kernel_buffer, kernel_buffer_size, false);
+  const char* error = nullptr;
+  kernel::Program* program = kernel::Program::ReadFromBuffer(
+      kernel_buffer, kernel_buffer_size, &error);
+  if (program == nullptr) {
+    const intptr_t kMessageBufferSize = 512;
+    char message_buffer[kMessageBufferSize];
+    Utils::SNPrint(message_buffer, kMessageBufferSize,
+                   "Can't load Kernel binary: %s.", error);
+    const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
+    return ApiError::New(msg, Heap::kOld);
+  }
   kernel::KernelLoader loader(program);
   Isolate* isolate = thread->isolate();
 
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 83f76d1..1b9b8e5 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -605,6 +605,20 @@
         break;
       }
 
+      case Token::kSHL:
+      case Token::kSHR: {
+        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
+        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
+        CompileType* right_type = right_value->Type();
+        if (right_type->IsNullableInt()) {
+          left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
+          right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
+          replacement = new (Z) ShiftInt64OpInstr(
+              op_kind, left_value, right_value, Thread::kNoDeoptId);
+        }
+        break;
+      }
+
       default:
         break;
     }
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 55fcc83..ab5b854 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -933,10 +933,6 @@
   VisitBinaryIntegerOp(instr);
 }
 
-void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
-  VisitBinaryIntegerOp(instr);
-}
-
 void ConstantPropagator::VisitBinaryInt64Op(BinaryInt64OpInstr* instr) {
   VisitBinaryIntegerOp(instr);
 }
@@ -945,6 +941,20 @@
   VisitBinaryIntegerOp(instr);
 }
 
+void ConstantPropagator::VisitSpeculativeShiftInt64Op(
+    SpeculativeShiftInt64OpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
+}
+
+void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
+}
+
+void ConstantPropagator::VisitSpeculativeShiftUint32Op(
+    SpeculativeShiftUint32OpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
+}
+
 void ConstantPropagator::VisitBoxInt64(BoxInt64Instr* instr) {
   // TODO(kmillikin): Handle box operation.
   SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 90112c2..4f48c7b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -682,8 +682,7 @@
 // See StackFrame::VisitObjectPointers for the details of how stack map is
 // interpreted.
 void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs,
-                                        intptr_t slow_path_argument_count,
-                                        Environment* env) {
+                                        intptr_t slow_path_argument_count) {
   if (is_optimizing() || locs->live_registers()->HasUntaggedValues()) {
     const intptr_t spill_area_size =
         is_optimizing() ? flow_graph_.graph_entry()->spill_slot_count() : 0;
@@ -2149,6 +2148,56 @@
 }
 #endif  // defined(DEBUG) && !defined(TARGET_ARCH_DBC)
 
+#if !defined(TARGET_ARCH_DBC)
+#define __ compiler->assembler()->
+
+void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (Assembler::EmittingComments()) {
+    __ Comment("slow path %s operation", name());
+  }
+  const bool use_shared_stub =
+      instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
+  const bool live_fpu_registers =
+      instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
+  ASSERT(!use_shared_stub || num_args_ == 0);
+  __ Bind(entry_label());
+  EmitCodeAtSlowPathEntry(compiler);
+  LocationSummary* locs = instruction()->locs();
+  // Save registers as they are needed for lazy deopt / exception handling.
+  if (!use_shared_stub) {
+    compiler->SaveLiveRegisters(locs);
+  }
+  for (intptr_t i = 0; i < num_args_; ++i) {
+    __ PushRegister(locs->in(i).reg());
+  }
+  if (use_shared_stub) {
+    EmitSharedStubCall(compiler->assembler(), live_fpu_registers);
+  } else {
+    __ CallRuntime(runtime_entry_, num_args_);
+  }
+  // Can't query deopt_id() without checking if instruction can deoptimize...
+  intptr_t deopt_id = Thread::kNoDeoptId;
+  if (instruction()->CanDeoptimize() ||
+      instruction()->CanBecomeDeoptimizationTarget()) {
+    deopt_id = instruction()->deopt_id();
+  }
+  compiler->AddDescriptor(RawPcDescriptors::kOther,
+                          compiler->assembler()->CodeSize(), deopt_id,
+                          instruction()->token_pos(), try_index_);
+  AddMetadataForRuntimeCall(compiler);
+  compiler->RecordSafepoint(locs, num_args_);
+  if ((try_index_ != CatchClauseNode::kInvalidTryIndex) ||
+      (compiler->CurrentTryIndex() != CatchClauseNode::kInvalidTryIndex)) {
+    Environment* env =
+        compiler->SlowPathEnvironmentFor(instruction(), num_args_);
+    compiler->EmitCatchEntryState(env, try_index_);
+  }
+  __ Breakpoint();
+}
+
+#undef __
+#endif  //  !defined(TARGET_ARCH_DBC)
+
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 8e05c21..83f91fb 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -240,6 +240,42 @@
   }
 };
 
+#if !defined(TARGET_ARCH_DBC)
+
+// Slow path code which calls runtime entry to throw an exception.
+class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
+ public:
+  ThrowErrorSlowPathCode(Instruction* instruction,
+                         const RuntimeEntry& runtime_entry,
+                         intptr_t num_args,
+                         intptr_t try_index)
+      : TemplateSlowPathCode(instruction),
+        runtime_entry_(runtime_entry),
+        num_args_(num_args),
+        try_index_(try_index) {}
+
+  // This name appears in disassembly.
+  virtual const char* name() = 0;
+
+  // Subclasses can override these methods to customize slow path code.
+  virtual void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) {}
+  virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
+
+  virtual void EmitSharedStubCall(Assembler* assembler,
+                                  bool save_fpu_registers) {
+    UNREACHABLE();
+  }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler);
+
+ private:
+  const RuntimeEntry& runtime_entry_;
+  const intptr_t num_args_;
+  const intptr_t try_index_;
+};
+
+#endif  // !defined(TARGET_ARCH_DBC)
+
 class FlowGraphCompiler : public ValueObject {
  private:
   class BlockInfo : public ZoneAllocated {
@@ -583,10 +619,8 @@
                     TokenPosition token_pos,
                     intptr_t null_check_name_idx);
 
-  // 'environment' is required if 'using_shared_stub'.
   void RecordSafepoint(LocationSummary* locs,
-                       intptr_t slow_path_argument_count = 0,
-                       Environment* env = NULL);
+                       intptr_t slow_path_argument_count = 0);
 
   Label* AddDeoptStub(intptr_t deopt_id,
                       ICData::DeoptReasonId reason,
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index ca1dcbf..81e98f8 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1569,8 +1569,8 @@
   }
 }
 
-bool ShiftInt64OpInstr::IsShiftCountInRange() const {
-  return RangeUtils::IsWithin(shift_range(), 0, kMintShiftCountLimit);
+bool ShiftIntegerOpInstr::IsShiftCountInRange(int64_t max) const {
+  return RangeUtils::IsWithin(shift_range(), 0, max);
 }
 
 bool BinaryIntegerOpInstr::RightIsPowerOfTwoConstant() const {
@@ -1780,14 +1780,16 @@
   return op;
 }
 
-BinaryIntegerOpInstr* BinaryIntegerOpInstr::Make(Representation representation,
-                                                 Token::Kind op_kind,
-                                                 Value* left,
-                                                 Value* right,
-                                                 intptr_t deopt_id,
-                                                 bool can_overflow,
-                                                 bool is_truncating,
-                                                 Range* range) {
+BinaryIntegerOpInstr* BinaryIntegerOpInstr::Make(
+    Representation representation,
+    Token::Kind op_kind,
+    Value* left,
+    Value* right,
+    intptr_t deopt_id,
+    bool can_overflow,
+    bool is_truncating,
+    Range* range,
+    SpeculativeMode speculative_mode) {
   BinaryIntegerOpInstr* op = NULL;
   switch (representation) {
     case kTagged:
@@ -1801,14 +1803,23 @@
       break;
     case kUnboxedUint32:
       if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
-        op = new ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+        if (speculative_mode == kNotSpeculative) {
+          op = new ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+        } else {
+          op =
+              new SpeculativeShiftUint32OpInstr(op_kind, left, right, deopt_id);
+        }
       } else {
         op = new BinaryUint32OpInstr(op_kind, left, right, deopt_id);
       }
       break;
     case kUnboxedInt64:
       if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
-        op = new ShiftInt64OpInstr(op_kind, left, right, deopt_id);
+        if (speculative_mode == kNotSpeculative) {
+          op = new ShiftInt64OpInstr(op_kind, left, right, deopt_id);
+        } else {
+          op = new SpeculativeShiftInt64OpInstr(op_kind, left, right, deopt_id);
+        }
       } else {
         op = new BinaryInt64OpInstr(op_kind, left, right, deopt_id);
       }
@@ -1884,7 +1895,12 @@
       // specialized instructions that use this value under this assumption.
       return Integer::null();
     }
-    result ^= result.CheckAndCanonicalize(thread, NULL);
+
+    const char* error_str = NULL;
+    result ^= result.CheckAndCanonicalize(thread, &error_str);
+    if (error_str != NULL) {
+      FATAL1("Failed to canonicalize: %s", error_str);
+    }
   }
 
   return result.raw();
@@ -1941,7 +1957,11 @@
       // specialized instructions that use this value under this assumption.
       return Integer::null();
     }
-    result ^= result.CheckAndCanonicalize(thread, NULL);
+    const char* error_str = NULL;
+    result ^= result.CheckAndCanonicalize(thread, &error_str);
+    if (error_str != NULL) {
+      FATAL1("Failed to canonicalize: %s", error_str);
+    }
   }
 
   return result.raw();
@@ -2085,7 +2105,7 @@
         BinaryIntegerOpInstr* shift = BinaryIntegerOpInstr::Make(
             representation(), Token::kSHL, left()->CopyWithType(),
             new Value(constant_1), GetDeoptId(), can_overflow(),
-            is_truncating(), range());
+            is_truncating(), range(), speculative_mode());
         if (shift != NULL) {
           flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue);
           return shift;
@@ -3122,18 +3142,27 @@
       }
     }
   }
+
   // Spread class-ids to following classes where a lookup yields the same
   // method.
+  const intptr_t max_cid = Isolate::Current()->class_table()->NumCids();
   for (int idx = 0; idx < length; idx++) {
     int upper_limit_cid =
-        (idx == length - 1) ? 1000000000 : targets[idx + 1].cid_start;
+        (idx == length - 1) ? max_cid : targets[idx + 1].cid_start;
     const Function& target = *targets.TargetAt(idx)->target;
     if (MethodRecognizer::PolymorphicTarget(target)) continue;
+    // The code below makes attempt to avoid spreading class-id range
+    // into a suffix that consists purely of abstract classes to
+    // shorten the range.
+    // However such spreading is beneficial when it allows to
+    // merge to consequtive ranges.
+    intptr_t cid_end_including_abstract = targets[idx].cid_end;
     for (int i = targets[idx].cid_end + 1; i < upper_limit_cid; i++) {
       bool class_is_abstract = false;
       if (FlowGraphCompiler::LookupMethodFor(i, name, args_desc, &fn,
                                              &class_is_abstract) &&
           fn.raw() == target.raw()) {
+        cid_end_including_abstract = i;
         if (!class_is_abstract) {
           targets[idx].cid_end = i;
         }
@@ -3141,6 +3170,16 @@
         break;
       }
     }
+
+    // Check if we have a suffix that consists of abstract classes
+    // and expand into it if that would allow us to merge this
+    // range with subsequent range.
+    if ((cid_end_including_abstract > targets[idx].cid_end) &&
+        (idx < length - 1) &&
+        ((cid_end_including_abstract + 1) == targets[idx + 1].cid_start) &&
+        (target.raw() == targets.TargetAt(idx + 1)->target->raw())) {
+      targets[idx].cid_end = cid_end_including_abstract;
+    }
   }
   targets.MergeIntoRanges();
   return &targets;
@@ -3964,67 +4003,6 @@
   return locs;
 }
 
-class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
- public:
-  ThrowErrorSlowPathCode(Instruction* instruction,
-                         const RuntimeEntry& runtime_entry,
-                         intptr_t num_args,
-                         intptr_t try_index)
-      : TemplateSlowPathCode(instruction),
-        runtime_entry_(runtime_entry),
-        num_args_(num_args),
-        try_index_(try_index) {}
-
-  virtual const char* name() = 0;
-
-  virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
-
-  virtual void EmitSharedStubCall(Assembler* assembler,
-                                  bool save_fpu_registers) {
-    UNREACHABLE();
-  }
-
-  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
-      __ Comment("slow path %s operation", name());
-    }
-    bool use_shared_stub =
-        instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
-    bool live_fpu_registers =
-        instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
-    ASSERT(!use_shared_stub || num_args_ == 0);
-    __ Bind(entry_label());
-    LocationSummary* locs = instruction()->locs();
-    // Save registers as they are needed for lazy deopt / exception handling.
-    if (!use_shared_stub) {
-      compiler->SaveLiveRegisters(locs);
-    }
-    for (intptr_t i = 0; i < num_args_; ++i) {
-      __ PushRegister(locs->in(i).reg());
-    }
-    if (use_shared_stub) {
-      EmitSharedStubCall(compiler->assembler(), live_fpu_registers);
-    } else {
-      __ CallRuntime(runtime_entry_, num_args_);
-    }
-    compiler->AddDescriptor(
-        RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
-        instruction()->deopt_id(), instruction()->token_pos(), try_index_);
-    AddMetadataForRuntimeCall(compiler);
-    ASSERT(instruction()->env() != nullptr);
-    compiler->RecordSafepoint(locs, num_args_, instruction()->env());
-    Environment* env =
-        compiler->SlowPathEnvironmentFor(instruction(), num_args_);
-    compiler->EmitCatchEntryState(env, try_index_);
-    __ Breakpoint();
-  }
-
- private:
-  const RuntimeEntry& runtime_entry_;
-  const intptr_t num_args_;
-  const intptr_t try_index_;
-};
-
 class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
   static const intptr_t kNumberOfArguments = 2;
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index bcafcbd..656e856 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -547,6 +547,7 @@
   M(CaseInsensitiveCompareUC16)                                                \
   M(BinaryInt64Op)                                                             \
   M(ShiftInt64Op)                                                              \
+  M(SpeculativeShiftInt64Op)                                                   \
   M(UnaryInt64Op)                                                              \
   M(CheckArrayBound)                                                           \
   M(GenericCheckBound)                                                         \
@@ -565,6 +566,7 @@
   M(ExtractNthOutput)                                                          \
   M(BinaryUint32Op)                                                            \
   M(ShiftUint32Op)                                                             \
+  M(SpeculativeShiftUint32Op)                                                  \
   M(UnaryUint32Op)                                                             \
   M(BoxUint32)                                                                 \
   M(UnboxUint32)                                                               \
@@ -580,7 +582,8 @@
   M(UnboxInteger)                                                              \
   M(Comparison)                                                                \
   M(UnaryIntegerOp)                                                            \
-  M(BinaryIntegerOp)
+  M(BinaryIntegerOp)                                                           \
+  M(ShiftIntegerOp)
 
 #define FORWARD_DECLARATION(type) class type##Instr;
 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
@@ -1818,8 +1821,7 @@
 
   bool HasType() const { return (type_ != NULL); }
 
-  // Does this define a mint?
-  inline bool IsMintDefinition();
+  inline bool IsInt64Definition();
 
   bool IsInt32Definition() {
     return IsBinaryInt32Op() || IsBoxInt32() || IsUnboxInt32() ||
@@ -5545,9 +5547,10 @@
   DISALLOW_COPY_AND_ASSIGN(UnboxInt64Instr);
 };
 
-bool Definition::IsMintDefinition() {
+bool Definition::IsInt64Definition() {
   return (Type()->ToCid() == kMintCid) || IsBinaryInt64Op() ||
-         IsUnaryInt64Op() || IsShiftInt64Op() || IsBoxInt64() || IsUnboxInt64();
+         IsUnaryInt64Op() || IsShiftInt64Op() || IsSpeculativeShiftInt64Op() ||
+         IsBoxInt64() || IsUnboxInt64();
 }
 
 class MathUnaryInstr : public TemplateDefinition<1, NoThrow, Pure> {
@@ -6018,14 +6021,16 @@
     SetInputAt(1, right);
   }
 
-  static BinaryIntegerOpInstr* Make(Representation representation,
-                                    Token::Kind op_kind,
-                                    Value* left,
-                                    Value* right,
-                                    intptr_t deopt_id,
-                                    bool can_overflow,
-                                    bool is_truncating,
-                                    Range* range);
+  static BinaryIntegerOpInstr* Make(
+      Representation representation,
+      Token::Kind op_kind,
+      Value* left,
+      Value* right,
+      intptr_t deopt_id,
+      bool can_overflow,
+      bool is_truncating,
+      Range* range,
+      SpeculativeMode speculative_mode = kGuardInputs);
 
   Token::Kind op_kind() const { return op_kind_; }
   Value* left() const { return inputs_[0]; }
@@ -6071,6 +6076,8 @@
 
   bool can_overflow_;
   bool is_truncating_;
+
+  DISALLOW_COPY_AND_ASSIGN(BinaryIntegerOpInstr);
 };
 
 class BinarySmiOpInstr : public BinaryIntegerOpInstr {
@@ -6180,33 +6187,6 @@
   DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr);
 };
 
-class ShiftUint32OpInstr : public BinaryIntegerOpInstr {
- public:
-  ShiftUint32OpInstr(Token::Kind op_kind,
-                     Value* left,
-                     Value* right,
-                     intptr_t deopt_id)
-      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
-    ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
-  }
-
-  virtual bool ComputeCanDeoptimize() const { return true; }
-
-  virtual Representation representation() const { return kUnboxedUint32; }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT((idx == 0) || (idx == 1));
-    return (idx == 0) ? kUnboxedUint32 : kTagged;
-  }
-
-  virtual CompileType ComputeType() const;
-
-  DECLARE_INSTRUCTION(ShiftUint32Op)
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
-};
-
 class BinaryInt64OpInstr : public BinaryIntegerOpInstr {
  public:
   BinaryInt64OpInstr(Token::Kind op_kind,
@@ -6253,12 +6233,13 @@
   DISALLOW_COPY_AND_ASSIGN(BinaryInt64OpInstr);
 };
 
-class ShiftInt64OpInstr : public BinaryIntegerOpInstr {
+// Base class for integer shift operations.
+class ShiftIntegerOpInstr : public BinaryIntegerOpInstr {
  public:
-  ShiftInt64OpInstr(Token::Kind op_kind,
-                    Value* left,
-                    Value* right,
-                    intptr_t deopt_id)
+  ShiftIntegerOpInstr(Token::Kind op_kind,
+                      Value* left,
+                      Value* right,
+                      intptr_t deopt_id)
       : BinaryIntegerOpInstr(op_kind, left, right, deopt_id),
         shift_range_(NULL) {
     ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
@@ -6267,6 +6248,62 @@
 
   Range* shift_range() const { return shift_range_; }
 
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+  DEFINE_INSTRUCTION_TYPE_CHECK(ShiftIntegerOp)
+
+ protected:
+  static const intptr_t kShiftCountLimit = 63;
+
+  // Returns true if the shift amount is guaranteed to be in
+  // [0..max] range.
+  bool IsShiftCountInRange(int64_t max = kShiftCountLimit) const;
+
+ private:
+  Range* shift_range_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShiftIntegerOpInstr);
+};
+
+// Non-speculative int64 shift. Takes 2 unboxed int64.
+// Throws if right operand is negative.
+class ShiftInt64OpInstr : public ShiftIntegerOpInstr {
+ public:
+  ShiftInt64OpInstr(Token::Kind op_kind,
+                    Value* left,
+                    Value* right,
+                    intptr_t deopt_id)
+      : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
+
+  virtual SpeculativeMode speculative_mode() const { return kNotSpeculative; }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+  virtual bool MayThrow() const { return true; }
+
+  virtual Representation representation() const { return kUnboxedInt64; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return kUnboxedInt64;
+  }
+
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(ShiftInt64Op)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ShiftInt64OpInstr);
+};
+
+// Speculative int64 shift. Takes unboxed int64 and smi.
+// Deoptimizes if right operand is negative or greater than kShiftCountLimit.
+class SpeculativeShiftInt64OpInstr : public ShiftIntegerOpInstr {
+ public:
+  SpeculativeShiftInt64OpInstr(Token::Kind op_kind,
+                               Value* left,
+                               Value* right,
+                               intptr_t deopt_id)
+      : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
+
   virtual bool ComputeCanDeoptimize() const {
     ASSERT(!can_overflow());
     return !IsShiftCountInRange();
@@ -6279,21 +6316,72 @@
     return (idx == 0) ? kUnboxedInt64 : kTagged;
   }
 
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
   virtual CompileType ComputeType() const;
 
-  DECLARE_INSTRUCTION(ShiftInt64Op)
+  DECLARE_INSTRUCTION(SpeculativeShiftInt64Op)
 
  private:
-  static const intptr_t kMintShiftCountLimit = 63;
+  DISALLOW_COPY_AND_ASSIGN(SpeculativeShiftInt64OpInstr);
+};
 
-  // Returns true if the shift amount is guranteed to be in
-  // [0..kMintShiftCountLimit] range.
-  bool IsShiftCountInRange() const;
+// Non-speculative uint32 shift. Takes unboxed uint32 and unboxed int64.
+// Throws if right operand is negative.
+class ShiftUint32OpInstr : public ShiftIntegerOpInstr {
+ public:
+  ShiftUint32OpInstr(Token::Kind op_kind,
+                     Value* left,
+                     Value* right,
+                     intptr_t deopt_id)
+      : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
 
-  Range* shift_range_;
+  virtual SpeculativeMode speculative_mode() const { return kNotSpeculative; }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+  virtual bool MayThrow() const { return true; }
 
-  DISALLOW_COPY_AND_ASSIGN(ShiftInt64OpInstr);
+  virtual Representation representation() const { return kUnboxedUint32; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return (idx == 0) ? kUnboxedUint32 : kUnboxedInt64;
+  }
+
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(ShiftUint32Op)
+
+ private:
+  static const intptr_t kUint32ShiftCountLimit = 31;
+
+  DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
+};
+
+// Speculative uint32 shift. Takes unboxed uint32 and smi.
+// Deoptimizes if right operand is negative.
+class SpeculativeShiftUint32OpInstr : public ShiftIntegerOpInstr {
+ public:
+  SpeculativeShiftUint32OpInstr(Token::Kind op_kind,
+                                Value* left,
+                                Value* right,
+                                intptr_t deopt_id)
+      : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
+
+  virtual bool ComputeCanDeoptimize() const { return !IsShiftCountInRange(); }
+
+  virtual Representation representation() const { return kUnboxedUint32; }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return (idx == 0) ? kUnboxedUint32 : kTagged;
+  }
+
+  DECLARE_INSTRUCTION(SpeculativeShiftUint32Op)
+
+  virtual CompileType ComputeType() const;
+
+ private:
+  static const intptr_t kUint32ShiftCountLimit = 31;
+
+  DISALLOW_COPY_AND_ASSIGN(SpeculativeShiftUint32OpInstr);
 };
 
 // Handles only NEGATE.
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 42daf66..8d16db6 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -5807,15 +5807,192 @@
   }
 }
 
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+                                     Token::Kind op_kind,
+                                     Register out_lo,
+                                     Register out_hi,
+                                     Register left_lo,
+                                     Register left_hi,
+                                     const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+
+  switch (op_kind) {
+    case Token::kSHR: {
+      if (shift < 32) {
+        __ Lsl(out_lo, left_hi, Operand(32 - shift));
+        __ orr(out_lo, out_lo, Operand(left_lo, LSR, shift));
+        __ Asr(out_hi, left_hi, Operand(shift));
+      } else {
+        if (shift == 32) {
+          __ mov(out_lo, Operand(left_hi));
+        } else if (shift < 64) {
+          __ Asr(out_lo, left_hi, Operand(shift - 32));
+        } else {
+          __ Asr(out_lo, left_hi, Operand(31));
+        }
+        __ Asr(out_hi, left_hi, Operand(31));
+      }
+      break;
+    }
+    case Token::kSHL: {
+      ASSERT(shift < 64);
+      if (shift < 32) {
+        __ Lsr(out_hi, left_lo, Operand(32 - shift));
+        __ orr(out_hi, out_hi, Operand(left_hi, LSL, shift));
+        __ Lsl(out_lo, left_lo, Operand(shift));
+      } else {
+        if (shift == 32) {
+          __ mov(out_hi, Operand(left_lo));
+        } else {
+          __ Lsl(out_hi, left_lo, Operand(shift - 32));
+        }
+        __ mov(out_lo, Operand(0));
+      }
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftInt64ByRegister(FlowGraphCompiler* compiler,
+                                     Token::Kind op_kind,
+                                     Register out_lo,
+                                     Register out_hi,
+                                     Register left_lo,
+                                     Register left_hi,
+                                     Register right) {
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ rsbs(IP, right, Operand(32));
+      __ sub(IP, right, Operand(32), MI);
+      __ mov(out_lo, Operand(left_hi, ASR, IP), MI);
+      __ mov(out_lo, Operand(left_lo, LSR, right), PL);
+      __ orr(out_lo, out_lo, Operand(left_hi, LSL, IP), PL);
+      __ mov(out_hi, Operand(left_hi, ASR, right));
+      break;
+    }
+    case Token::kSHL: {
+      __ rsbs(IP, right, Operand(32));
+      __ sub(IP, right, Operand(32), MI);
+      __ mov(out_hi, Operand(left_lo, LSL, IP), MI);
+      __ mov(out_hi, Operand(left_hi, LSL, right), PL);
+      __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
+      __ mov(out_lo, Operand(left_lo, LSL, right));
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+                                      Token::Kind op_kind,
+                                      Register out,
+                                      Register left,
+                                      const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+  if (shift >= 32) {
+    __ LoadImmediate(out, 0);
+  } else {
+    switch (op_kind) {
+      case Token::kSHR:
+        __ Lsr(out, left, Operand(shift));
+        break;
+      case Token::kSHL:
+        __ Lsl(out, left, Operand(shift));
+        break;
+      default:
+        UNREACHABLE();
+    }
+  }
+}
+
+static void EmitShiftUint32ByRegister(FlowGraphCompiler* compiler,
+                                      Token::Kind op_kind,
+                                      Register out,
+                                      Register left,
+                                      Register right) {
+  switch (op_kind) {
+    case Token::kSHR:
+      __ Lsr(out, left, right);
+      break;
+    case Token::kSHL:
+      __ Lsl(out, left, right);
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "int64 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    PairLocation* left_pair = instruction()->locs()->in(0).AsPairLocation();
+    Register left_hi = left_pair->At(1).reg();
+    PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+    Register right_lo = right_pair->At(0).reg();
+    Register right_hi = right_pair->At(1).reg();
+    PairLocation* out_pair = instruction()->locs()->out(0).AsPairLocation();
+    Register out_lo = out_pair->At(0).reg();
+    Register out_hi = out_pair->At(1).reg();
+
+    __ CompareImmediate(right_hi, 0);
+
+    switch (instruction()->AsShiftInt64Op()->op_kind()) {
+      case Token::kSHR:
+        __ Asr(out_hi, left_hi, Operand(kBitsPerWord - 1), GE);
+        __ mov(out_lo, Operand(out_hi), GE);
+        break;
+      case Token::kSHL: {
+        __ LoadImmediate(out_lo, 0, GE);
+        __ LoadImmediate(out_hi, 0, GE);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+
+    __ b(exit_label(), GE);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ StoreToOffset(kWord, right_lo, THR,
+                     Thread::unboxed_int64_runtime_arg_offset());
+    __ StoreToOffset(kWord, right_hi, THR,
+                     Thread::unboxed_int64_runtime_arg_offset() + kWordSize);
+  }
+};
+
 LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+  if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+    summary->set_in(1, Location::Constant(constant));
+  } else {
+    summary->set_in(1, Location::Pair(Location::RequiresRegister(),
+                                      Location::RequiresRegister()));
+  }
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
                                      Location::RequiresRegister()));
   return summary;
@@ -5830,86 +6007,216 @@
   Register out_hi = out_pair->At(1).reg();
   ASSERT(!can_overflow());
 
-  Label* deopt = NULL;
-  if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-  }
   if (locs()->in(1).IsConstant()) {
-    // Code for a constant shift amount.
-    ASSERT(locs()->in(1).constant().IsSmi());
-    const int32_t shift = Smi::Cast(locs()->in(1).constant()).Value();
-    ASSERT(shift >= 0);
-    switch (op_kind()) {
-      case Token::kSHR: {
-        if (shift < 32) {
-          __ Lsl(out_lo, left_hi, Operand(32 - shift));
-          __ orr(out_lo, out_lo, Operand(left_lo, LSR, shift));
-          __ Asr(out_hi, left_hi, Operand(shift));
-        } else {
-          if (shift == 32) {
-            __ mov(out_lo, Operand(left_hi));
-          } else if (shift < 64) {
-            __ Asr(out_lo, left_hi, Operand(shift - 32));
-          } else {
-            __ Asr(out_lo, left_hi, Operand(31));
-          }
-          __ Asr(out_hi, left_hi, Operand(31));
-        }
-        break;
-      }
-      case Token::kSHL: {
-        ASSERT(shift < 64);
-        if (shift < 32) {
-          __ Lsr(out_hi, left_lo, Operand(32 - shift));
-          __ orr(out_hi, out_hi, Operand(left_hi, LSL, shift));
-          __ Lsl(out_lo, left_lo, Operand(shift));
-        } else {
-          if (shift == 32) {
-            __ mov(out_hi, Operand(left_lo));
-          } else {
-            __ Lsl(out_hi, left_lo, Operand(shift - 32));
-          }
-          __ mov(out_lo, Operand(0));
-        }
-        break;
-      }
-      default:
-        UNREACHABLE();
+    EmitShiftInt64ByConstant(compiler, op_kind(), out_lo, out_hi, left_lo,
+                             left_hi, locs()->in(1).constant());
+  } else {
+    // Code for a variable shift amount.
+    PairLocation* right_pair = locs()->in(1).AsPairLocation();
+    Register right_lo = right_pair->At(0).reg();
+    Register right_hi = right_pair->At(1).reg();
+
+    // Jump to a slow path if shift is larger than 63 or less than 0.
+    ShiftInt64OpSlowPath* slow_path = NULL;
+    if (!IsShiftCountInRange()) {
+      slow_path =
+          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+      __ CompareImmediate(right_hi, 0);
+      __ b(slow_path->entry_label(), NE);
+      __ CompareImmediate(right_lo, kShiftCountLimit);
+      __ b(slow_path->entry_label(), HI);
     }
+
+    EmitShiftInt64ByRegister(compiler, op_kind(), out_lo, out_hi, left_lo,
+                             left_hi, right_lo);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+  summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                     Location::RequiresRegister()));
+  return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  PairLocation* left_pair = locs()->in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+  PairLocation* out_pair = locs()->out(0).AsPairLocation();
+  Register out_lo = out_pair->At(0).reg();
+  Register out_hi = out_pair->At(1).reg();
+  ASSERT(!can_overflow());
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftInt64ByConstant(compiler, op_kind(), out_lo, out_hi, left_lo,
+                             left_hi, locs()->in(1).constant());
   } else {
     // Code for a variable shift amount.
     Register shift = locs()->in(1).reg();
-
-    // Untag shift count.
     __ SmiUntag(shift);
 
     // Deopt if shift is larger than 63 or less than 0.
     if (!IsShiftCountInRange()) {
-      __ CompareImmediate(shift, kMintShiftCountLimit);
+      ASSERT(CanDeoptimize());
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+      __ CompareImmediate(shift, kShiftCountLimit);
       __ b(deopt, HI);
     }
 
-    switch (op_kind()) {
-      case Token::kSHR: {
-        __ rsbs(IP, shift, Operand(32));
-        __ sub(IP, shift, Operand(32), MI);
-        __ mov(out_lo, Operand(left_hi, ASR, IP), MI);
-        __ mov(out_lo, Operand(left_lo, LSR, shift), PL);
-        __ orr(out_lo, out_lo, Operand(left_hi, LSL, IP), PL);
-        __ mov(out_hi, Operand(left_hi, ASR, shift));
-        break;
-      }
-      case Token::kSHL: {
-        __ rsbs(IP, shift, Operand(32));
-        __ sub(IP, shift, Operand(32), MI);
-        __ mov(out_hi, Operand(left_lo, LSL, IP), MI);
-        __ mov(out_hi, Operand(left_hi, LSL, shift), PL);
-        __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
-        __ mov(out_lo, Operand(left_lo, LSL, shift));
-        break;
-      }
-      default:
-        UNREACHABLE();
+    EmitShiftInt64ByRegister(compiler, op_kind(), out_lo, out_hi, left_lo,
+                             left_hi, shift);
+  }
+}
+
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "uint32 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+    Register right_lo = right_pair->At(0).reg();
+    Register right_hi = right_pair->At(1).reg();
+    Register out = instruction()->locs()->out(0).reg();
+
+    __ CompareImmediate(right_hi, 0);
+    __ LoadImmediate(out, 0, GE);
+    __ b(exit_label(), GE);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ StoreToOffset(kWord, right_lo, THR,
+                     Thread::unboxed_int64_runtime_arg_offset());
+    __ StoreToOffset(kWord, right_hi, THR,
+                     Thread::unboxed_int64_runtime_arg_offset() + kWordSize);
+  }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+    summary->set_in(1, Location::Constant(constant));
+  } else {
+    summary->set_in(1, Location::Pair(Location::RequiresRegister(),
+                                      Location::RequiresRegister()));
+  }
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+
+  ASSERT(left != out);
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+                              locs()->in(1).constant());
+  } else {
+    PairLocation* right_pair = locs()->in(1).AsPairLocation();
+    Register right_lo = right_pair->At(0).reg();
+    Register right_hi = right_pair->At(1).reg();
+
+    // Jump to a slow path if shift count is > 31 or negative.
+    ShiftUint32OpSlowPath* slow_path = NULL;
+    if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+      slow_path =
+          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ CompareImmediate(right_hi, 0);
+      __ b(slow_path->entry_label(), NE);
+      __ CompareImmediate(right_lo, kUint32ShiftCountLimit);
+      __ b(slow_path->entry_label(), HI);
+    }
+
+    EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right_lo);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  Register temp = locs()->temp(0).reg();
+  ASSERT(left != out);
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+                              locs()->in(1).constant());
+  } else {
+    Register right = locs()->in(1).reg();
+    const bool shift_count_in_range =
+        IsShiftCountInRange(kUint32ShiftCountLimit);
+
+    __ SmiUntag(temp, right);
+    right = temp;
+
+    // Deopt if shift count is negative.
+    if (!shift_count_in_range) {
+      ASSERT(CanDeoptimize());
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+      __ CompareImmediate(right, 0);
+      __ b(deopt, LT);
+    }
+
+    EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
+
+    if (!shift_count_in_range) {
+      __ CompareImmediate(right, kUint32ShiftCountLimit);
+      __ LoadImmediate(out, 0, HI);
     }
   }
 }
@@ -5948,6 +6255,10 @@
   return CompileType::Int();
 }
 
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
 CompileType UnaryUint32OpInstr::ComputeType() const {
   return CompileType::Int();
 }
@@ -5993,75 +6304,6 @@
   }
 }
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
-                                                         bool opt) const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t kShifterLimit = 31;
-
-  Register left = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  Register temp = locs()->temp(0).reg();
-
-  ASSERT(left != out);
-
-  Label* deopt =
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
-  if (locs()->in(1).IsConstant()) {
-    // Shifter is constant.
-
-    const Object& constant = locs()->in(1).constant();
-    ASSERT(constant.IsSmi());
-    const intptr_t shift_value = Smi::Cast(constant).Value();
-
-    // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
-    switch (op_kind()) {
-      case Token::kSHR:
-        __ Lsr(out, left, Operand(shift_value));
-        break;
-      case Token::kSHL:
-        __ Lsl(out, left, Operand(shift_value));
-        break;
-      default:
-        UNREACHABLE();
-    }
-    return;
-  }
-
-  // Non constant shift value.
-  Register shifter = locs()->in(1).reg();
-
-  __ SmiUntag(temp, shifter);
-  __ CompareImmediate(temp, 0);
-  // If shift value is < 0, deoptimize.
-  __ b(deopt, LT);
-  __ CompareImmediate(temp, kShifterLimit);
-  // > kShifterLimit, result is 0.
-  __ eor(out, out, Operand(out), HI);
-  // Do the shift.
-  switch (op_kind()) {
-    case Token::kSHR:
-      __ Lsr(out, left, temp, LS);
-      break;
-    case Token::kSHL:
-      __ Lsl(out, left, temp, LS);
-      break;
-    default:
-      UNREACHABLE();
-  }
-}
-
 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 983914d..c6c8498 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -5078,14 +5078,140 @@
   }
 }
 
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+                                     Token::Kind op_kind,
+                                     Register out,
+                                     Register left,
+                                     const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ AsrImmediate(out, left,
+                      Utils::Minimum<int64_t>(shift, kBitsPerWord - 1));
+      break;
+    }
+    case Token::kSHL: {
+      ASSERT(shift < 64);
+      __ LslImmediate(out, left, shift);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftInt64ByRegister(FlowGraphCompiler* compiler,
+                                     Token::Kind op_kind,
+                                     Register out,
+                                     Register left,
+                                     Register right) {
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ asrv(out, left, right);
+      break;
+    }
+    case Token::kSHL: {
+      __ lslv(out, left, right);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+                                      Token::Kind op_kind,
+                                      Register out,
+                                      Register left,
+                                      const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+  if (shift >= 32) {
+    __ LoadImmediate(out, 0);
+  } else {
+    switch (op_kind) {
+      case Token::kSHR:
+        __ LsrImmediate(out, left, shift, kWord);
+        break;
+      case Token::kSHL:
+        __ LslImmediate(out, left, shift, kWord);
+        break;
+      default:
+        UNREACHABLE();
+    }
+  }
+}
+
+static void EmitShiftUint32ByRegister(FlowGraphCompiler* compiler,
+                                      Token::Kind op_kind,
+                                      Register out,
+                                      Register left,
+                                      Register right) {
+  switch (op_kind) {
+    case Token::kSHR:
+      __ lsrvw(out, left, right);
+      break;
+    case Token::kSHL:
+      __ lslvw(out, left, right);
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "int64 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    const Register left = instruction()->locs()->in(0).reg();
+    const Register right = instruction()->locs()->in(1).reg();
+    const Register out = instruction()->locs()->out(0).reg();
+    ASSERT((out != left) && (out != right));
+
+    Label throw_error;
+    __ tbnz(&throw_error, right, kBitsPerWord - 1);
+
+    switch (instruction()->AsShiftInt64Op()->op_kind()) {
+      case Token::kSHR:
+        __ AsrImmediate(out, left, kBitsPerWord - 1);
+        break;
+      case Token::kSHL:
+        __ mov(out, ZR);
+        break;
+      default:
+        UNREACHABLE();
+    }
+    __ b(exit_label());
+
+    __ Bind(&throw_error);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ str(right, Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
+  }
+};
+
 LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+  summary->set_in(1, Location::RegisterOrConstant(right()));
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -5095,52 +5221,186 @@
   const Register out = locs()->out(0).reg();
   ASSERT(!can_overflow());
 
-  Label* deopt = NULL;
-  if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-  }
   if (locs()->in(1).IsConstant()) {
-    // Code for a constant shift amount.
-    ASSERT(locs()->in(1).constant().IsSmi());
-    const int32_t shift = Smi::Cast(locs()->in(1).constant()).Value();
-    ASSERT(shift >= 0);
-    switch (op_kind()) {
-      case Token::kSHR: {
-        __ AsrImmediate(out, left, Utils::Minimum(shift, kBitsPerWord - 1));
-        break;
-      }
-      case Token::kSHL: {
-        ASSERT(shift < 64);
-        __ LslImmediate(out, left, shift);
-        break;
-      }
-      default:
-        UNREACHABLE();
+    EmitShiftInt64ByConstant(compiler, op_kind(), out, left,
+                             locs()->in(1).constant());
+  } else {
+    // Code for a variable shift amount.
+    Register shift = locs()->in(1).reg();
+
+    // Jump to a slow path if shift is larger than 63 or less than 0.
+    ShiftInt64OpSlowPath* slow_path = NULL;
+    if (!IsShiftCountInRange()) {
+      slow_path =
+          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+      __ CompareImmediate(shift, kShiftCountLimit);
+      __ b(slow_path->entry_label(), HI);
     }
+
+    EmitShiftInt64ByRegister(compiler, op_kind(), out, left, shift);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register left = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(!can_overflow());
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftInt64ByConstant(compiler, op_kind(), out, left,
+                             locs()->in(1).constant());
   } else {
     // Code for a variable shift amount.
     Register shift = locs()->in(1).reg();
 
     // Untag shift count.
     __ SmiUntag(TMP, shift);
+    shift = TMP;
 
     // Deopt if shift is larger than 63 or less than 0.
     if (!IsShiftCountInRange()) {
-      __ CompareImmediate(TMP, kMintShiftCountLimit);
+      ASSERT(CanDeoptimize());
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+      __ CompareImmediate(shift, kShiftCountLimit);
       __ b(deopt, HI);
     }
 
-    switch (op_kind()) {
-      case Token::kSHR: {
-        __ lsrv(out, left, TMP);
-        break;
-      }
-      case Token::kSHL: {
-        __ lslv(out, left, TMP);
-        break;
-      }
-      default:
-        UNREACHABLE();
+    EmitShiftInt64ByRegister(compiler, op_kind(), out, left, shift);
+  }
+}
+
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "uint32 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    const Register right = instruction()->locs()->in(1).reg();
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ str(right, Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
+  }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrConstant(right()));
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+                              locs()->in(1).constant());
+  } else {
+    const Register right = locs()->in(1).reg();
+    const bool shift_count_in_range =
+        IsShiftCountInRange(kUint32ShiftCountLimit);
+
+    // Jump to a slow path if shift count is negative.
+    if (!shift_count_in_range) {
+      ShiftUint32OpSlowPath* slow_path =
+          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ tbnz(slow_path->entry_label(), right, kBitsPerWord - 1);
+    }
+
+    EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
+
+    if (!shift_count_in_range) {
+      // If shift value is > 31, return zero.
+      __ CompareImmediate(right, 31);
+      __ csel(out, out, ZR, LE);
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+                              locs()->in(1).constant());
+  } else {
+    Register right = locs()->in(1).reg();
+    const bool shift_count_in_range =
+        IsShiftCountInRange(kUint32ShiftCountLimit);
+
+    __ SmiUntag(TMP, right);
+    right = TMP;
+
+    // Jump to a slow path if shift count is negative.
+    if (!shift_count_in_range) {
+      // Deoptimize if shift count is negative.
+      ASSERT(CanDeoptimize());
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+      __ tbnz(deopt, right, kBitsPerWord - 1);
+    }
+
+    EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
+
+    if (!shift_count_in_range) {
+      // If shift value is > 31, return zero.
+      __ CompareImmediate(right, 31);
+      __ csel(out, out, ZR, LE);
     }
   }
 }
@@ -5172,6 +5432,10 @@
   return CompileType::FromCid(kSmiCid);
 }
 
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
 CompileType UnaryUint32OpInstr::ComputeType() const {
   return CompileType::FromCid(kSmiCid);
 }
@@ -5217,75 +5481,6 @@
   }
 }
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
-                                                         bool opt) const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t kShifterLimit = 31;
-
-  Register left = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-
-  Label* deopt =
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
-  if (locs()->in(1).IsConstant()) {
-    // Shifter is constant.
-
-    const Object& constant = locs()->in(1).constant();
-    ASSERT(constant.IsSmi());
-    const intptr_t shift_value = Smi::Cast(constant).Value();
-
-    // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
-    switch (op_kind()) {
-      case Token::kSHR:
-        __ LsrImmediate(out, left, shift_value, kWord);
-        break;
-      case Token::kSHL:
-        __ LslImmediate(out, left, shift_value, kWord);
-        break;
-      default:
-        UNREACHABLE();
-    }
-    return;
-  }
-
-  // Non constant shift value.
-
-  Register shifter = locs()->in(1).reg();
-
-  // TODO(johnmccutchan): Use range information to avoid these checks.
-  __ SmiUntag(TMP, shifter);
-  __ CompareImmediate(TMP, 0);
-  // If shift value is < 0, deoptimize.
-  __ b(deopt, LT);
-
-  // Do the shift.
-  switch (op_kind()) {
-    case Token::kSHR:
-      __ lsrv(out, left, TMP);
-      break;
-    case Token::kSHL:
-      __ lslvw(out, left, TMP);
-      break;
-    default:
-      UNREACHABLE();
-  }
-
-  __ CompareImmediate(TMP, kShifterLimit);
-  // If shift value is > 31, return zero.
-  __ csel(out, out, ZR, GT);
-}
-
 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index 0451944..dae7f80 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -42,6 +42,7 @@
   M(ExtractNthOutput)                                                          \
   M(BinaryUint32Op)                                                            \
   M(ShiftUint32Op)                                                             \
+  M(SpeculativeShiftUint32Op)                                                  \
   M(UnaryUint32Op)                                                             \
   M(UnboxedIntConverter)
 
@@ -59,6 +60,7 @@
   M(Int64ToDouble)                                                             \
   M(BinaryInt64Op)                                                             \
   M(ShiftInt64Op)                                                              \
+  M(SpeculativeShiftInt64Op)                                                   \
   M(UnaryInt64Op)                                                              \
   M(CheckedSmiOp)                                                              \
   M(CheckedSmiComparison)                                                      \
@@ -1278,6 +1280,10 @@
   return CompileType::Int();
 }
 
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
 CompileType UnaryUint32OpInstr::ComputeType() const {
   return CompileType::Int();
 }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 97e7ac1..57f3b5d 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -5247,15 +5247,204 @@
   }
 }
 
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+                                     Token::Kind op_kind,
+                                     Register left_lo,
+                                     Register left_hi,
+                                     const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+  switch (op_kind) {
+    case Token::kSHR: {
+      if (shift > 31) {
+        __ movl(left_lo, left_hi);        // Shift by 32.
+        __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
+        if (shift > 32) {
+          __ sarl(left_lo, Immediate(shift > 63 ? 31 : shift - 32));
+        }
+      } else {
+        __ shrdl(left_lo, left_hi, Immediate(shift));
+        __ sarl(left_hi, Immediate(shift));
+      }
+      break;
+    }
+    case Token::kSHL: {
+      ASSERT(shift < 64);
+      if (shift > 31) {
+        __ movl(left_hi, left_lo);  // Shift by 32.
+        __ xorl(left_lo, left_lo);  // Zero left_lo.
+        if (shift > 32) {
+          __ shll(left_hi, Immediate(shift - 32));
+        }
+      } else {
+        __ shldl(left_hi, left_lo, Immediate(shift));
+        __ shll(left_lo, Immediate(shift));
+      }
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftInt64ByECX(FlowGraphCompiler* compiler,
+                                Token::Kind op_kind,
+                                Register left_lo,
+                                Register left_hi) {
+  // sarl operation masks the count to 5 bits and
+  // shrdl is undefined with count > operand size (32)
+  Label done, large_shift;
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ cmpl(ECX, Immediate(31));
+      __ j(ABOVE, &large_shift);
+
+      __ shrdl(left_lo, left_hi, ECX);  // Shift count in CL.
+      __ sarl(left_hi, ECX);            // Shift count in CL.
+      __ jmp(&done, Assembler::kNearJump);
+
+      __ Bind(&large_shift);
+      // No need to subtract 32 from CL, only 5 bits used by sarl.
+      __ movl(left_lo, left_hi);        // Shift by 32.
+      __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
+      __ sarl(left_lo, ECX);            // Shift count: CL % 32.
+      break;
+    }
+    case Token::kSHL: {
+      __ cmpl(ECX, Immediate(31));
+      __ j(ABOVE, &large_shift);
+
+      __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
+      __ shll(left_lo, ECX);            // Shift count in CL.
+      __ jmp(&done, Assembler::kNearJump);
+
+      __ Bind(&large_shift);
+      // No need to subtract 32 from CL, only 5 bits used by shll.
+      __ movl(left_hi, left_lo);  // Shift by 32.
+      __ xorl(left_lo, left_lo);  // Zero left_lo.
+      __ shll(left_hi, ECX);      // Shift count: CL % 32.
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+  __ Bind(&done);
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+                                      Token::Kind op_kind,
+                                      Register left,
+                                      const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  if (shift >= 32) {
+    __ xorl(left, left);
+  } else {
+    switch (op_kind) {
+      case Token::kSHR: {
+        __ shrl(left, Immediate(shift));
+        break;
+      }
+      case Token::kSHL: {
+        __ shll(left, Immediate(shift));
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+}
+
+static void EmitShiftUint32ByECX(FlowGraphCompiler* compiler,
+                                 Token::Kind op_kind,
+                                 Register left) {
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ shrl(left, ECX);
+      break;
+    }
+    case Token::kSHL: {
+      __ shll(left, ECX);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "int64 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+    Register right_lo = right_pair->At(0).reg();
+    Register right_hi = right_pair->At(1).reg();
+    PairLocation* out_pair = instruction()->locs()->out(0).AsPairLocation();
+    Register out_lo = out_pair->At(0).reg();
+    Register out_hi = out_pair->At(1).reg();
+#if defined(DEBUG)
+    PairLocation* left_pair = instruction()->locs()->in(0).AsPairLocation();
+    Register left_lo = left_pair->At(0).reg();
+    Register left_hi = left_pair->At(1).reg();
+    ASSERT(out_lo == left_lo);
+    ASSERT(out_hi == left_hi);
+#endif  // defined(DEBUG)
+
+    Label throw_error;
+    __ testl(right_hi, right_hi);
+    __ j(NEGATIVE, &throw_error);
+
+    switch (instruction()->AsShiftInt64Op()->op_kind()) {
+      case Token::kSHR:
+        __ sarl(out_hi, Immediate(31));
+        __ movl(out_lo, out_hi);
+        break;
+      case Token::kSHL: {
+        __ xorl(out_lo, out_lo);
+        __ xorl(out_hi, out_hi);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+    __ jmp(exit_label());
+
+    __ Bind(&throw_error);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ movl(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), right_lo);
+    __ movl(
+        Address(THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
+        right_hi);
+  }
+};
+
 LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+  if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+    summary->set_in(1, Location::Constant(constant));
+  } else {
+    summary->set_in(1, Location::Pair(Location::RegisterLocation(ECX),
+                                      Location::RequiresRegister()));
+  }
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -5271,92 +5460,217 @@
   ASSERT(out_hi == left_hi);
   ASSERT(!can_overflow());
 
-  Label* deopt = NULL;
-  if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-  }
   if (locs()->in(1).IsConstant()) {
-    // Code for a constant shift amount.
-    ASSERT(locs()->in(1).constant().IsSmi());
-    const int32_t shift = Smi::Cast(locs()->in(1).constant()).Value();
-    ASSERT(shift >= 0);
-    switch (op_kind()) {
-      case Token::kSHR: {
-        if (shift > 31) {
-          __ movl(left_lo, left_hi);        // Shift by 32.
-          __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
-          if (shift > 32) {
-            __ sarl(left_lo, Immediate(shift > 63 ? 31 : shift - 32));
-          }
-        } else {
-          __ shrdl(left_lo, left_hi, Immediate(shift));
-          __ sarl(left_hi, Immediate(shift));
-        }
-        break;
-      }
-      case Token::kSHL: {
-        ASSERT(shift < 64);
-        if (shift > 31) {
-          __ movl(left_hi, left_lo);  // Shift by 32.
-          __ xorl(left_lo, left_lo);  // Zero left_lo.
-          if (shift > 32) {
-            __ shll(left_hi, Immediate(shift - 32));
-          }
-        } else {
-          __ shldl(left_hi, left_lo, Immediate(shift));
-          __ shll(left_lo, Immediate(shift));
-        }
-        break;
-      }
-      default:
-        UNREACHABLE();
-    }
+    EmitShiftInt64ByConstant(compiler, op_kind(), left_lo, left_hi,
+                             locs()->in(1).constant());
   } else {
     // Code for a variable shift amount.
-    // Deoptimize if shift count is > 63.
-    // sarl operation masks the count to 5 bits and
-    // shrdl is undefined with count > operand size (32)
-    __ SmiUntag(ECX);
+    ASSERT(locs()->in(1).AsPairLocation()->At(0).reg() == ECX);
+    Register right_hi = locs()->in(1).AsPairLocation()->At(1).reg();
+
+    // Jump to a slow path if shift count is > 63 or negative.
+    ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      __ cmpl(ECX, Immediate(kMintShiftCountLimit));
+      slow_path =
+          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+      __ testl(right_hi, right_hi);
+      __ j(NOT_ZERO, slow_path->entry_label());
+      __ cmpl(ECX, Immediate(kShiftCountLimit));
+      __ j(ABOVE, slow_path->entry_label());
+    }
+
+    EmitShiftInt64ByECX(compiler, op_kind(), left_lo, left_hi);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  PairLocation* left_pair = locs()->in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+  PairLocation* out_pair = locs()->out(0).AsPairLocation();
+  Register out_lo = out_pair->At(0).reg();
+  Register out_hi = out_pair->At(1).reg();
+  ASSERT(out_lo == left_lo);
+  ASSERT(out_hi == left_hi);
+  ASSERT(!can_overflow());
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftInt64ByConstant(compiler, op_kind(), left_lo, left_hi,
+                             locs()->in(1).constant());
+  } else {
+    ASSERT(locs()->in(1).reg() == ECX);
+    __ SmiUntag(ECX);
+
+    // Deoptimize if shift count is > 63 or negative.
+    if (!IsShiftCountInRange()) {
+      ASSERT(CanDeoptimize());
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+      __ cmpl(ECX, Immediate(kShiftCountLimit));
       __ j(ABOVE, deopt);
     }
-    Label done, large_shift;
-    switch (op_kind()) {
-      case Token::kSHR: {
-        __ cmpl(ECX, Immediate(31));
-        __ j(ABOVE, &large_shift);
 
-        __ shrdl(left_lo, left_hi, ECX);  // Shift count in CL.
-        __ sarl(left_hi, ECX);            // Shift count in CL.
-        __ jmp(&done, Assembler::kNearJump);
+    EmitShiftInt64ByECX(compiler, op_kind(), left_lo, left_hi);
+  }
+}
 
-        __ Bind(&large_shift);
-        // No need to subtract 32 from CL, only 5 bits used by sarl.
-        __ movl(left_lo, left_hi);        // Shift by 32.
-        __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
-        __ sarl(left_lo, ECX);            // Shift count: CL % 32.
-        break;
-      }
-      case Token::kSHL: {
-        __ cmpl(ECX, Immediate(31));
-        __ j(ABOVE, &large_shift);
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
 
-        __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
-        __ shll(left_lo, ECX);            // Shift count in CL.
-        __ jmp(&done, Assembler::kNearJump);
+  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
 
-        __ Bind(&large_shift);
-        // No need to subtract 32 from CL, only 5 bits used by shll.
-        __ movl(left_hi, left_lo);  // Shift by 32.
-        __ xorl(left_lo, left_lo);  // Zero left_lo.
-        __ shll(left_hi, ECX);      // Shift count: CL % 32.
-        break;
-      }
-      default:
-        UNREACHABLE();
+  const char* name() override { return "uint32 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+    Register right_lo = right_pair->At(0).reg();
+    Register right_hi = right_pair->At(1).reg();
+    const Register out = instruction()->locs()->out(0).reg();
+    ASSERT(out == instruction()->locs()->in(0).reg());
+
+    Label throw_error;
+    __ testl(right_hi, right_hi);
+    __ j(NEGATIVE, &throw_error);
+
+    __ xorl(out, out);
+    __ jmp(exit_label());
+
+    __ Bind(&throw_error);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ movl(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), right_lo);
+    __ movl(
+        Address(THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
+        right_hi);
+  }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+    summary->set_in(1, Location::Constant(constant));
+  } else {
+    summary->set_in(1, Location::Pair(Location::RegisterLocation(ECX),
+                                      Location::RequiresRegister()));
+  }
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left == out);
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), left,
+                              locs()->in(1).constant());
+  } else {
+    // Code for a variable shift amount.
+    ASSERT(locs()->in(1).AsPairLocation()->At(0).reg() == ECX);
+    Register right_hi = locs()->in(1).AsPairLocation()->At(1).reg();
+
+    // Jump to a slow path if shift count is > 31 or negative.
+    ShiftUint32OpSlowPath* slow_path = NULL;
+    if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+      slow_path =
+          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ testl(right_hi, right_hi);
+      __ j(NOT_ZERO, slow_path->entry_label());
+      __ cmpl(ECX, Immediate(kUint32ShiftCountLimit));
+      __ j(ABOVE, slow_path->entry_label());
     }
-    __ Bind(&done);
+
+    EmitShiftUint32ByECX(compiler, op_kind(), left);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left == out);
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), left,
+                              locs()->in(1).constant());
+  } else {
+    ASSERT(locs()->in(1).reg() == ECX);
+    __ SmiUntag(ECX);
+
+    if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+      if (!IsShiftCountInRange()) {
+        // Deoptimize if shift count is negative.
+        ASSERT(CanDeoptimize());
+        Label* deopt =
+            compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+        __ testl(ECX, ECX);
+        __ j(LESS, deopt);
+      }
+
+      Label cont;
+      __ cmpl(ECX, Immediate(kUint32ShiftCountLimit));
+      __ j(LESS_EQUAL, &cont);
+
+      __ xorl(left, left);
+
+      __ Bind(&cont);
+    }
+
+    EmitShiftUint32ByECX(compiler, op_kind(), left);
   }
 }
 
@@ -5394,90 +5708,12 @@
   return CompileType::Int();
 }
 
-CompileType UnaryUint32OpInstr::ComputeType() const {
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
   return CompileType::Int();
 }
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
-                                                         bool opt) const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
-  summary->set_out(0, Location::SameAsFirstInput());
-  return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t kShifterLimit = 31;
-
-  Register left = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  ASSERT(left == out);
-
-  Label* deopt =
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
-  if (locs()->in(1).IsConstant()) {
-    // Shifter is constant.
-
-    const Object& constant = locs()->in(1).constant();
-    ASSERT(constant.IsSmi());
-    const intptr_t shift_value = Smi::Cast(constant).Value();
-
-    // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
-    switch (op_kind()) {
-      case Token::kSHR:
-        __ shrl(left, Immediate(shift_value));
-        break;
-      case Token::kSHL:
-        __ shll(left, Immediate(shift_value));
-        break;
-      default:
-        UNREACHABLE();
-    }
-    return;
-  }
-
-  // Non constant shift value.
-
-  Register shifter = locs()->in(1).reg();
-  ASSERT(shifter == ECX);
-
-  Label done;
-  Label zero;
-
-  // TODO(johnmccutchan): Use range information to avoid these checks.
-  __ SmiUntag(shifter);
-  __ cmpl(shifter, Immediate(0));
-  // If shift value is < 0, deoptimize.
-  __ j(NEGATIVE, deopt);
-  __ cmpl(shifter, Immediate(kShifterLimit));
-  // If shift value is >= 32, return zero.
-  __ j(ABOVE, &zero);
-
-  // Do the shift.
-  switch (op_kind()) {
-    case Token::kSHR:
-      __ shrl(left, shifter);
-      __ jmp(&done);
-      break;
-    case Token::kSHL:
-      __ shll(left, shifter);
-      __ jmp(&done);
-      break;
-    default:
-      UNREACHABLE();
-  }
-
-  __ Bind(&zero);
-  // Shift was greater than 31 bits, just return zero.
-  __ xorl(left, left);
-
-  // Exit path.
-  __ Bind(&done);
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
 }
 
 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index f66d347..c520bfc 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -5237,14 +5237,136 @@
   __ notq(left);
 }
 
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+                                     Token::Kind op_kind,
+                                     Register left,
+                                     const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+  switch (op_kind) {
+    case Token::kSHR:
+      __ sarq(left,
+              Immediate(Utils::Minimum<int64_t>(shift, kBitsPerWord - 1)));
+      break;
+    case Token::kSHL: {
+      ASSERT(shift < 64);
+      __ shlq(left, Immediate(shift));
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftInt64ByRCX(FlowGraphCompiler* compiler,
+                                Token::Kind op_kind,
+                                Register left) {
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ sarq(left, RCX);
+      break;
+    }
+    case Token::kSHL: {
+      __ shlq(left, RCX);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+                                      Token::Kind op_kind,
+                                      Register left,
+                                      const Object& right) {
+  const int64_t shift = Integer::Cast(right).AsInt64Value();
+  ASSERT(shift >= 0);
+  if (shift >= 32) {
+    __ xorl(left, left);
+  } else {
+    switch (op_kind) {
+      case Token::kSHR: {
+        __ shrl(left, Immediate(shift));
+        break;
+      }
+      case Token::kSHL: {
+        __ shll(left, Immediate(shift));
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+}
+
+static void EmitShiftUint32ByRCX(FlowGraphCompiler* compiler,
+                                 Token::Kind op_kind,
+                                 Register left) {
+  switch (op_kind) {
+    case Token::kSHR: {
+      __ shrl(left, RCX);
+      break;
+    }
+    case Token::kSHL: {
+      __ shll(left, RCX);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "int64 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    const Register out = instruction()->locs()->out(0).reg();
+    ASSERT(out == instruction()->locs()->in(0).reg());
+
+    Label throw_error;
+    __ testq(RCX, RCX);
+    __ j(LESS, &throw_error);
+
+    switch (instruction()->AsShiftInt64Op()->op_kind()) {
+      case Token::kSHR:
+        __ sarq(out, Immediate(kBitsPerInt64 - 1));
+        break;
+      case Token::kSHL:
+        __ xorq(out, out);
+        break;
+      default:
+        UNREACHABLE();
+    }
+    __ jmp(exit_label());
+
+    __ Bind(&throw_error);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ movq(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), RCX);
+  }
+};
+
 LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+  summary->set_in(1, Location::FixedRegisterOrConstant(right(), RCX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -5255,50 +5377,195 @@
   ASSERT(left == out);
   ASSERT(!can_overflow());
 
-  Label* deopt = NULL;
-  if (CanDeoptimize()) {
-    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-  }
   if (locs()->in(1).IsConstant()) {
-    // Code for a constant shift amount.
-    ASSERT(locs()->in(1).constant().IsSmi());
-    const int64_t shift = Smi::Cast(locs()->in(1).constant()).Value();
-    ASSERT(shift >= 0);
-    switch (op_kind()) {
-      case Token::kSHR:
-        __ sarq(left,
-                Immediate(Utils::Minimum<int64_t>(shift, kBitsPerWord - 1)));
-        break;
-      case Token::kSHL: {
-        ASSERT(shift < 64);
-        __ shlq(left, Immediate(shift));
-        break;
-      }
-      default:
-        UNREACHABLE();
-    }
+    EmitShiftInt64ByConstant(compiler, op_kind(), left,
+                             locs()->in(1).constant());
   } else {
     // Code for a variable shift amount.
-    // Deoptimize if shift count is > 63 or negative.
-    // Sarq and shlq instructions mask the count to 6 bits.
-    __ SmiUntag(RCX);
+    ASSERT(locs()->in(1).reg() == RCX);
+
+    // Jump to a slow path if shift count is > 63 or negative.
+    ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      __ cmpq(RCX, Immediate(kMintShiftCountLimit));
+      slow_path =
+          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ cmpq(RCX, Immediate(kShiftCountLimit));
+      __ j(ABOVE, slow_path->entry_label());
+    }
+
+    EmitShiftInt64ByRCX(compiler, op_kind(), left);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register left = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(left == out);
+  ASSERT(!can_overflow());
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftInt64ByConstant(compiler, op_kind(), left,
+                             locs()->in(1).constant());
+  } else {
+    ASSERT(locs()->in(1).reg() == RCX);
+    __ SmiUntag(RCX);
+
+    // Deoptimize if shift count is > 63 or negative.
+    if (!IsShiftCountInRange()) {
+      ASSERT(CanDeoptimize());
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+      __ cmpq(RCX, Immediate(kShiftCountLimit));
       __ j(ABOVE, deopt);
     }
-    Label done, large_shift;
-    switch (op_kind()) {
-      case Token::kSHR: {
-        __ sarq(left, RCX);
-        break;
-      }
-      case Token::kSHL: {
-        __ shlq(left, RCX);
-        break;
-      }
-      default:
-        UNREACHABLE();
+
+    EmitShiftInt64ByRCX(compiler, op_kind(), left);
+  }
+}
+
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  static const intptr_t kNumberOfArguments = 0;
+
+  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kArgumentErrorUnboxedInt64RuntimeEntry,
+                               kNumberOfArguments,
+                               try_index) {}
+
+  const char* name() override { return "uint32 shift"; }
+
+  void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+    const Register out = instruction()->locs()->out(0).reg();
+    ASSERT(out == instruction()->locs()->in(0).reg());
+
+    Label throw_error;
+    __ testq(RCX, RCX);
+    __ j(LESS, &throw_error);
+
+    __ xorl(out, out);
+    __ jmp(exit_label());
+
+    __ Bind(&throw_error);
+
+    // Can't pass unboxed int64 value directly to runtime call, as all
+    // arguments are expected to be tagged (boxed).
+    // The unboxed int64 argument is passed through a dedicated slot in Thread.
+    // TODO(dartbug.com/33549): Clean this up when unboxed values
+    // could be passed as arguments.
+    __ movq(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), RCX);
+  }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone) LocationSummary(
+      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::FixedRegisterOrConstant(right(), RCX));
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left == out);
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), left,
+                              locs()->in(1).constant());
+  } else {
+    ASSERT(locs()->in(1).reg() == RCX);
+
+    // Jump to a slow path if shift count is > 31 or negative.
+    ShiftUint32OpSlowPath* slow_path = NULL;
+    if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+      slow_path =
+          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ cmpq(RCX, Immediate(kUint32ShiftCountLimit));
+      __ j(ABOVE, slow_path->entry_label());
     }
+
+    EmitShiftUint32ByRCX(compiler, op_kind(), left);
+
+    if (slow_path != NULL) {
+      __ Bind(slow_path->exit_label());
+    }
+  }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+    Zone* zone,
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left == out);
+
+  if (locs()->in(1).IsConstant()) {
+    EmitShiftUint32ByConstant(compiler, op_kind(), left,
+                              locs()->in(1).constant());
+  } else {
+    ASSERT(locs()->in(1).reg() == RCX);
+    __ SmiUntag(RCX);
+
+    if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+      if (!IsShiftCountInRange()) {
+        // Deoptimize if shift count is negative.
+        ASSERT(CanDeoptimize());
+        Label* deopt =
+            compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+        __ testq(RCX, RCX);
+        __ j(LESS, deopt);
+      }
+
+      Label cont;
+      __ cmpq(RCX, Immediate(kUint32ShiftCountLimit));
+      __ j(LESS_EQUAL, &cont);
+
+      __ xorl(left, left);
+
+      __ Bind(&cont);
+    }
+
+    EmitShiftUint32ByRCX(compiler, op_kind(), left);
   }
 }
 
@@ -5310,6 +5577,10 @@
   return CompileType::FromCid(kSmiCid);
 }
 
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
 CompileType UnaryUint32OpInstr::ComputeType() const {
   return CompileType::FromCid(kSmiCid);
 }
@@ -5374,88 +5645,6 @@
   }
 }
 
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
-                                                         bool opt) const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new (zone)
-      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
-  summary->set_out(0, Location::SameAsFirstInput());
-  return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t kShifterLimit = 31;
-
-  Register left = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  ASSERT(left == out);
-
-  Label* deopt =
-      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
-  if (locs()->in(1).IsConstant()) {
-    // Shifter is constant.
-
-    const Object& constant = locs()->in(1).constant();
-    ASSERT(constant.IsSmi());
-    const intptr_t shift_value = Smi::Cast(constant).Value();
-
-    // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
-    switch (op_kind()) {
-      case Token::kSHR:
-        __ shrl(left, Immediate(shift_value));
-        break;
-      case Token::kSHL:
-        __ shll(left, Immediate(shift_value));
-        break;
-      default:
-        UNREACHABLE();
-    }
-    return;
-  }
-
-  // Non constant shift value.
-
-  Register shifter = locs()->in(1).reg();
-  ASSERT(shifter == RCX);
-
-  Label done;
-  Label zero;
-
-  // TODO(johnmccutchan): Use range information to avoid these checks.
-  __ SmiUntag(shifter);
-  __ cmpq(shifter, Immediate(0));
-  // If shift value is < 0, deoptimize.
-  __ j(NEGATIVE, deopt);
-  __ cmpq(shifter, Immediate(kShifterLimit));
-  // If shift value is >= 32, return zero.
-  __ j(ABOVE, &zero);
-
-  // Do the shift.
-  switch (op_kind()) {
-    case Token::kSHR:
-      __ shrl(left, shifter);
-      __ jmp(&done);
-      break;
-    case Token::kSHL:
-      __ shll(left, shifter);
-      __ jmp(&done);
-      break;
-    default:
-      UNREACHABLE();
-  }
-
-  __ Bind(&zero);
-  // Shift was greater than 31 bits, just return zero.
-  __ xorq(left, left);
-
-  // Exit path.
-  __ Bind(&done);
-}
-
 DEFINE_BACKEND(UnaryUint32Op, (SameAsFirstInput, Register value)) {
   __ notl(value);
 }
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index b39e2be..fd08f03 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -254,8 +254,9 @@
           values_.Add(defn);
           if (defn->IsBinaryInt64Op()) {
             binary_int64_ops_.Add(defn->AsBinaryInt64Op());
-          } else if (defn->IsShiftInt64Op()) {
-            shift_int64_ops_.Add(defn->AsShiftInt64Op());
+          } else if (defn->IsShiftInt64Op() ||
+                     defn->IsSpeculativeShiftInt64Op()) {
+            shift_int64_ops_.Add(defn->AsShiftIntegerOp());
           }
         }
       } else if (current->IsCheckArrayBound()) {
@@ -1497,7 +1498,7 @@
   }
 }
 
-static void NarrowShiftInt64Op(ShiftInt64OpInstr* int64_op) {
+static void NarrowShiftInt64Op(ShiftIntegerOpInstr* int64_op) {
   if (RangeUtils::Fits(int64_op->range(), RangeBoundary::kRangeBoundaryInt32) &&
       RangeUtils::Fits(int64_op->left()->definition()->range(),
                        RangeBoundary::kRangeBoundaryInt32) &&
@@ -1552,7 +1553,8 @@
   // & untagged of intermediate results.
   // TODO(johnmccutchan): Consider phis.
   return def->IsBoxInt64() || def->IsUnboxInt64() || def->IsBinaryInt64Op() ||
-         def->IsShiftInt64Op() || def->IsUnaryInt64Op();
+         def->IsShiftInt64Op() || def->IsSpeculativeShiftInt64Op() ||
+         def->IsUnaryInt64Op();
 }
 
 void IntegerInstructionSelector::FindPotentialUint32Definitions() {
@@ -1625,6 +1627,13 @@
         !selected_uint32_defs_->Contains(defn->ssa_temp_index())) {
       return false;
     }
+    // Right-hand side operand of ShiftInt64Op is not narrowing (all its bits
+    // should be taken into account).
+    if (ShiftIntegerOpInstr* shift = defn->AsShiftIntegerOp()) {
+      if (use == shift->right()) {
+        return false;
+      }
+    }
   }
   return true;
 }
@@ -1638,8 +1647,8 @@
   }
   // A right shift with an input outside of Uint32 range cannot be converted
   // because we need the high bits.
-  if (def->IsShiftInt64Op()) {
-    ShiftInt64OpInstr* op = def->AsShiftInt64Op();
+  if (def->IsShiftInt64Op() || def->IsSpeculativeShiftInt64Op()) {
+    ShiftIntegerOpInstr* op = def->AsShiftIntegerOp();
     if (op->op_kind() == Token::kSHR) {
       Definition* shift_input = op->left()->definition();
       ASSERT(shift_input != NULL);
@@ -1699,13 +1708,22 @@
   ASSERT(IsPotentialUint32Definition(def));
   // Should not see constant instructions.
   ASSERT(!def->IsConstant());
-  if (def->IsBinaryInt64Op()) {
-    BinaryInt64OpInstr* op = def->AsBinaryInt64Op();
+  if (def->IsBinaryIntegerOp()) {
+    BinaryIntegerOpInstr* op = def->AsBinaryIntegerOp();
     Token::Kind op_kind = op->op_kind();
     Value* left = op->left()->CopyWithType();
     Value* right = op->right()->CopyWithType();
     intptr_t deopt_id = op->DeoptimizationTarget();
-    return new (Z) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+    if (def->IsBinaryInt64Op()) {
+      return new (Z) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+    } else if (def->IsShiftInt64Op()) {
+      return new (Z) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+    } else if (def->IsSpeculativeShiftInt64Op()) {
+      return new (Z)
+          SpeculativeShiftUint32OpInstr(op_kind, left, right, deopt_id);
+    } else {
+      UNREACHABLE();
+    }
   } else if (def->IsBoxInt64()) {
     Value* value = def->AsBoxInt64()->value()->CopyWithType();
     return new (Z) BoxUint32Instr(value);
@@ -1720,13 +1738,6 @@
     Value* value = op->value()->CopyWithType();
     intptr_t deopt_id = op->DeoptimizationTarget();
     return new (Z) UnaryUint32OpInstr(op_kind, value, deopt_id);
-  } else if (def->IsShiftInt64Op()) {
-    ShiftInt64OpInstr* op = def->AsShiftInt64Op();
-    Token::Kind op_kind = op->op_kind();
-    Value* left = op->left()->CopyWithType();
-    Value* right = op->right()->CopyWithType();
-    intptr_t deopt_id = op->DeoptimizationTarget();
-    return new (Z) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
   }
   UNREACHABLE();
   return NULL;
@@ -2504,7 +2515,7 @@
 void Definition::InferRange(RangeAnalysis* analysis, Range* range) {
   if (Type()->ToCid() == kSmiCid) {
     *range = Range::Full(RangeBoundary::kRangeBoundarySmi);
-  } else if (IsMintDefinition()) {
+  } else if (IsInt64Definition()) {
     *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
   } else if (IsInt32Definition()) {
     *range = Range::Full(RangeBoundary::kRangeBoundaryInt32);
@@ -2844,7 +2855,7 @@
                    right()->definition()->range(), range);
 }
 
-void ShiftInt64OpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+void ShiftIntegerOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   CacheRange(&shift_range_, right()->definition()->range(),
              RangeBoundary::kRangeBoundaryInt64);
   InferRangeHelper(left()->definition()->range(),
@@ -2903,7 +2914,7 @@
   const Range* value_range = value()->definition()->range();
   if (value_range != NULL) {
     *range = *value_range;
-  } else if (!value()->definition()->IsMintDefinition() &&
+  } else if (!value()->definition()->IsInt64Definition() &&
              (value()->definition()->Type()->ToCid() != kSmiCid)) {
     *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
   }
diff --git a/runtime/vm/compiler/backend/range_analysis.h b/runtime/vm/compiler/backend/range_analysis.h
index e8140f8..0b25eaa 100644
--- a/runtime/vm/compiler/backend/range_analysis.h
+++ b/runtime/vm/compiler/backend/range_analysis.h
@@ -605,7 +605,7 @@
 
   GrowableArray<BinaryInt64OpInstr*> binary_int64_ops_;
 
-  GrowableArray<ShiftInt64OpInstr*> shift_int64_ops_;
+  GrowableArray<ShiftIntegerOpInstr*> shift_int64_ops_;
 
   // All CheckArrayBound instructions.
   GrowableArray<CheckArrayBoundInstr*> bounds_checks_;
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 1f0f476..e4f7d2e 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1328,6 +1328,10 @@
   return CompileType::Int();
 }
 
+CompileType SpeculativeShiftInt64OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
 CompileType UnaryInt64OpInstr::ComputeType() const {
   return CompileType::Int();
 }
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 41b3027..4faa42a 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -760,8 +760,9 @@
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedInt64()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
-      ShiftInt64OpInstr* shift_op = new (Z) ShiftInt64OpInstr(
-          op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
+      SpeculativeShiftInt64OpInstr* shift_op = new (Z)
+          SpeculativeShiftInt64OpInstr(op_kind, new (Z) Value(left),
+                                       new (Z) Value(right), call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
       BinaryInt64OpInstr* bin_op = new (Z) BinaryInt64OpInstr(
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 19a77d3..23b2002 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -38,6 +38,31 @@
              .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;
+}
+
 void FunctionNodeHelper::ReadUntilExcluding(Field field) {
   if (field <= next_read_) return;
 
@@ -272,6 +297,11 @@
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
       /* Falls through */
+    case kStartPosition:
+      start_position_ = helper_->ReadPosition(false);  // read position.
+      helper_->RecordTokenPosition(start_position_);
+      if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
@@ -345,6 +375,11 @@
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
       /* Falls through */
+    case kStartPosition:
+      start_position_ = helper_->ReadPosition();  // read position.
+      helper_->RecordTokenPosition(start_position_);
+      if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
       helper_->RecordTokenPosition(position_);
@@ -410,6 +445,11 @@
       helper_->set_current_script_id(source_uri_index_);
       if (++next_read_ == field) return;
       /* Falls through */
+    case kStartPosition:
+      start_position_ = helper_->ReadPosition(false);  // read position.
+      helper_->RecordTokenPosition(start_position_);
+      if (++next_read_ == field) return;
+      /* Falls through */
     case kPosition:
       position_ = helper_->ReadPosition(false);  // read position.
       helper_->RecordTokenPosition(position_);
@@ -1354,15 +1394,14 @@
 }
 
 RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
-  // TODO(regis): Avoid copying bytecode from mapped kernel binary.
   intptr_t size = builder_->reader_.ReadUInt();
   intptr_t offset = builder_->reader_.offset();
-  uint8_t* data =
-      builder_->reader_.CopyDataIntoZone(builder_->zone_, offset, size);
+  const uint8_t* data = builder_->reader_.BufferAt(offset);
   builder_->reader_.set_offset(offset + size);
 
   // Create and return code object.
-  return Code::FinalizeBytecode(reinterpret_cast<void*>(data), size, pool);
+  return Code::FinalizeBytecode(reinterpret_cast<const void*>(data), size,
+                                pool);
 }
 
 void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
@@ -1520,7 +1559,8 @@
           &translation_helper_,
           Script::Handle(Z, parsed_function->function().script()),
           zone_,
-          TypedData::Handle(Z, parsed_function->function().KernelData()),
+          ExternalTypedData::Handle(Z,
+                                    parsed_function->function().KernelData()),
           parsed_function->function().KernelDataProgramOffset(),
           &active_class_)),
       type_translator_(builder_, /*finalize=*/true) {
@@ -1645,8 +1685,8 @@
           for (intptr_t i = 0; i < class_fields.Length(); ++i) {
             class_field ^= class_fields.At(i);
             if (!class_field.is_static()) {
-              TypedData& kernel_data =
-                  TypedData::Handle(Z, class_field.KernelData());
+              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,
@@ -1675,19 +1715,22 @@
       if (function.IsNonImplicitClosureFunction()) {
         type_check_mode = kTypeCheckAllParameters;
       } else if (function.IsImplicitClosureFunction()) {
-        if (!attrs.has_dynamic_invocations) {
+        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 = kTypeCheckForTearOffOfNonDynamicallyInvokedMethod;
+          // 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 (!attrs.has_dynamic_invocations) {
+        } 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
@@ -1754,7 +1797,8 @@
             AbstractType::ZoneHandle(Z, function.ParameterTypeAt(pos)));
         scope_->InsertParameterAt(pos++, result_->setter_value);
 
-        if (is_method && !attrs.has_dynamic_invocations) {
+        if (is_method &&
+            MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
           FieldHelper field_helper(builder_);
           field_helper.ReadUntilIncluding(FieldHelper::kFlags);
 
@@ -1768,6 +1812,47 @@
       }
       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
@@ -1848,7 +1933,8 @@
     for (intptr_t i = 0; i < class_fields.Length(); ++i) {
       class_field ^= class_fields.At(i);
       if (!class_field.is_static()) {
-        TypedData& kernel_data = TypedData::Handle(Z, class_field.KernelData());
+        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,
@@ -2847,7 +2933,7 @@
     variable->set_is_forced_stack();
   }
 
-  const bool needs_covariant_checke_in_method =
+  const bool needs_covariant_check_in_method =
       helper.IsCovariant() ||
       (helper.IsGenericCovariantImpl() && attrs.has_non_this_uses);
 
@@ -2855,8 +2941,8 @@
     case kTypeCheckAllParameters:
       variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
       break;
-    case kTypeCheckForTearOffOfNonDynamicallyInvokedMethod:
-      if (needs_covariant_checke_in_method) {
+    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);
@@ -2865,7 +2951,7 @@
       }
       break;
     case kTypeCheckForNonDynamicallyInvokedMethod:
-      if (needs_covariant_checke_in_method) {
+      if (needs_covariant_check_in_method) {
         variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
       } else {
         // Types of non-covariant parameters are guaranteed to match by
@@ -3500,10 +3586,10 @@
     Tag tag = builder_->ReadTag(&payload);  // read tag.
     switch (tag) {
       case kVariableGet:
-        EvaluateVariableGet();
+        EvaluateVariableGet(/* is_specialized = */ false);
         break;
       case kSpecializedVariableGet:
-        EvaluateVariableGet(payload);
+        EvaluateVariableGet(/* is_specialized = */ true);
         break;
       case kPropertyGet:
         EvaluatePropertyGet();
@@ -3681,29 +3767,21 @@
          !builder_->optimizing();
 }
 
-void StreamingConstantEvaluator::EvaluateVariableGet() {
+void StreamingConstantEvaluator::EvaluateVariableGet(bool is_specialized) {
   // When we see a [VariableGet] the corresponding [VariableDeclaration] must've
   // been executed already. It therefore must have a constant object associated
   // with it.
-  builder_->ReadPosition();  // read position.
-  intptr_t variable_kernel_position =
-      builder_->ReadUInt();          // read kernel position.
-  builder_->ReadUInt();              // read relative variable index.
-  builder_->SkipOptionalDartType();  // read promoted type.
-  LocalVariable* variable = builder_->LookupVariable(variable_kernel_position);
-  ASSERT(variable->IsConst());
-  result_ = variable->ConstValue()->raw();
-}
-
-void StreamingConstantEvaluator::EvaluateVariableGet(uint8_t payload) {
-  // When we see a [VariableGet] the corresponding [VariableDeclaration] must've
-  // been executed already. It therefore must have a constant object associated
-  // with it.
-  builder_->ReadPosition();  // read position.
-  intptr_t variable_kernel_position =
+  const TokenPosition position = builder_->ReadPosition();  // read position.
+  const intptr_t variable_kernel_position =
       builder_->ReadUInt();  // read kernel position.
+  if (!is_specialized) {
+    builder_->ReadUInt();              // read relative variable index.
+    builder_->SkipOptionalDartType();  // read promoted type.
+  }
   LocalVariable* variable = builder_->LookupVariable(variable_kernel_position);
-  ASSERT(variable->IsConst());
+  if (!variable->IsConst()) {
+    H.ReportError(script_, position, "Not a constant expression.");
+  }
   result_ = variable->ConstValue()->raw();
 }
 
@@ -4093,8 +4171,7 @@
 }
 
 void StreamingConstantEvaluator::EvaluateSymbolLiteral() {
-  const Class& owner =
-      Class::Handle(Z, builder_->parsed_function()->function().Owner());
+  const Class& owner = *builder_->active_class()->klass;
   const Library& lib = Library::Handle(Z, owner.library());
   String& symbol_value = H.DartIdentifier(lib, builder_->ReadStringReference());
   const Class& symbol_class =
@@ -5205,7 +5282,8 @@
 StringIndex StreamingFlowGraphBuilder::GetNameFromVariableDeclaration(
     intptr_t kernel_offset,
     const Function& function) {
-  TypedData& kernel_data = TypedData::Handle(Z, function.KernelData());
+  ExternalTypedData& kernel_data =
+      ExternalTypedData::Handle(Z, function.KernelData());
   ASSERT(!kernel_data.IsNull());
 
   // Temporarily go to the variable declaration, read the name.
@@ -5258,8 +5336,13 @@
 
   const Function& function = parsed_function()->function();
 
-  bool is_setter = function.IsImplicitSetterFunction();
-  bool is_method = !function.IsStaticFunction();
+  // Instead of building a dynamic invocation forwarder that checks argument
+  // type and then invokes original setter we simply generate the type check
+  // and inlined field store. Scope builder takes care of setting correct
+  // type check mode in this case.
+  const bool is_setter = function.IsDynamicInvocationForwader() ||
+                         function.IsImplicitSetterFunction();
+  const bool is_method = !function.IsStaticFunction();
   Field& field = Field::ZoneHandle(
       Z, H.LookupFieldByKernelField(field_helper.canonical_name_));
 
@@ -5269,6 +5352,10 @@
 
   Fragment body(normal_entry);
   if (is_setter) {
+    // We only expect to generate a dynamic invocation forwarder if
+    // the value needs type check.
+    ASSERT(!function.IsDynamicInvocationForwader() ||
+           setter_value->needs_type_check());
     if (is_method) {
       body += LoadLocal(scopes()->this_variable);
     }
@@ -5452,7 +5539,8 @@
     for (intptr_t i = 0; i < class_fields.Length(); ++i) {
       class_field ^= class_fields.At(i);
       if (!class_field.is_static()) {
-        TypedData& kernel_data = TypedData::Handle(Z, class_field.KernelData());
+        ExternalTypedData& kernel_data =
+            ExternalTypedData::Handle(Z, class_field.KernelData());
         ASSERT(!kernel_data.IsNull());
         intptr_t field_offset = class_field.kernel_offset();
         AlternativeReadingScope alt(&reader_, &kernel_data, field_offset);
@@ -5686,18 +5774,17 @@
       // Tearoffs of static methods needs to perform arguments checks since
       // static methods they forward to don't do it themselves.
       AlternativeReadingScope _(&reader_);
-      body += BuildArgumentTypeChecks();
+      body += BuildArgumentTypeChecks(kCheckAllTypeParameterBounds);
     } else {
       // Check if parent function was annotated with no-dynamic-invocations.
       const ProcedureAttributesMetadata attrs =
           procedure_attributes_metadata_helper_.GetProcedureAttributes(
               parent.kernel_offset());
-      if (!attrs.has_dynamic_invocations) {
+      if (MethodCanSkipTypeChecksForNonCovariantArguments(parent, attrs)) {
         // If it was then we might need to build some checks in the
         // tear-off.
         AlternativeReadingScope _(&reader_);
-        body +=
-            BuildArgumentTypeChecks(kTypeChecksForNoDynamicInvocationsTearOff);
+        body += BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds);
       }
     }
   }
@@ -5804,7 +5891,7 @@
 
   if (function.NeedsArgumentTypeChecks(I)) {
     AlternativeReadingScope _(&reader_);
-    body += BuildArgumentTypeChecks();
+    body += BuildArgumentTypeChecks(kCheckAllTypeParameterBounds);
   }
 
   function_node_helper.ReadUntilExcluding(
@@ -6053,8 +6140,84 @@
                            B->last_used_block_id_, prologue_info);
 }
 
+bool StreamingFlowGraphBuilder::NeedsDynamicInvocationForwarder(
+    const 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);
+  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);
+
+  SetOffset(function.kernel_offset());
+
+  // Handle setters.
+  if (PeekTag() == kField) {
+    ASSERT(function.IsImplicitSetterFunction());
+    FieldHelper field_helper(this);
+    field_helper.ReadUntilIncluding(FieldHelper::kFlags);
+    return !(field_helper.IsCovariant() ||
+             field_helper.IsGenericCovariantImpl());
+  }
+
+  ReadUntilFunctionNode();
+
+  FunctionNodeHelper function_node_helper(this);
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+  intptr_t num_type_params = ReadListLength();
+
+  for (intptr_t i = 0; i < num_type_params; ++i) {
+    TypeParameterHelper helper(this);
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+    AbstractType& bound = T.BuildType();  // read bound
+    helper.Finish();
+
+    if (!bound.IsTopType() && !helper.IsGenericCovariantImpl()) {
+      return true;
+    }
+  }
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+
+  // Positional.
+  const intptr_t num_positional_params = ReadListLength();
+  for (intptr_t i = 0; i < num_positional_params; ++i) {
+    VariableDeclarationHelper helper(this);
+    helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+    AbstractType& type = T.BuildType();  // read type.
+    helper.SetJustRead(VariableDeclarationHelper::kType);
+    helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
+
+    if (!type.IsTopType() && !helper.IsGenericCovariantImpl() &&
+        !helper.IsCovariant()) {
+      return true;
+    }
+  }
+
+  // Named.
+  const intptr_t num_named_params = ReadListLength();
+  for (intptr_t i = 0; i < num_named_params; ++i) {
+    VariableDeclarationHelper helper(this);
+    helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+    AbstractType& type = T.BuildType();  // read type.
+    helper.SetJustRead(VariableDeclarationHelper::kType);
+    helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
+
+    if (!type.IsTopType() && !helper.IsGenericCovariantImpl() &&
+        !helper.IsCovariant()) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 Fragment StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
-    TypeChecksToBuild mode /*= kDefaultTypeChecks*/) {
+    TypeChecksToBuild mode) {
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
   const Function& dart_function = parsed_function()->function();
@@ -6072,45 +6235,65 @@
     ASSERT(!forwarding_target->IsNull());
   }
 
-  // Type parameters
-  if (mode == kDefaultTypeChecks) {
-    intptr_t num_type_params = ReadListLength();
-    TypeArguments& forwarding_params = TypeArguments::Handle(Z);
-    if (forwarding_target != NULL) {
-      forwarding_params = forwarding_target->type_parameters();
-      ASSERT(forwarding_params.Length() == num_type_params);
-    }
-    TypeParameter& forwarding_param = TypeParameter::Handle(Z);
-    for (intptr_t i = 0; i < num_type_params; ++i) {
-      TypeParameterHelper helper(this);
-      helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
-      String& name = H.DartSymbolObfuscate(helper.name_index_);
-      AbstractType& bound = T.BuildType();                 // read bound
-      helper.Finish();
-
-      if (forwarding_target != NULL) {
-        forwarding_param ^= forwarding_params.TypeAt(i);
-        bound = forwarding_param.bound();
-      }
-
-      if (I->strong() && !bound.IsObjectType() && !bound.IsDynamicType() &&
-          (I->reify_generic_functions() || dart_function.IsFactory())) {
-        TypeParameter& param = TypeParameter::Handle(Z);
-        if (dart_function.IsFactory()) {
-          param ^= TypeArguments::Handle(
-                       Class::Handle(dart_function.Owner()).type_parameters())
-                       .TypeAt(i);
-        } else {
-          param ^=
-              TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
-        }
-        ASSERT(param.IsFinalized());
-        body += CheckTypeArgumentBound(param, bound, name);
-      }
-    }
-    function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+  intptr_t num_type_params = ReadListLength();
+  TypeArguments& forwarding_params = TypeArguments::Handle(Z);
+  if (forwarding_target != NULL) {
+    forwarding_params = forwarding_target->type_parameters();
+    ASSERT(forwarding_params.Length() == num_type_params);
   }
 
+  const bool has_reified_type_arguments =
+      I->strong() && I->reify_generic_functions();
+
+  TypeParameter& forwarding_param = TypeParameter::Handle(Z);
+  for (intptr_t i = 0; i < num_type_params; ++i) {
+    TypeParameterHelper helper(this);
+    helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+    String& name = H.DartSymbolObfuscate(helper.name_index_);
+    AbstractType& bound = T.BuildType();  // read bound
+    helper.Finish();
+
+    if (!has_reified_type_arguments) {
+      continue;
+    }
+
+    if (forwarding_target != NULL) {
+      forwarding_param ^= forwarding_params.TypeAt(i);
+      bound = forwarding_param.bound();
+    }
+
+    if (bound.IsTopType()) {
+      continue;
+    }
+
+    switch (mode) {
+      case kCheckAllTypeParameterBounds:
+        break;
+      case kCheckCovariantTypeParameterBounds:
+        if (!helper.IsGenericCovariantImpl()) {
+          continue;
+        }
+        break;
+      case kCheckNonCovariantTypeParameterBounds:
+        if (helper.IsGenericCovariantImpl()) {
+          continue;
+        }
+        break;
+    }
+
+    TypeParameter& param = TypeParameter::Handle(Z);
+    if (dart_function.IsFactory()) {
+      param ^= TypeArguments::Handle(
+                   Class::Handle(dart_function.Owner()).type_parameters())
+                   .TypeAt(i);
+    } else {
+      param ^= TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
+    }
+    ASSERT(param.IsFinalized());
+    body += CheckTypeArgumentBound(param, bound, name);
+  }
+
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
 
@@ -6164,6 +6347,163 @@
   return body;
 }
 
+Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) {
+  ASSERT(I->strong());
+
+  FunctionNodeHelper function_node_helper(this);
+  function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
+
+  Fragment body;
+
+  const intptr_t num_type_params = ReadListLength();
+  if (num_type_params > 0) {
+    // Skip type arguments.
+    for (intptr_t i = 0; i < num_type_params; ++i) {
+      TypeParameterHelper helper(this);
+      helper.Finish();
+    }
+
+    if (I->reify_generic_functions()) {
+      body += LoadLocal(parsed_function()->function_type_arguments());
+      body += PushArgument();
+      pushed->type_args_len = num_type_params;
+    }
+  }
+  function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+
+  // Push receiver.
+  body += LoadLocal(scopes()->this_variable);
+  body += PushArgument();
+
+  // Push positional parameters.
+  const intptr_t num_positional_params = ReadListLength();
+  for (intptr_t i = 0; i < num_positional_params; ++i) {
+    // ith variable offset.
+    const intptr_t offset = ReaderOffset();
+    SkipVariableDeclaration();
+
+    LocalVariable* param = LookupVariable(offset + data_program_offset_);
+    body += LoadLocal(param);
+    body += PushArgument();
+  }
+
+  // Push named parameters.
+  const intptr_t num_named_params = ReadListLength();
+  pushed->argument_names = Array::New(num_named_params, Heap::kOld);
+  for (intptr_t i = 0; i < num_named_params; ++i) {
+    // ith variable offset.
+    const intptr_t offset = ReaderOffset();
+    SkipVariableDeclaration();
+
+    LocalVariable* param = LookupVariable(offset + data_program_offset_);
+    pushed->argument_names.SetAt(i, param->name());
+    body += LoadLocal(param);
+    body += PushArgument();
+  }
+
+  pushed->argument_count = num_positional_params + num_named_params + 1;
+
+  return body;
+}
+
+FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfDynamicInvocationForwarder() {
+  // The prologue builder needs the default parameter values.
+  SetupDefaultParameterValues();
+
+  const Function& dart_function = parsed_function()->function();
+  TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry();
+  PrologueInfo prologue_info(-1, -1);
+  BlockEntryInstr* instruction_cursor =
+      flow_graph_builder_->BuildPrologue(normal_entry, &prologue_info);
+
+  flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr(
+      *parsed_function(), normal_entry, flow_graph_builder_->osr_id_);
+
+  Fragment body;
+  if (!dart_function.is_native()) {
+    body += flow_graph_builder_->CheckStackOverflowInPrologue(
+        dart_function.token_pos());
+  }
+
+  ASSERT(parsed_function()->node_sequence()->scope()->num_context_variables() ==
+         0);
+
+  FunctionNodeHelper function_node_helper(this);
+  function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+  const intptr_t type_parameters_offset = ReaderOffset();
+  function_node_helper.ReadUntilExcluding(
+      FunctionNodeHelper::kPositionalParameters);
+  intptr_t first_parameter_offset = -1;
+  {
+    AlternativeReadingScope alt(&reader_);
+    intptr_t list_length = ReadListLength();  // read number of positionals.
+    if (list_length > 0) {
+      first_parameter_offset = ReaderOffset() + data_program_offset_;
+    }
+  }
+  // Current position: About to read list of positionals.
+
+  // Should never build a dynamic invocation forwarder for equality
+  // operator.
+  ASSERT(dart_function.name() != Symbols::EqualOperator().raw());
+
+  // Even if the caller did not pass argument vector we would still
+  // call the target with instantiate-to-bounds type arguments.
+  body += BuildDefaultTypeHandling(dart_function, type_parameters_offset);
+
+  String& name = String::Handle(Z, dart_function.name());
+  name = Function::DemangleDynamicInvocationForwarderName(name);
+  const Class& owner = Class::Handle(Z, dart_function.Owner());
+  const Function& target =
+      Function::ZoneHandle(Z, owner.LookupDynamicFunction(name));
+  ASSERT(!target.IsNull());
+
+  // Build argument type checks that complement those that are emitted in the
+  // target.
+  {
+    AlternativeReadingScope alt(&reader_);
+    SetOffset(type_parameters_offset);
+    body += BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds);
+  }
+
+  // Push all arguments and invoke the original method.
+  PushedArguments pushed = {0, 0, Array::ZoneHandle(Z)};
+  {
+    AlternativeReadingScope alt(&reader_);
+    SetOffset(type_parameters_offset);
+    body += PushAllArguments(&pushed);
+  }
+  body += StaticCall(TokenPosition::kNoSource, target, pushed.argument_count,
+                     pushed.argument_names, ICData::kNoRebind, nullptr,
+                     pushed.type_args_len);
+
+  // Some IL optimization passes assume that result of operator []= invocation
+  // is never used, so we drop it and replace with an explicit null constant.
+  if (name.raw() == Symbols::AssignIndexToken().raw()) {
+    body += Drop();
+    body += NullConstant();
+  }
+
+  body += Return(TokenPosition::kNoSource);
+
+  instruction_cursor->LinkTo(body.entry);
+
+  GraphEntryInstr* graph_entry = flow_graph_builder_->graph_entry_;
+  // When compiling for OSR, use a depth first search to find the OSR
+  // entry and make graph entry jump to it instead of normal entry.
+  // Catch entries are always considered reachable, even if they
+  // become unreachable after OSR.
+  if (flow_graph_builder_->osr_id_ != Compiler::kNoOSRDeoptId) {
+    graph_entry->RelinkToOsrEntry(Z,
+                                  flow_graph_builder_->last_used_block_id_ + 1);
+  }
+  return new (Z)
+      FlowGraph(*parsed_function(), graph_entry,
+                flow_graph_builder_->last_used_block_id_, prologue_info);
+}
+
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) {
   // The prologue builder needs the default parameter values.
   SetupDefaultParameterValues();
@@ -6279,17 +6619,25 @@
     body = Fragment(body.entry, non_null_entry);
   }
 
-  // If we run in checked mode or strong mode, we have to check the type of the
-  // passed arguments.
+  // If we run in checked mode or strong mode, we have to check the type of
+  // the passed arguments.
   if (dart_function.NeedsArgumentTypeChecks(I)) {
+    // Check if parent function was annotated with no-dynamic-invocations.
+    const ProcedureAttributesMetadata attrs =
+        procedure_attributes_metadata_helper_.GetProcedureAttributes(
+            dart_function.kernel_offset());
+
     AlternativeReadingScope _(&reader_);
     SetOffset(type_parameters_offset);
-    body += BuildArgumentTypeChecks();
+    body += BuildArgumentTypeChecks(
+        MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
+            ? kCheckCovariantTypeParameterBounds
+            : kCheckAllTypeParameterBounds);
   }
 
   function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody);
 
-  bool has_body = ReadTag() == kSomething;  // read first part of body.
+  const bool has_body = ReadTag() == kSomething;  // read first part of body.
 
   if (dart_function.is_native()) {
     body += flow_graph_builder_->NativeFunctionBody(first_parameter_offset,
@@ -6502,9 +6850,10 @@
                 flow_graph_builder_->last_used_block_id_, prologue_info);
 }
 
-FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) {
+FlowGraph* StreamingFlowGraphBuilder::BuildGraph() {
   ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   const Function& function = parsed_function()->function();
+  const intptr_t kernel_offset = function.kernel_offset();
 
   // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
   // e.g. for type translation.
@@ -6576,6 +6925,13 @@
                  ? BuildGraphOfFieldInitializer()
                  : BuildGraphOfFieldAccessor(scopes()->setter_value);
     }
+    case RawFunction::kDynamicInvocationForwarder:
+      if (PeekTag() == kField) {
+        return BuildGraphOfFieldAccessor(scopes()->setter_value);
+      } else {
+        ReadUntilFunctionNode(parsed_function());
+        return BuildGraphOfDynamicInvocationForwarder();
+      }
     case RawFunction::kMethodExtractor:
       return flow_graph_builder_->BuildGraphOfMethodExtractor(function);
     case RawFunction::kNoSuchMethodDispatcher:
@@ -8253,8 +8609,15 @@
   } else {
     const intptr_t kTypeArgsLen = 0;
     const intptr_t kNumArgsChecked = 1;
+
+    const String* mangled_name = &setter_name;
+    if (!FLAG_precompiled_mode && I->strong() && H.IsRoot(itarget_name)) {
+      mangled_name = &String::ZoneHandle(
+          Z, Function::CreateDynamicInvocationForwarderName(setter_name));
+    }
+
     instructions +=
-        InstanceCall(position, setter_name, Token::kSET, kTypeArgsLen, 2,
+        InstanceCall(position, *mangled_name, Token::kSET, kTypeArgsLen, 2,
                      Array::null_array(), kNumArgsChecked, *interface_target,
                      /* result_type = */ NULL);
   }
@@ -8811,10 +9174,22 @@
                                argument_names, ICData::kNoRebind, &result_type,
                                type_args_len);
   } else {
+    const String* mangled_name = &name;
+    // Do not mangle == or call:
+    //   * operator == takes an Object so its either not checked or checked
+    //     at the entry because the parameter is marked covariant, neither of
+    //     those cases require a dynamic invocation forwarder;
+    //   * we assume that all closures are entered in a checked way.
+    if (!FLAG_precompiled_mode && I->strong() &&
+        (name.raw() != Symbols::EqualOperator().raw()) &&
+        (name.raw() != Symbols::Call().raw()) && H.IsRoot(itarget_name)) {
+      mangled_name = &String::ZoneHandle(
+          Z, Function::CreateDynamicInvocationForwarderName(name));
+    }
     instructions +=
-        InstanceCall(position, name, token_kind, type_args_len, argument_count,
-                     argument_names, checked_argument_count, *interface_target,
-                     &result_type);
+        InstanceCall(position, *mangled_name, token_kind, type_args_len,
+                     argument_count, argument_names, checked_argument_count,
+                     *interface_target, &result_type);
   }
 
   // Drop temporaries preserving result on the top of the stack.
@@ -11311,8 +11686,7 @@
   AlternativeReadingScope alt(&reader_);
   SetOffset(GetOffsetForSourceInfo(index));
   intptr_t size = ReadUInt();  // read uri List<byte> size.
-  return H.DartString(reader_.CopyDataIntoZone(Z, ReaderOffset(), size), size,
-                      Heap::kOld);
+  return H.DartString(reader_.BufferAt(ReaderOffset()), size, Heap::kOld);
 }
 
 String& StreamingFlowGraphBuilder::GetSourceFor(intptr_t index) {
@@ -11320,8 +11694,7 @@
   SetOffset(GetOffsetForSourceInfo(index));
   SkipBytes(ReadUInt());       // skip uri.
   intptr_t size = ReadUInt();  // read source List<byte> size.
-  return H.DartString(reader_.CopyDataIntoZone(Z, ReaderOffset(), size), size,
-                      Heap::kOld);
+  return H.DartString(reader_.BufferAt(ReaderOffset()), size, Heap::kOld);
 }
 
 RawTypedData* StreamingFlowGraphBuilder::GetLineStartsFor(intptr_t index) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 7c2b7b5..5b1c7dd 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -115,6 +115,10 @@
 
   void Finish() { ReadUntilExcluding(kEnd); }
 
+  bool IsGenericCovariantImpl() {
+    return (flags_ & kIsGenericCovariantImpl) != 0;
+  }
+
   TokenPosition position_;
   uint8_t flags_;
   StringIndex name_index_;
@@ -275,6 +279,7 @@
     kStart,  // tag.
     kCanonicalName,
     kSourceUriIndex,
+    kStartPosition,
     kPosition,
     kEndPosition,
     kKind,
@@ -329,6 +334,7 @@
   }
 
   NameIndex canonical_name_;
+  TokenPosition start_position_;
   TokenPosition position_;
   TokenPosition end_position_;
   Kind kind_;
@@ -357,6 +363,7 @@
     kStart,  // tag.
     kCanonicalName,
     kSourceUriIndex,
+    kStartPosition,
     kPosition,
     kEndPosition,
     kFlags,
@@ -390,6 +397,7 @@
   bool IsSynthetic() { return (flags_ & kSynthetic) != 0; }
 
   NameIndex canonical_name_;
+  TokenPosition start_position_;
   TokenPosition position_;
   TokenPosition end_position_;
   uint8_t flags_;
@@ -414,6 +422,7 @@
     kStart,  // tag.
     kCanonicalName,
     kSourceUriIndex,
+    kStartPosition,
     kPosition,
     kEndPosition,
     kFlags,
@@ -458,6 +467,7 @@
   }
 
   NameIndex canonical_name_;
+  TokenPosition start_position_;
   TokenPosition position_;
   TokenPosition end_position_;
   StringIndex name_index_;
@@ -808,8 +818,8 @@
 
     // Only parameters *not* marked as covariant or generic-covariant-impl will
     // be checked. The rest would be checked in the method itself.
-    // Inverse of kTypeCheckOnlyGenericCovariantImplParameters.
-    kTypeCheckForTearOffOfNonDynamicallyInvokedMethod,
+    // Inverse of kTypeCheckForNonDynamicallyInvokedMethod.
+    kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
 
     // No parameters will be checked.
     kTypeCheckForStaticFunction,
@@ -937,8 +947,7 @@
  private:
   bool IsAllowedToEvaluate();
   void EvaluateAsExpression();
-  void EvaluateVariableGet();
-  void EvaluateVariableGet(uint8_t payload);
+  void EvaluateVariableGet(bool is_specialized);
   void EvaluatePropertyGet();
   void EvaluateDirectPropertyGet();
   void EvaluateStaticGet();
@@ -1015,7 +1024,7 @@
   KernelReaderHelper(Zone* zone,
                      TranslationHelper* translation_helper,
                      const Script& script,
-                     const TypedData& data,
+                     const ExternalTypedData& data,
                      intptr_t data_program_offset)
       : zone_(zone),
         translation_helper_(*translation_helper),
@@ -1143,7 +1152,7 @@
   KernelFingerprintHelper(Zone* zone,
                           TranslationHelper* translation_helper,
                           const Script& script,
-                          const TypedData& data,
+                          const ExternalTypedData& data,
                           intptr_t data_program_offset)
       : KernelReaderHelper(zone,
                            translation_helper,
@@ -1192,7 +1201,7 @@
 class StreamingFlowGraphBuilder : public KernelReaderHelper {
  public:
   StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder,
-                            const TypedData& data,
+                            const ExternalTypedData& data,
                             intptr_t data_program_offset)
       : KernelReaderHelper(
             flow_graph_builder->zone_,
@@ -1244,7 +1253,7 @@
   StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
                             const Script& script,
                             Zone* zone,
-                            const TypedData& data,
+                            const ExternalTypedData& data,
                             intptr_t data_program_offset,
                             ActiveClass* active_class)
       : KernelReaderHelper(zone,
@@ -1268,7 +1277,9 @@
 
   virtual ~StreamingFlowGraphBuilder() {}
 
-  FlowGraph* BuildGraph(intptr_t kernel_offset);
+  bool NeedsDynamicInvocationForwarder(const Function& function);
+
+  FlowGraph* BuildGraph();
 
   void ReportUnexpectedTag(const char* variant, Tag tag) override;
 
@@ -1291,8 +1302,6 @@
   // it crosses a procedure node for a concrete forwarding stub.
   void ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub = NULL);
 
-  enum DispatchCategory { Interface, ViaThis, Closure, DynamicDispatch };
-
  private:
   void LoadAndSetupTypeParameters(ActiveClass* active_class,
                                   const Object& set_on,
@@ -1315,6 +1324,7 @@
   Fragment BuildInitializers(const Class& parent_class);
   FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
   FlowGraph* BuildGraphOfFunction(bool constructor);
+  FlowGraph* BuildGraphOfDynamicInvocationForwarder();
   FlowGraph* BuildGraphOfNoSuchMethodForwarder(
       const Function& function,
       bool is_implicit_closure_function,
@@ -1413,15 +1423,23 @@
                         const InferredTypeMetadata* result_type = NULL);
 
   enum TypeChecksToBuild {
-    kDefaultTypeChecks,
-    kTypeChecksForNoDynamicInvocationsTearOff
+    kCheckAllTypeParameterBounds,
+    kCheckNonCovariantTypeParameterBounds,
+    kCheckCovariantTypeParameterBounds,
   };
 
   // Does not move the cursor.
   Fragment BuildDefaultTypeHandling(const Function& function,
                                     intptr_t type_parameters_offset);
 
-  Fragment BuildArgumentTypeChecks(TypeChecksToBuild mode = kDefaultTypeChecks);
+  struct PushedArguments {
+    intptr_t type_args_len;
+    intptr_t argument_count;
+    Array& argument_names;
+  };
+  Fragment PushAllArguments(PushedArguments* pushed);
+
+  Fragment BuildArgumentTypeChecks(TypeChecksToBuild mode);
 
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
@@ -1657,7 +1675,7 @@
   }
 
   AlternativeReadingScope(Reader* reader,
-                          const TypedData* new_typed_data,
+                          const ExternalTypedData* new_typed_data,
                           intptr_t new_position)
       : reader_(reader),
         saved_size_(reader_->size()),
@@ -1690,7 +1708,7 @@
   Reader* reader_;
   intptr_t saved_size_;
   const uint8_t* saved_raw_buffer_;
-  const TypedData* saved_typed_data_;
+  const ExternalTypedData* saved_typed_data_;
   intptr_t saved_offset_;
 };
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 4d9b1c6..1bb584e 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -162,18 +162,18 @@
       isolate_(thread->isolate()),
       allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld),
       string_offsets_(TypedData::Handle(Z)),
-      string_data_(TypedData::Handle(Z)),
+      string_data_(ExternalTypedData::Handle(Z)),
       canonical_names_(TypedData::Handle(Z)),
-      metadata_payloads_(TypedData::Handle(Z)),
-      metadata_mappings_(TypedData::Handle(Z)),
+      metadata_payloads_(ExternalTypedData::Handle(Z)),
+      metadata_mappings_(ExternalTypedData::Handle(Z)),
       constants_(Array::Handle(Z)) {}
 
 void TranslationHelper::Reset() {
   string_offsets_ = TypedData::null();
-  string_data_ = TypedData::null();
+  string_data_ = ExternalTypedData::null();
   canonical_names_ = TypedData::null();
-  metadata_payloads_ = TypedData::null();
-  metadata_mappings_ = TypedData::null();
+  metadata_payloads_ = ExternalTypedData::null();
+  metadata_mappings_ = ExternalTypedData::null();
   constants_ = Array::null();
 }
 
@@ -193,10 +193,10 @@
 void TranslationHelper::InitFromKernelProgramInfo(
     const KernelProgramInfo& info) {
   SetStringOffsets(TypedData::Handle(Z, info.string_offsets()));
-  SetStringData(TypedData::Handle(Z, info.string_data()));
+  SetStringData(ExternalTypedData::Handle(Z, info.string_data()));
   SetCanonicalNames(TypedData::Handle(Z, info.canonical_names()));
-  SetMetadataPayloads(TypedData::Handle(Z, info.metadata_payloads()));
-  SetMetadataMappings(TypedData::Handle(Z, info.metadata_mappings()));
+  SetMetadataPayloads(ExternalTypedData::Handle(Z, info.metadata_payloads()));
+  SetMetadataMappings(ExternalTypedData::Handle(Z, info.metadata_mappings()));
   SetConstants(Array::Handle(Z, info.constants()));
 }
 
@@ -205,7 +205,7 @@
   string_offsets_ = string_offsets.raw();
 }
 
-void TranslationHelper::SetStringData(const TypedData& string_data) {
+void TranslationHelper::SetStringData(const ExternalTypedData& string_data) {
   ASSERT(string_data_.IsNull());
   string_data_ = string_data.raw();
 }
@@ -216,13 +216,13 @@
 }
 
 void TranslationHelper::SetMetadataPayloads(
-    const TypedData& metadata_payloads) {
+    const ExternalTypedData& metadata_payloads) {
   ASSERT(metadata_payloads_.IsNull());
   metadata_payloads_ = metadata_payloads.raw();
 }
 
 void TranslationHelper::SetMetadataMappings(
-    const TypedData& metadata_mappings) {
+    const ExternalTypedData& metadata_mappings) {
   ASSERT(metadata_mappings_.IsNull());
   metadata_mappings_ = metadata_mappings.raw();
 }
@@ -253,7 +253,7 @@
   // expression will try to return the address that is one past the backing
   // store of the string_data_ table.  Though this is safe in C++ as long as the
   // address is not dereferenced, it will trigger the assert in
-  // TypedData::DataAddr.
+  // ExternalTypedData::DataAddr.
   ASSERT(Thread::Current()->no_safepoint_scope_depth() > 0);
   return reinterpret_cast<uint8_t*>(string_data_.DataAddr(0)) +
          StringOffset(string_index);
@@ -2061,6 +2061,28 @@
   }
 }
 
+bool FlowGraphBuilder::NeedsDynamicInvocationForwarder(
+    const Function& function) {
+  ASSERT(Isolate::Current()->strong());
+
+  Thread* thread = Thread::Current();
+  Zone* zone_ = thread->zone();
+
+  TranslationHelper helper(thread);
+  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, Z, ExternalTypedData::Handle(Z, function.KernelData()),
+      function.KernelDataProgramOffset(), &active_class);
+
+  return streaming_flow_graph_builder.NeedsDynamicInvocationForwarder(function);
+}
+
 FlowGraph* FlowGraphBuilder::BuildGraph() {
   const Function& function = parsed_function_->function();
 
@@ -2077,11 +2099,10 @@
 #endif
 
   StreamingFlowGraphBuilder streaming_flow_graph_builder(
-      this, TypedData::Handle(Z, function.KernelData()),
+      this, ExternalTypedData::Handle(Z, function.KernelData()),
       function.KernelDataProgramOffset());
   streaming_flow_graph_builder_ = &streaming_flow_graph_builder;
-  FlowGraph* result =
-      streaming_flow_graph_builder_->BuildGraph(function.kernel_offset());
+  FlowGraph* result = streaming_flow_graph_builder_->BuildGraph();
   streaming_flow_graph_builder_ = NULL;
   return result;
 }
@@ -2835,7 +2856,7 @@
 
     StreamingFlowGraphBuilder streaming_flow_graph_builder(
         &helper, Script::Handle(Z, metadata_field.Script()), Z,
-        TypedData::Handle(Z, metadata_field.KernelData()),
+        ExternalTypedData::Handle(Z, metadata_field.KernelData()),
         metadata_field.KernelDataProgramOffset(), &active_class);
     return streaming_flow_graph_builder.EvaluateMetadata(
         metadata_field.kernel_offset());
@@ -2859,7 +2880,7 @@
 
     StreamingFlowGraphBuilder streaming_flow_graph_builder(
         &helper, Script::Handle(Z, function.script()), Z,
-        TypedData::Handle(Z, function.KernelData()),
+        ExternalTypedData::Handle(Z, function.KernelData()),
         function.KernelDataProgramOffset(), /* active_class = */ NULL);
     return streaming_flow_graph_builder.BuildParameterDescriptor(
         function.kernel_offset());
@@ -2909,7 +2930,7 @@
 }
 
 static void ProcessTokenPositionsEntry(
-    const TypedData& kernel_data,
+    const ExternalTypedData& kernel_data,
     const Script& script,
     const Script& entry_script,
     intptr_t kernel_offset,
@@ -2945,7 +2966,7 @@
   Library& lib = Library::Handle(Z);
   Object& entry = Object::Handle(Z);
   Script& entry_script = Script::Handle(Z);
-  TypedData& data = TypedData::Handle(Z);
+  ExternalTypedData& data = ExternalTypedData::Handle(Z);
 
   auto& temp_array = Array::Handle(Z);
   auto& temp_field = Field::Handle(Z);
@@ -2955,7 +2976,7 @@
     DictionaryIterator it(lib);
     while (it.HasNext()) {
       entry = it.GetNext();
-      data = TypedData::null();
+      data = ExternalTypedData::null();
       if (entry.IsClass()) {
         const Class& klass = Class::Cast(entry);
         if (klass.script() == interesting_script.raw()) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 1559f4f..9bb30e5 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -217,6 +217,7 @@
            function_kind == RawFunction::kGetterFunction ||
            function_kind == RawFunction::kSetterFunction ||
            function_kind == RawFunction::kMethodExtractor ||
+           function_kind == RawFunction::kDynamicInvocationForwarder ||
            member->IsFactory();
   }
 
@@ -327,17 +328,17 @@
   const TypedData& string_offsets() { return string_offsets_; }
   void SetStringOffsets(const TypedData& string_offsets);
 
-  const TypedData& string_data() { return string_data_; }
-  void SetStringData(const TypedData& string_data);
+  const ExternalTypedData& string_data() { return string_data_; }
+  void SetStringData(const ExternalTypedData& string_data);
 
   const TypedData& canonical_names() { return canonical_names_; }
   void SetCanonicalNames(const TypedData& canonical_names);
 
-  const TypedData& metadata_payloads() { return metadata_payloads_; }
-  void SetMetadataPayloads(const TypedData& metadata_payloads);
+  const ExternalTypedData& metadata_payloads() { return metadata_payloads_; }
+  void SetMetadataPayloads(const ExternalTypedData& metadata_payloads);
 
-  const TypedData& metadata_mappings() { return metadata_mappings_; }
-  void SetMetadataMappings(const TypedData& metadata_mappings);
+  const ExternalTypedData& metadata_mappings() { return metadata_mappings_; }
+  void SetMetadataMappings(const ExternalTypedData& metadata_mappings);
 
   const Array& constants() { return constants_; }
   void SetConstants(const Array& constants);
@@ -466,10 +467,10 @@
   Heap::Space allocation_space_;
 
   TypedData& string_offsets_;
-  TypedData& string_data_;
+  ExternalTypedData& string_data_;
   TypedData& canonical_names_;
-  TypedData& metadata_payloads_;
-  TypedData& metadata_mappings_;
+  ExternalTypedData& metadata_payloads_;
+  ExternalTypedData& metadata_mappings_;
   Array& constants_;
 };
 
@@ -705,6 +706,12 @@
 
   FlowGraph* BuildGraph();
 
+  // Returns true if the given function needs dynamic invocation forwarder:
+  // that is if any of the arguments require checking on the dynamic
+  // call-site: if function has no parameters or has only covariant parameters
+  // as such function already checks all of its parameters.
+  static bool NeedsDynamicInvocationForwarder(const Function& function);
+
  private:
   BlockEntryInstr* BuildPrologue(TargetEntryInstr* normal_entry,
                                  PrologueInfo* prologue_info);
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index afedf3b..ddce593 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -91,7 +91,7 @@
   // These offsets are embedded in precompiled instructions. We need simarm
   // (compiler) and arm (runtime) to agree.
   CHECK_OFFSET(Thread::stack_limit_offset(), 4);
-  CHECK_OFFSET(Thread::object_null_offset(), 48);
+  CHECK_OFFSET(Thread::object_null_offset(), 56);
   CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 14);
   CHECK_OFFSET(Isolate::object_store_offset(), 28);
   NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 168));
@@ -100,7 +100,7 @@
   // These offsets are embedded in precompiled instructions. We need simarm64
   // (compiler) and arm64 (runtime) to agree.
   CHECK_OFFSET(Thread::stack_limit_offset(), 8);
-  CHECK_OFFSET(Thread::object_null_offset(), 96);
+  CHECK_OFFSET(Thread::object_null_offset(), 104);
   CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 26);
   CHECK_OFFSET(Isolate::object_store_offset(), 56);
   NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 288));
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 761e198..2ccdeca 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5384,8 +5384,12 @@
   CHECK_CALLBACK_STATE(T);
   CHECK_COMPILATION_ALLOWED(I);
 
-  kernel::Program* program = kernel::Program::ReadFromBuffer(
-      buffer, buffer_size, /*take_buffer_ownership=*/false);
+  const char* error = nullptr;
+  kernel::Program* program =
+      kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
+  if (program == nullptr) {
+    return Api::NewError("Can't load Kernel binary: %s.", error);
+  }
   const Object& tmp = kernel::KernelLoader::LoadEntireProgram(program);
   delete program;
 
@@ -5681,8 +5685,12 @@
   CHECK_CALLBACK_STATE(T);
   CHECK_COMPILATION_ALLOWED(I);
 
-  kernel::Program* program = kernel::Program::ReadFromBuffer(
-      buffer, buffer_size, false /* take_buffer_ownership */);
+  const char* error = nullptr;
+  kernel::Program* program =
+      kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
+  if (program == nullptr) {
+    return Api::NewError("Can't load Kernel binary: %s.", error);
+  }
   const Object& result =
       kernel::KernelLoader::LoadEntireProgram(program, false);
   delete program;
@@ -6067,7 +6075,9 @@
                             int source_files_count,
                             Dart_SourceFile sources[],
                             bool incremental_compile,
-                            const char* package_config) {
+                            const char* package_config,
+                            const char* multiroot_filepaths,
+                            const char* multiroot_scheme) {
   Dart_KernelCompilationResult result;
 #if defined(DART_PRECOMPILED_RUNTIME)
   result.status = Dart_KernelCompilationStatus_Unknown;
@@ -6075,7 +6085,8 @@
 #else
   result = KernelIsolate::CompileToKernel(
       script_uri, platform_kernel, platform_kernel_size, source_files_count,
-      sources, incremental_compile, package_config);
+      sources, incremental_compile, package_config, multiroot_filepaths,
+      multiroot_scheme);
   if (result.status == Dart_KernelCompilationStatus_Ok) {
     if (KernelIsolate::AcceptCompilation().status !=
         Dart_KernelCompilationStatus_Ok) {
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 8b7fe6b..ef393a7 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -259,7 +259,7 @@
 
 TEST_CASE(DartAPI_StackOverflowStackTraceInfoBraceFunction1) {
   int line = 2;
-  int col = FLAG_use_dart_frontend ? 10 : 3;
+  int col = 3;
   VerifyStackOverflowStackTraceInfo(
       "class C {\n"
       "  static foo(int i) { foo(i); }\n"
@@ -270,7 +270,7 @@
 
 TEST_CASE(DartAPI_StackOverflowStackTraceInfoBraceFunction2) {
   int line = 2;
-  int col = FLAG_use_dart_frontend ? 10 : 3;
+  int col = 3;
   VerifyStackOverflowStackTraceInfo(
       "class C {\n"
       "  static foo(int i, int j) {\n"
@@ -283,7 +283,7 @@
 
 TEST_CASE(DartAPI_StackOverflowStackTraceInfoArrowFunction) {
   int line = 2;
-  int col = FLAG_use_dart_frontend ? 10 : 3;
+  int col = 3;
   VerifyStackOverflowStackTraceInfo(
       "class C {\n"
       "  static foo(int i) => foo(i);\n"
@@ -6785,6 +6785,77 @@
   EXPECT_VALID(result);
 }
 
+TEST_CASE(DartAPI_Multiroot_Valid) {
+  const char* kScriptChars =
+      "import 'lib.dart';\n"
+      "void main() {}\n";
+  const char* kLibraryChars = "library lib.dart;\n";
+  Dart_Handle result;
+  Dart_Handle lib;
+
+  // This tests only makes sense when dart frontend is used
+  if (!FLAG_use_dart_frontend) {
+    return;
+  }
+
+  Dart_SourceFile sourcefiles[] = {
+      {"file:///bar/main.dart", kScriptChars},
+      {"file:///baz/lib.dart", kLibraryChars},
+      {"file:///bar/.packages", "untitled:/"},
+  };
+  int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
+  lib = TestCase::LoadTestScriptWithDFE(
+      sourcefiles_count, sourcefiles, NULL, /* finalize= */ true,
+      /* incrementally= */ true, /* allow_compile_errors= */ false,
+      "foo:///main.dart",
+      /* multiroot_filepaths= */ "/bar,/baz",
+      /* multiroot_scheme= */ "foo");
+  EXPECT_VALID(lib);
+  Library& lib_obj = Library::Handle();
+  lib_obj ^= Api::UnwrapHandle(lib);
+  EXPECT_STREQ("foo:///main.dart", String::Handle(lib_obj.url()).ToCString());
+  const Array& lib_scripts = Array::Handle(lib_obj.LoadedScripts());
+  Script& script = Script::Handle();
+  String& uri = String::Handle();
+  for (intptr_t i = 0; i < lib_scripts.Length(); i++) {
+    script ^= lib_scripts.At(i);
+    uri = script.url();
+    const char* uri_str = uri.ToCString();
+    EXPECT(strstr(uri_str, "foo:///") == uri_str);
+  }
+  result = Dart_FinalizeLoading(false);
+  EXPECT_VALID(result);
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+}
+
+TEST_CASE(DartAPI_Multiroot_FailWhenUriIsWrong) {
+  const char* kScriptChars =
+      "import 'lib.dart';\n"
+      "void main() {}\n";
+  const char* kLibraryChars = "library lib.dart;\n";
+  Dart_Handle lib;
+
+  // This tests only makes sense when dart frontend is used
+  if (!FLAG_use_dart_frontend) {
+    return;
+  }
+
+  Dart_SourceFile sourcefiles[] = {
+      {"file:///bar/main.dart", kScriptChars},
+      {"file:///baz/lib.dart", kLibraryChars},
+      {"file:///bar/.packages", "untitled:/"},
+  };
+  int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
+  lib = TestCase::LoadTestScriptWithDFE(
+      sourcefiles_count, sourcefiles, NULL, /* finalize= */ true,
+      /* incrementally= */ true, /* allow_compile_errors= */ false,
+      "foo1:///main.dart",
+      /* multiroot_filepaths= */ "/bar,/baz",
+      /* multiroot_scheme= */ "foo");
+  EXPECT_ERROR(lib, "Compilation failed foo1");
+}
+
 void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
   // Gets a send port message.
   EXPECT_NOTNULL(message);
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index aeb24be..790ff67 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -761,6 +761,13 @@
     // Always return dynamic type (this is only a marker).
     return &dynamic_type_marker;
   }
+  if (object_id == kIntTypeArguments || object_id == kDoubleTypeArguments ||
+      object_id == kStringTypeArguments ||
+      object_id == kStringDynamicTypeArguments ||
+      object_id == kStringStringTypeArguments) {
+    return &type_arguments_marker;
+  }
+
   intptr_t index = object_id - kMaxPredefinedObjectIds;
   ASSERT((0 <= index) && (index < backward_references_.length()));
   ASSERT(backward_references_[index]->reference() != NULL);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 1ab87c0..5c97ead 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -414,7 +414,11 @@
 
   // Share the immutable descriptor when possible by canonicalizing it.
   descriptor.MakeImmutable();
-  descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL);
+  const char* error_str = NULL;
+  descriptor ^= descriptor.CheckAndCanonicalize(thread, &error_str);
+  if (error_str != NULL) {
+    FATAL1("Failed to canonicalize: %s", error_str);
+  }
   ASSERT(!descriptor.IsNull());
   return descriptor.raw();
 }
@@ -459,7 +463,11 @@
   // Share the immutable descriptor when possible by canonicalizing it.
   descriptor.MakeImmutable();
   if (canonicalize) {
-    descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL);
+    const char* error_str = NULL;
+    descriptor ^= descriptor.CheckAndCanonicalize(thread, &error_str);
+    if (error_str != NULL) {
+      FATAL1("Failed to canonicalize: %s", error_str);
+    }
   }
   ASSERT(!descriptor.IsNull());
   return descriptor.raw();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 7097f5a..974c447 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -687,6 +687,13 @@
     isolate_flags_ = IsServiceIsolateBit::update(value, isolate_flags_);
   }
 
+  bool is_kernel_isolate() const {
+    return IsKernelIsolateBit::decode(isolate_flags_);
+  }
+  void set_is_kernel_isolate(bool value) {
+    isolate_flags_ = IsKernelIsolateBit::update(value, isolate_flags_);
+  }
+
   bool should_load_vmservice() const {
     return ShouldLoadVmServiceBit::decode(isolate_flags_);
   }
@@ -844,6 +851,7 @@
   V(ErrorsFatal)                                                               \
   V(IsRunnable)                                                                \
   V(IsServiceIsolate)                                                          \
+  V(IsKernelIsolate)                                                           \
   V(CompilationAllowed)                                                        \
   V(AllClassesFinalized)                                                       \
   V(RemappingCids)                                                             \
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 6f7c825..ff73002 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -525,10 +525,6 @@
   ~ResourceHolder() { delete (resource_); }
 };
 
-static void ReleaseFetchedBytes(uint8_t* buffer) {
-  free(buffer);
-}
-
 static void AcceptCompilation(Thread* thread) {
   TransitionVMToNative transition(thread);
   if (KernelIsolate::AcceptCompilation().status !=
@@ -592,16 +588,19 @@
     // compiled, so ReadKernelFromFile returns NULL.
     kernel_program.set(kernel::Program::ReadFromFile(root_script_url));
     if (kernel_program.get() == NULL) {
-      TransitionVMToNative transition(thread);
       Dart_SourceFile* modified_scripts = NULL;
       intptr_t modified_scripts_count = 0;
 
       FindModifiedSources(thread, force_reload, &modified_scripts,
                           &modified_scripts_count);
 
-      Dart_KernelCompilationResult retval = KernelIsolate::CompileToKernel(
-          root_lib_url.ToCString(), NULL, 0, modified_scripts_count,
-          modified_scripts, true, NULL);
+      Dart_KernelCompilationResult retval;
+      {
+        TransitionVMToNative transition(thread);
+        retval = KernelIsolate::CompileToKernel(root_lib_url.ToCString(), NULL,
+                                                0, modified_scripts_count,
+                                                modified_scripts, true, NULL);
+      }
 
       if (retval.status != Dart_KernelCompilationStatus_Ok) {
         TIR_Print("---- LOAD FAILED, ABORTING RELOAD\n");
@@ -614,11 +613,10 @@
         return;
       }
       did_kernel_compilation = true;
-      kernel_program.set(kernel::Program::ReadFromBuffer(
-          retval.kernel, retval.kernel_size, true));
+      kernel_program.set(
+          kernel::Program::ReadFromBuffer(retval.kernel, retval.kernel_size));
     }
 
-    kernel_program.get()->set_release_buffer_callback(ReleaseFetchedBytes);
     kernel::KernelLoader::FindModifiedLibraries(kernel_program.get(), I,
                                                 modified_libs_, force_reload);
   } else {
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 7b7ac73..4fe6d44 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -19,11 +19,11 @@
   TranslationHelper translation_helper(Thread::Current());
   translation_helper.InitFromScript(script);
 
-  StreamingFlowGraphBuilder builder(&translation_helper,
-                                    Script::Handle(zone, field.Script()), zone,
-                                    TypedData::Handle(zone, field.KernelData()),
-                                    field.KernelDataProgramOffset(),
-                                    /* active_class = */ NULL);
+  StreamingFlowGraphBuilder builder(
+      &translation_helper, Script::Handle(zone, field.Script()), zone,
+      ExternalTypedData::Handle(zone, field.KernelData()),
+      field.KernelDataProgramOffset(),
+      /* active_class = */ NULL);
   builder.SetOffset(field.kernel_offset());
   kernel::FieldHelper field_helper(&builder);
   field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
@@ -96,9 +96,10 @@
   TranslationHelper translation_helper(thread);
   translation_helper.InitFromScript(script);
 
-  KernelFingerprintHelper helper(zone, &translation_helper, script,
-                                 TypedData::Handle(zone, field.KernelData()),
-                                 field.KernelDataProgramOffset());
+  KernelFingerprintHelper helper(
+      zone, &translation_helper, script,
+      ExternalTypedData::Handle(zone, field.KernelData()),
+      field.KernelDataProgramOffset());
   helper.SetOffset(field.kernel_offset());
   return helper.CalculateFieldFingerprint();
 }
@@ -112,9 +113,10 @@
   TranslationHelper translation_helper(thread);
   translation_helper.InitFromScript(script);
 
-  KernelFingerprintHelper helper(zone, &translation_helper, script,
-                                 TypedData::Handle(zone, func.KernelData()),
-                                 func.KernelDataProgramOffset());
+  KernelFingerprintHelper helper(
+      zone, &translation_helper, script,
+      ExternalTypedData::Handle(zone, func.KernelData()),
+      func.KernelDataProgramOffset());
   helper.SetOffset(func.kernel_offset());
   return helper.CalculateFunctionFingerprint();
 }
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index d297dda..5bcf919 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -55,36 +55,17 @@
 
 enum LogicalOperator { kAnd, kOr };
 
-typedef void (*Dart_ReleaseBufferCallback)(uint8_t* buffer);
-
 class Program {
  public:
-  ~Program() {
-    if (buffer_ownership_ && kernel_data_ != NULL) {
-      ASSERT(release_callback != NULL);
-      release_callback(const_cast<uint8_t*>(kernel_data_));
-    }
-    kernel_data_ = NULL;
-  }
-
-  /**
-   * Read a kernel Program from the given Reader. Note the returned Program
-   * can potentially contain several "sub programs", though the library count
-   * etc will reference the last "sub program" only.
-   * @param reader
-   * @param take_buffer_ownership if set to true, the release callback will be
-   * called upon Program destruction, i.e. the data from reader will likely be
-   * released. If set to false the data will not be released. This is for
-   * instance useful for creating Programs out of "sub programs" where each
-   * "sub program" should not try to release the buffer.
-   * @return
-   */
-  static Program* ReadFrom(Reader* reader, bool take_buffer_ownership = false);
+  // Read a kernel Program from the given Reader. Note the returned Program
+  // can potentially contain several "sub programs", though the library count
+  // etc will reference the last "sub program" only.
+  static Program* ReadFrom(Reader* reader, const char** error = nullptr);
 
   static Program* ReadFromFile(const char* script_uri);
   static Program* ReadFromBuffer(const uint8_t* buffer,
                                  intptr_t buffer_length,
-                                 bool take_buffer_ownership = false);
+                                 const char** error = nullptr);
 
   bool is_single_program() { return single_program_; }
   NameIndex main_method() { return main_method_reference_; }
@@ -101,16 +82,11 @@
   const uint8_t* kernel_data() { return kernel_data_; }
   intptr_t kernel_data_size() { return kernel_data_size_; }
   intptr_t library_count() { return library_count_; }
-  void set_release_buffer_callback(Dart_ReleaseBufferCallback callback) {
-    release_callback = callback;
-  }
 
  private:
-  Program()
-      : kernel_data_(NULL), kernel_data_size_(-1), release_callback(NULL) {}
+  Program() : kernel_data_(NULL), kernel_data_size_(-1) {}
 
   bool single_program_;
-  bool buffer_ownership_;
   NameIndex main_method_reference_;  // Procedure.
   intptr_t library_count_;
 
@@ -134,7 +110,6 @@
 
   const uint8_t* kernel_data_;
   intptr_t kernel_data_size_;
-  Dart_ReleaseBufferCallback release_callback;
 
   DISALLOW_COPY_AND_ASSIGN(Program);
 };
@@ -208,7 +183,6 @@
 
   const dart::TypedData& line_starts_data_;
   KernelLineStartsHelper* helper_;
-  Dart_ReleaseBufferCallback release_callback;
 
   DISALLOW_COPY_AND_ASSIGN(KernelLineStartsReader);
 };
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 9b97137..17128ce 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -29,20 +29,54 @@
   return "Unknown";
 }
 
-Program* Program::ReadFrom(Reader* reader, bool take_buffer_ownership) {
+const char* kKernelInvalidFilesize =
+    "File size is too small to a valid kernel file";
+const char* kKernelInvalidMagicIdentifier = "Invalid magic identifier";
+const char* kKernelInvalidBinaryFormatVersion =
+    "Invalid kernel binary format version";
+const char* kKernelInvalidSizeIndicated =
+    "Invalid kernel binary: Indicated size is invalid";
+
+Program* Program::ReadFrom(Reader* reader, const char** error) {
+  if (reader->size() < 59) {
+    // A kernel file currently contains at least the following:
+    //   * Magic number (32)
+    //   * Kernel version (32)
+    //   * Length of source map (32)
+    //   * Length of canonical name table (8)
+    //   * Metadata length (32)
+    //   * Length of string table (8)
+    //   * Length of constant table (8)
+    //   * Component index (10 * 32)
+    //
+    // so is at least 59 bytes.
+    // (Technically it will also contain an empty entry in both source map and
+    // string table, taking up another 8 bytes.)
+    if (error != nullptr) {
+      *error = kKernelInvalidFilesize;
+    }
+    return nullptr;
+  }
+
   uint32_t magic = reader->ReadUInt32();
-  if (magic != kMagicProgramFile) FATAL("Invalid magic identifier");
+  if (magic != kMagicProgramFile) {
+    if (error != nullptr) {
+      *error = kKernelInvalidMagicIdentifier;
+    }
+    return nullptr;
+  }
 
   uint32_t formatVersion = reader->ReadUInt32();
   if (formatVersion != kBinaryFormatVersion) {
-    FATAL2("Invalid kernel binary format version (found %u, expected %u)",
-           formatVersion, kBinaryFormatVersion);
+    if (error != nullptr) {
+      *error = kKernelInvalidBinaryFormatVersion;
+    }
+    return nullptr;
   }
 
   Program* program = new Program();
   program->kernel_data_ = reader->buffer();
   program->kernel_data_size_ = reader->size();
-  program->buffer_ownership_ = take_buffer_ownership;
 
   // Dill files can be concatenated (e.g. cat a.dill b.dill > c.dill). Find out
   // if this dill contains more than one program.
@@ -52,7 +86,11 @@
     intptr_t size = reader->ReadUInt32();
     intptr_t start = reader->offset() - size;
     if (start < 0) {
-      FATAL("Invalid kernel binary: Indicated size is invalid.");
+      if (error != nullptr) {
+        *error = kKernelInvalidSizeIndicated;
+      }
+      delete program;
+      return nullptr;
     }
     ++subprogram_count;
     if (subprogram_count > 1) break;
@@ -118,9 +156,9 @@
 
 Program* Program::ReadFromBuffer(const uint8_t* buffer,
                                  intptr_t buffer_length,
-                                 bool take_buffer_ownership) {
+                                 const char** error) {
   kernel::Reader reader(buffer, buffer_length);
-  return kernel::Program::ReadFrom(&reader, take_buffer_ownership);
+  return kernel::Program::ReadFrom(&reader, error);
 }
 
 }  // namespace kernel
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 70a967b..68f3715 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,7 +20,7 @@
 // package:kernel/binary.md.
 
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 7;
+static const uint32_t kBinaryFormatVersion = 8;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -170,7 +170,7 @@
         size_(size),
         offset_(0) {}
 
-  explicit Reader(const TypedData& typed_data)
+  explicit Reader(const ExternalTypedData& typed_data)
       : thread_(Thread::Current()),
         raw_buffer_(NULL),
         typed_data_(&typed_data),
@@ -330,26 +330,23 @@
   intptr_t size() const { return size_; }
   void set_size(intptr_t size) { size_ = size; }
 
-  const TypedData* typed_data() const { return typed_data_; }
-  void set_typed_data(const TypedData* typed_data) { typed_data_ = typed_data; }
+  const ExternalTypedData* typed_data() const { return typed_data_; }
+  void set_typed_data(const ExternalTypedData* typed_data) {
+    typed_data_ = typed_data;
+  }
 
   const uint8_t* raw_buffer() const { return raw_buffer_; }
   void set_raw_buffer(const uint8_t* raw_buffer) { raw_buffer_ = raw_buffer; }
 
-  void CopyDataToVMHeap(const TypedData& typed_data,
-                        intptr_t offset,
-                        intptr_t size) {
-    NoSafepointScope no_safepoint(thread_);
-    memmove(typed_data.DataAddr(0), buffer() + offset, size);
+  RawExternalTypedData* ExternalDataFromTo(intptr_t start, intptr_t end) {
+    return ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
+                                  const_cast<uint8_t*>(buffer() + start),
+                                  end - start, Heap::kOld);
   }
 
-  uint8_t* CopyDataIntoZone(Zone* zone, intptr_t offset, intptr_t length) {
-    uint8_t* buffer_ = zone->Alloc<uint8_t>(length);
-    {
-      NoSafepointScope no_safepoint(thread_);
-      memmove(buffer_, buffer() + offset, length);
-    }
-    return buffer_;
+  const uint8_t* BufferAt(intptr_t offset) {
+    ASSERT((offset >= 0) && (offset < size_));
+    return &buffer()[offset];
   }
 
  private:
@@ -363,7 +360,7 @@
 
   Thread* thread_;
   const uint8_t* raw_buffer_;
-  const TypedData* typed_data_;
+  const ExternalTypedData* typed_data_;
   intptr_t size_;
   intptr_t offset_;
   TokenPosition max_position_;
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index b5efb44..a841629 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -38,6 +38,16 @@
             suppress_fe_warnings,
             false,
             "Suppress warnings from the FE.");
+DEFINE_FLAG(charp,
+            kernel_multiroot_filepaths,
+            NULL,
+            "Comma-separated list of file paths that should be treated as roots"
+            " by frontend compiler.");
+DEFINE_FLAG(charp,
+            kernel_multiroot_scheme,
+            NULL,
+            "URI scheme that replaces filepaths prefixes specified"
+            " by kernel_multiroot_filepaths option");
 
 const char* KernelIsolate::kName = DART_KERNEL_ISOLATE_NAME;
 
@@ -265,6 +275,9 @@
 
 void KernelIsolate::SetKernelIsolate(Isolate* isolate) {
   MonitorLocker ml(monitor_);
+  if (isolate != nullptr) {
+    isolate->set_is_kernel_isolate(true);
+  }
   isolate_ = isolate;
 }
 
@@ -478,7 +491,9 @@
       int source_files_count,
       Dart_SourceFile source_files[],
       bool incremental_compile,
-      const char* package_config) {
+      const char* package_config,
+      const char* multiroot_filepaths,
+      const char* multiroot_scheme) {
     // Build the [null, send_port, script_uri, platform_kernel,
     // incremental_compile, isolate_id, [files]] message for the Kernel isolate.
     // tag is used to specify which operation the frontend should perform.
@@ -560,6 +575,33 @@
       package_config_uri.type = Dart_CObject_kNull;
     }
 
+    Dart_CObject multiroot_filepaths_object;
+    {
+      const char* filepaths = multiroot_filepaths != NULL
+                                  ? multiroot_filepaths
+                                  : FLAG_kernel_multiroot_filepaths;
+      if (filepaths != NULL) {
+        multiroot_filepaths_object.type = Dart_CObject_kString;
+        multiroot_filepaths_object.value.as_string =
+            const_cast<char*>(filepaths);
+      } else {
+        multiroot_filepaths_object.type = Dart_CObject_kNull;
+      }
+    }
+
+    Dart_CObject multiroot_scheme_object;
+    {
+      const char* scheme = multiroot_scheme != NULL
+                               ? multiroot_scheme
+                               : FLAG_kernel_multiroot_scheme;
+      if (scheme != NULL) {
+        multiroot_scheme_object.type = Dart_CObject_kString;
+        multiroot_scheme_object.value.as_string = const_cast<char*>(scheme);
+      } else {
+        multiroot_scheme_object.type = Dart_CObject_kNull;
+      }
+    }
+
     Dart_CObject* message_arr[] = {&tag,
                                    &send_port,
                                    &uri,
@@ -570,7 +612,9 @@
                                    &files,
                                    &suppress_warnings,
                                    &dart_sync_async,
-                                   &package_config_uri};
+                                   &package_config_uri,
+                                   &multiroot_filepaths_object,
+                                   &multiroot_scheme_object};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
     // Send the message.
@@ -701,7 +745,9 @@
     int source_file_count,
     Dart_SourceFile source_files[],
     bool incremental_compile,
-    const char* package_config) {
+    const char* package_config,
+    const char* multiroot_filepaths,
+    const char* multiroot_scheme) {
   // This must be the main script to be loaded. Wait for Kernel isolate
   // to finish initialization.
   Dart_Port kernel_port = WaitForKernelPort();
@@ -716,7 +762,8 @@
   return request.SendAndWaitForResponse(kCompileTag, kernel_port, script_uri,
                                         platform_kernel, platform_kernel_size,
                                         source_file_count, source_files,
-                                        incremental_compile, package_config);
+                                        incremental_compile, package_config,
+                                        multiroot_filepaths, multiroot_scheme);
 }
 
 Dart_KernelCompilationResult KernelIsolate::ListDependencies() {
@@ -730,7 +777,8 @@
 
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kListDependenciesTag, kernel_port, NULL,
-                                        NULL, 0, 0, NULL, false, NULL);
+                                        NULL, 0, 0, NULL, false, NULL, NULL,
+                                        NULL);
 }
 
 Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
@@ -746,7 +794,7 @@
 
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kAcceptTag, kernel_port, NULL, NULL, 0,
-                                        0, NULL, true, NULL);
+                                        0, NULL, true, NULL, NULL, NULL);
 }
 
 Dart_KernelCompilationResult KernelIsolate::CompileExpressionToKernel(
@@ -786,7 +834,7 @@
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kUpdateSourcesTag, kernel_port, NULL,
                                         NULL, 0, source_files_count,
-                                        source_files, true, NULL);
+                                        source_files, true, NULL, NULL, NULL);
 }
 
 void KernelIsolate::NotifyAboutIsolateShutdown(const Isolate* isolate) {
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 5275308..3de2d9a 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -45,7 +45,9 @@
       int source_files_count = 0,
       Dart_SourceFile source_files[] = NULL,
       bool incremental_compile = true,
-      const char* package_config = NULL);
+      const char* package_config = NULL,
+      const char* multiroot_filepaths = NULL,
+      const char* multiroot_scheme = NULL);
 
   static Dart_KernelCompilationResult AcceptCompilation();
   static Dart_KernelCompilationResult UpdateInMemorySources(
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 5b5dfc4..3a554f4 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -127,7 +127,7 @@
   return loader_->LookupClass(klass).raw();
 }
 
-LibraryIndex::LibraryIndex(const TypedData& kernel_data)
+LibraryIndex::LibraryIndex(const ExternalTypedData& kernel_data)
     : reader_(kernel_data) {
   intptr_t data_size = reader_.size();
 
@@ -146,7 +146,7 @@
   Init(class_offset, class_size);
 }
 
-ClassIndex::ClassIndex(const TypedData& library_kernel_data,
+ClassIndex::ClassIndex(const ExternalTypedData& library_kernel_data,
                        intptr_t class_offset,
                        intptr_t class_size)
     : reader_(library_kernel_data) {
@@ -168,7 +168,7 @@
       library_kernel_offset_(-1),  // Set to the correct value in LoadLibrary
       correction_offset_(-1),      // Set to the correct value in LoadLibrary
       loading_native_wrappers_library_(false),
-      library_kernel_data_(TypedData::ZoneHandle(zone_)),
+      library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
       kernel_program_info_(KernelProgramInfo::ZoneHandle(zone_)),
       translation_helper_(this, thread_),
       builder_(&translation_helper_,
@@ -189,7 +189,7 @@
   ASSERT(T.active_class_ == &active_class_);
   T.finalize_ = false;
 
-  initialize_fields();
+  InitializeFields();
 }
 
 Object& KernelLoader::LoadEntireProgram(Program* program,
@@ -214,7 +214,7 @@
     reader.set_raw_buffer(program->kernel_data() + subprogram_start);
     reader.set_size(subprogram_end - subprogram_start);
     reader.set_offset(0);
-    Program* subprogram = Program::ReadFrom(&reader, false);
+    Program* subprogram = Program::ReadFrom(&reader);
     ASSERT(subprogram->is_single_program());
     KernelLoader loader(subprogram);
     Object& load_result = Object::Handle(loader.LoadProgram(false));
@@ -259,7 +259,7 @@
   subprogram_file_starts->Reverse();
 }
 
-void KernelLoader::initialize_fields() {
+void KernelLoader::InitializeFields() {
   const intptr_t source_table_size = builder_.SourceTableSize();
   const Array& scripts =
       Array::Handle(Z, Array::New(source_table_size, Heap::kOld));
@@ -279,10 +279,10 @@
     offsets.SetUint32(i << 2, end_offset);
   }
 
-  // Copy the string data out of the binary and into the VM's heap.
-  TypedData& data = TypedData::Handle(
-      Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld));
-  reader.CopyDataToVMHeap(data, reader.offset(), end_offset);
+  // Create view of the string data.
+  const ExternalTypedData& data = ExternalTypedData::Handle(
+      Z,
+      reader.ExternalDataFromTo(reader.offset(), reader.offset() + end_offset));
 
   // Copy the canonical names into the VM's heap.  Encode them as unsigned, so
   // the parent indexes are adjusted when extracted.
@@ -294,25 +294,15 @@
     names.SetUint32(i << 2, reader.ReadUInt());
   }
 
-  // Copy metadata payloads into the VM's heap
-  const intptr_t metadata_payloads_start = program_->metadata_payloads_offset();
-  const intptr_t metadata_payloads_size =
-      program_->metadata_mappings_offset() - metadata_payloads_start;
-  TypedData& metadata_payloads =
-      TypedData::Handle(Z, TypedData::New(kTypedDataUint8ArrayCid,
-                                          metadata_payloads_size, Heap::kOld));
-  reader.CopyDataToVMHeap(metadata_payloads, metadata_payloads_start,
-                          metadata_payloads_size);
+  // Create view of metadata payloads.
+  const ExternalTypedData& metadata_payloads = ExternalTypedData::Handle(
+      Z, reader.ExternalDataFromTo(program_->metadata_payloads_offset(),
+                                   program_->metadata_mappings_offset()));
 
-  // Copy metadata mappings into the VM's heap
-  const intptr_t metadata_mappings_start = program_->metadata_mappings_offset();
-  const intptr_t metadata_mappings_size =
-      program_->string_table_offset() - metadata_mappings_start;
-  TypedData& metadata_mappings =
-      TypedData::Handle(Z, TypedData::New(kTypedDataUint8ArrayCid,
-                                          metadata_mappings_size, Heap::kOld));
-  reader.CopyDataToVMHeap(metadata_mappings, metadata_mappings_start,
-                          metadata_mappings_size);
+  // Create view of metadata mappings.
+  const ExternalTypedData& metadata_mappings = ExternalTypedData::Handle(
+      Z, reader.ExternalDataFromTo(program_->metadata_mappings_offset(),
+                                   program_->string_table_offset()));
 
   kernel_program_info_ = KernelProgramInfo::New(
       offsets, data, names, metadata_payloads, metadata_mappings, scripts);
@@ -327,7 +317,7 @@
 }
 
 KernelLoader::KernelLoader(const Script& script,
-                           const TypedData& kernel_data,
+                           const ExternalTypedData& kernel_data,
                            intptr_t data_program_offset)
     : program_(NULL),
       thread_(Thread::Current()),
@@ -337,7 +327,7 @@
       library_kernel_offset_(data_program_offset),
       correction_offset_(0),
       loading_native_wrappers_library_(false),
-      library_kernel_data_(TypedData::ZoneHandle(zone_)),
+      library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
       kernel_program_info_(
           KernelProgramInfo::ZoneHandle(zone_, script.kernel_program_info())),
       translation_helper_(this, thread_),
@@ -663,7 +653,7 @@
         reader.set_raw_buffer(program->kernel_data() + subprogram_start);
         reader.set_size(subprogram_end - subprogram_start);
         reader.set_offset(0);
-        Program* subprogram = Program::ReadFrom(&reader, false);
+        Program* subprogram = Program::ReadFrom(&reader);
         ASSERT(subprogram->is_single_program());
         KernelLoader loader(subprogram);
         loader.walk_incremental_kernel(modified_libs);
@@ -742,10 +732,8 @@
   ASSERT(!library_helper.IsExternal() || library.Loaded());
   if (library.Loaded()) return library.raw();
 
-  library_kernel_data_ =
-      TypedData::New(kTypedDataUint8ArrayCid, library_size, Heap::kOld);
-  builder_.reader_.CopyDataToVMHeap(library_kernel_data_,
-                                    library_kernel_offset_, library_size);
+  library_kernel_data_ = builder_.reader_.ExternalDataFromTo(
+      library_kernel_offset_, library_kernel_offset_ + library_size);
   library.set_kernel_data(library_kernel_data_);
   library.set_kernel_offset(library_kernel_offset_);
 
@@ -1092,8 +1080,8 @@
     FixCoreLibraryScriptUri(library, script);
   }
   if (klass.token_pos() == TokenPosition::kNoSource) {
-    class_helper.ReadUntilIncluding(ClassHelper::kPosition);
-    klass.set_token_pos(class_helper.position_);
+    class_helper.ReadUntilIncluding(ClassHelper::kStartPosition);
+    klass.set_token_pos(class_helper.start_position_);
   }
 
   class_helper.ReadUntilIncluding(ClassHelper::kFlags);
@@ -1237,7 +1225,7 @@
                          false,  // is_abstract
                          constructor_helper.IsExternal(),
                          false,  // is_native
-                         *owner, constructor_helper.position_));
+                         *owner, constructor_helper.start_position_));
     function.set_end_token_pos(constructor_helper.end_position_);
     functions_.Add(&function);
     function.set_kernel_offset(constructor_offset);
@@ -1289,8 +1277,8 @@
   const Script& script = Script::Handle(zone, klass.script());
   const Library& library = Library::Handle(zone, klass.library());
   const Class& toplevel_class = Class::Handle(zone, library.toplevel_class());
-  const TypedData& library_kernel_data =
-      TypedData::Handle(zone, library.kernel_data());
+  const ExternalTypedData& library_kernel_data =
+      ExternalTypedData::Handle(zone, library.kernel_data());
   ASSERT(!library_kernel_data.IsNull());
   const intptr_t library_kernel_offset = library.kernel_offset();
   ASSERT(library_kernel_offset > 0);
@@ -1449,7 +1437,7 @@
                        false,       // is_const
                        is_abstract, is_external,
                        !native_name.IsNull(),  // is_native
-                       script_class, procedure_helper.position_));
+                       script_class, procedure_helper.start_position_));
   function.set_has_pragma(has_pragma_annotation);
   function.set_end_token_pos(procedure_helper.end_position_);
   functions_.Add(&function);
@@ -1544,13 +1532,34 @@
 
 RawScript* KernelLoader::LoadScriptAt(intptr_t index) {
   const String& uri_string = builder_.SourceTableUriFor(index);
-  const Script& script =
-      Script::Handle(Z, Script::New(uri_string, builder_.GetSourceFor(index),
-                                    RawScript::kKernelTag));
+  String& sources = builder_.GetSourceFor(index);
+  TypedData& line_starts =
+      TypedData::Handle(Z, builder_.GetLineStartsFor(index));
+  if (sources.Length() == 0 && line_starts.Length() == 0 &&
+      uri_string.Length() > 0) {
+    // Entry included only to provide URI - actual source should already exist
+    // in the VM, so try to find it.
+    Library& lib = Library::Handle(Z);
+    Script& script = Script::Handle(Z);
+    const GrowableObjectArray& libs =
+        GrowableObjectArray::Handle(isolate_->object_store()->libraries());
+    for (intptr_t i = 0; i < libs.Length(); i++) {
+      lib ^= libs.At(i);
+      script = lib.LookupScript(uri_string, /* useResolvedUri = */ true);
+      if (!script.IsNull() && script.kind() == RawScript::kKernelTag) {
+        sources ^= script.Source();
+        line_starts ^= script.line_starts();
+        break;
+      }
+    }
+  }
+
+  const Script& script = Script::Handle(
+      Z, Script::New(uri_string, sources, RawScript::kKernelTag));
+  String& script_url = String::Handle();
+  script_url = script.url();
   script.set_kernel_script_index(index);
   script.set_kernel_program_info(kernel_program_info_);
-  const TypedData& line_starts =
-      TypedData::Handle(Z, builder_.GetLineStartsFor(index));
   script.set_line_starts(line_starts);
   script.set_debug_positions(Array::Handle(Array::null()));
   script.set_yield_positions(Array::Handle(Array::null()));
@@ -1758,7 +1767,7 @@
       PatchClass::Handle(zone, PatchClass::New(field_owner, script));
   const Library& lib = Library::Handle(zone, field_owner.library());
   initializer_owner.set_library_kernel_data(
-      TypedData::Handle(zone, lib.kernel_data()));
+      ExternalTypedData::Handle(zone, lib.kernel_data()));
   initializer_owner.set_library_kernel_offset(lib.kernel_offset());
 
   // Create a static initializer.
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index b8a70a9..2bc0bfc 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -55,7 +55,7 @@
 class LibraryIndex {
  public:
   // |kernel_data| is the kernel data for one library alone.
-  explicit LibraryIndex(const TypedData& kernel_data);
+  explicit LibraryIndex(const ExternalTypedData& kernel_data);
 
   intptr_t class_count() const { return class_count_; }
   intptr_t procedure_count() const { return procedure_count_; }
@@ -100,7 +100,7 @@
 
   // |class_offset| is the offset of class' kernel data in |kernel_data|.
   // The size of the class' kernel data is |class_size|.
-  ClassIndex(const TypedData& kernel_data,
+  ClassIndex(const ExternalTypedData& kernel_data,
              intptr_t class_offset,
              intptr_t class_size);
 
@@ -199,10 +199,10 @@
   friend class BuildingTranslationHelper;
 
   KernelLoader(const Script& script,
-               const TypedData& kernel_data,
+               const ExternalTypedData& kernel_data,
                intptr_t data_program_offset);
 
-  void initialize_fields();
+  void InitializeFields();
   static void index_programs(kernel::Reader* reader,
                              GrowableArray<intptr_t>* subprogram_file_starts);
   void walk_incremental_kernel(BitVector* modified_libs);
@@ -302,7 +302,7 @@
 
   NameIndex skip_vmservice_library_;
 
-  TypedData& library_kernel_data_;
+  ExternalTypedData& library_kernel_data_;
   KernelProgramInfo& kernel_program_info_;
   BuildingTranslationHelper translation_helper_;
   StreamingFlowGraphBuilder builder_;
diff --git a/runtime/vm/log.cc b/runtime/vm/log.cc
index 06a4263..83b99b2 100644
--- a/runtime/vm/log.cc
+++ b/runtime/vm/log.cc
@@ -115,7 +115,7 @@
 
 bool Log::ShouldLogForIsolate(const Isolate* isolate) {
   if (FLAG_isolate_log_filter == NULL) {
-    if (isolate->is_service_isolate()) {
+    if (isolate->is_service_isolate() || isolate->is_kernel_isolate()) {
       // By default, do not log for the service isolate.
       return false;
     }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index dac4c85..c1e7654 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1799,7 +1799,8 @@
     type = object_store->object_type();
     cls.set_super_type(type);
 
-    // Create and cache commonly used type arguments <int> and <String>
+    // Create and cache commonly used type arguments <int>, <double>,
+    // <String>, <String, dynamic> and <String, String>.
     type_args = TypeArguments::New(1);
     type = object_store->int_type();
     type_args.SetTypeAt(0, type);
@@ -1807,11 +1808,31 @@
     object_store->set_type_argument_int(type_args);
 
     type_args = TypeArguments::New(1);
+    type = object_store->double_type();
+    type_args.SetTypeAt(0, type);
+    type_args.Canonicalize();
+    object_store->set_type_argument_double(type_args);
+
+    type_args = TypeArguments::New(1);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
     type_args.Canonicalize();
     object_store->set_type_argument_string(type_args);
 
+    type_args = TypeArguments::New(2);
+    type = object_store->string_type();
+    type_args.SetTypeAt(0, type);
+    type_args.SetTypeAt(1, Object::dynamic_type());
+    type_args.Canonicalize();
+    object_store->set_type_argument_string_dynamic(type_args);
+
+    type_args = TypeArguments::New(2);
+    type = object_store->string_type();
+    type_args.SetTypeAt(0, type);
+    type_args.SetTypeAt(1, type);
+    type_args.Canonicalize();
+    object_store->set_type_argument_string_string(type_args);
+
     // Finish the initialization by compiling the bootstrap scripts containing
     // the base interfaces and the implementation of the internal classes.
     const Error& error = Error::Handle(
@@ -2693,27 +2714,54 @@
   set_next_field_offset(offset);
 }
 
+struct InvocationDispatcherCacheLayout {
+  enum { kNameIndex = 0, kArgsDescIndex, kFunctionIndex, kEntrySize };
+};
+
+void Class::AddInvocationDispatcher(const String& target_name,
+                                    const Array& args_desc,
+                                    const Function& dispatcher) const {
+  // Search for a free entry.
+  Array& cache = Array::Handle(invocation_dispatcher_cache());
+  intptr_t i = 0;
+  while (i < cache.Length() && cache.At(i) != Object::null()) {
+    i += InvocationDispatcherCacheLayout::kEntrySize;
+  }
+
+  if (i == cache.Length()) {
+    // Allocate new larger cache.
+    intptr_t new_len =
+        (cache.Length() == 0)
+            ? static_cast<intptr_t>(InvocationDispatcherCacheLayout::kEntrySize)
+            : cache.Length() * 2;
+    cache ^= Array::Grow(cache, new_len);
+    set_invocation_dispatcher_cache(cache);
+  }
+  cache.SetAt(i + InvocationDispatcherCacheLayout::kNameIndex, target_name);
+  cache.SetAt(i + InvocationDispatcherCacheLayout::kArgsDescIndex, args_desc);
+  cache.SetAt(i + InvocationDispatcherCacheLayout::kFunctionIndex, dispatcher);
+}
+
 RawFunction* Class::GetInvocationDispatcher(const String& target_name,
                                             const Array& args_desc,
                                             RawFunction::Kind kind,
                                             bool create_if_absent) const {
-  enum { kNameIndex = 0, kArgsDescIndex, kFunctionIndex, kEntrySize };
-
   ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
-         kind == RawFunction::kInvokeFieldDispatcher);
+         kind == RawFunction::kInvokeFieldDispatcher ||
+         kind == RawFunction::kDynamicInvocationForwarder);
   Function& dispatcher = Function::Handle();
   Array& cache = Array::Handle(invocation_dispatcher_cache());
   ASSERT(!cache.IsNull());
   String& name = String::Handle();
   Array& desc = Array::Handle();
   intptr_t i = 0;
-  for (; i < cache.Length(); i += kEntrySize) {
-    name ^= cache.At(i + kNameIndex);
+  for (; i < cache.Length(); i += InvocationDispatcherCacheLayout::kEntrySize) {
+    name ^= cache.At(i + InvocationDispatcherCacheLayout::kNameIndex);
     if (name.IsNull()) break;  // Reached last entry.
     if (!name.Equals(target_name)) continue;
-    desc ^= cache.At(i + kArgsDescIndex);
+    desc ^= cache.At(i + InvocationDispatcherCacheLayout::kArgsDescIndex);
     if (desc.raw() != args_desc.raw()) continue;
-    dispatcher ^= cache.At(i + kFunctionIndex);
+    dispatcher ^= cache.At(i + InvocationDispatcherCacheLayout::kFunctionIndex);
     if (dispatcher.kind() == kind) {
       // Found match.
       ASSERT(dispatcher.IsFunction());
@@ -2722,18 +2770,8 @@
   }
 
   if (dispatcher.IsNull() && create_if_absent) {
-    if (i == cache.Length()) {
-      // Allocate new larger cache.
-      intptr_t new_len = (cache.Length() == 0)
-                             ? static_cast<intptr_t>(kEntrySize)
-                             : cache.Length() * 2;
-      cache ^= Array::Grow(cache, new_len);
-      set_invocation_dispatcher_cache(cache);
-    }
     dispatcher ^= CreateInvocationDispatcher(target_name, args_desc, kind);
-    cache.SetAt(i + kNameIndex, target_name);
-    cache.SetAt(i + kArgsDescIndex, args_desc);
-    cache.SetAt(i + kFunctionIndex, dispatcher);
+    AddInvocationDispatcher(target_name, args_desc, dispatcher);
   }
   return dispatcher.raw();
 }
@@ -2853,6 +2891,81 @@
   return result.raw();
 }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+RawFunction* Function::CreateDynamicInvocationForwarder(
+    const String& mangled_name) const {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+
+  Function& forwarder = Function::Handle(zone);
+  forwarder ^= Object::Clone(*this, Heap::kOld);
+
+  forwarder.set_name(mangled_name);
+  forwarder.set_kind(RawFunction::kDynamicInvocationForwarder);
+  forwarder.set_is_debuggable(false);
+
+  // TODO(vegorov) for error reporting reasons it is better to make this
+  // function visible and instead use a TailCall to invoke the target.
+  // Our TailCall instruction is not ready for such usage though it
+  // blocks inlining and can't take Function-s only Code objects.
+  forwarder.set_is_visible(false);
+
+  forwarder.ClearICDataArray();
+  forwarder.ClearCode();
+  forwarder.set_usage_counter(0);
+  forwarder.set_deoptimization_counter(0);
+  forwarder.set_optimized_instruction_count(0);
+  forwarder.set_inlining_depth(0);
+  forwarder.set_optimized_call_site_count(0);
+  forwarder.set_kernel_offset(kernel_offset());
+
+  return forwarder.raw();
+}
+
+bool Function::IsDynamicInvocationForwaderName(const String& name) {
+  return name.StartsWith(Symbols::DynamicPrefix());
+}
+
+RawString* Function::CreateDynamicInvocationForwarderName(const String& name) {
+  return Symbols::FromConcat(Thread::Current(), Symbols::DynamicPrefix(), name);
+}
+
+RawString* Function::DemangleDynamicInvocationForwarderName(
+    const String& name) {
+  const intptr_t kDynamicPrefixLength = 4;  // "dyn:"
+  ASSERT(Symbols::DynamicPrefix().Length() == kDynamicPrefixLength);
+  return Symbols::New(Thread::Current(), name, kDynamicPrefixLength,
+                      name.Length() - kDynamicPrefixLength);
+}
+
+RawFunction* Function::GetDynamicInvocationForwarder(
+    const String& mangled_name,
+    bool allow_add /* = true */) const {
+  ASSERT(IsDynamicInvocationForwaderName(mangled_name));
+  const Class& owner = Class::Handle(Owner());
+  Function& result = Function::Handle(owner.GetInvocationDispatcher(
+      mangled_name, Array::null_array(),
+      RawFunction::kDynamicInvocationForwarder, /*create_if_absent=*/false));
+
+  if (!result.IsNull()) {
+    return result.raw();
+  }
+
+  // Check if function actually needs a dynamic invocation forwarder.
+  if (!kernel::FlowGraphBuilder::NeedsDynamicInvocationForwarder(*this)) {
+    result = raw();
+  } else if (allow_add) {
+    result = CreateDynamicInvocationForwarder(mangled_name);
+  }
+
+  if (allow_add) {
+    owner.AddInvocationDispatcher(mangled_name, Array::null_array(), result);
+  }
+
+  return result.raw();
+}
+#endif
+
 bool AbstractType::InstantiateAndTestSubtype(
     AbstractType* subtype,
     AbstractType* supertype,
@@ -3219,12 +3332,6 @@
   return func.raw();
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-static void ReleaseFetchedBytes(uint8_t* buffer) {
-  free(buffer);
-}
-#endif
-
 RawObject* Class::Evaluate(const String& expr,
                            const Array& param_names,
                            const Array& param_values) const {
@@ -3245,7 +3352,8 @@
     return UnhandledException::New(exception, stacktrace);
   }
 
-  ASSERT(Library::Handle(library()).kernel_data() == TypedData::null() ||
+  ASSERT(Library::Handle(library()).kernel_data() ==
+             ExternalTypedData::null() ||
          !FLAG_enable_kernel_expression_compilation);
   const Function& eval_func = Function::Handle(
       Function::EvaluateHelper(*this, expr, param_names, true));
@@ -3694,7 +3802,8 @@
   if (scr.kind() == RawScript::kKernelTag) {
     ASSERT(kernel_offset() > 0);
     const Library& lib = Library::Handle(zone, library());
-    const TypedData& kernel_data = TypedData::Handle(zone, lib.kernel_data());
+    const ExternalTypedData& kernel_data =
+        ExternalTypedData::Handle(zone, lib.kernel_data());
     ASSERT(!kernel_data.IsNull());
     const intptr_t library_kernel_offset = lib.kernel_offset();
     ASSERT(library_kernel_offset > 0);
@@ -5553,7 +5662,7 @@
   StorePointer(&raw_ptr()->script_, value.raw());
 }
 
-void PatchClass::set_library_kernel_data(const TypedData& data) const {
+void PatchClass::set_library_kernel_data(const ExternalTypedData& data) const {
   StorePointer(&raw_ptr()->library_kernel_data_, data.raw());
 }
 
@@ -6025,6 +6134,8 @@
     case RawFunction::kIrregexpFunction:
       return "IrregexpFunction";
       break;
+    case RawFunction::kDynamicInvocationForwarder:
+      return "DynamicInvocationForwarder";
     default:
       UNREACHABLE();
       return NULL;
@@ -7111,7 +7222,6 @@
   clone.set_optimized_instruction_count(0);
   clone.set_inlining_depth(0);
   clone.set_optimized_call_site_count(0);
-  clone.set_kernel_offset(kernel_offset());
 
   if (new_owner.NumTypeParameters() > 0) {
     // Adjust uninstantiated types to refer to type parameters of the new owner.
@@ -7301,7 +7411,8 @@
     kernel::TranslationHelper translation_helper(thread);
     kernel::StreamingFlowGraphBuilder builder(
         &translation_helper, function_script, zone,
-        TypedData::Handle(zone, KernelData()), KernelDataProgramOffset(),
+        ExternalTypedData::Handle(zone, KernelData()),
+        KernelDataProgramOffset(),
         /* active_class = */ NULL);
     translation_helper.InitFromScript(function_script);
     builder.SetOffset(kernel_offset());
@@ -7556,7 +7667,7 @@
 }
 
 void Function::SetKernelDataAndScript(const Script& script,
-                                      const TypedData& data,
+                                      const ExternalTypedData& data,
                                       intptr_t offset) {
   Array& data_field = Array::Handle(Array::New(3));
   data_field.SetAt(0, script);
@@ -7598,12 +7709,12 @@
   return PatchClass::Cast(obj).script();
 }
 
-RawTypedData* Function::KernelData() const {
+RawExternalTypedData* Function::KernelData() const {
   Object& data = Object::Handle(raw_ptr()->data_);
   if (data.IsArray()) {
     Object& script = Object::Handle(Array::Cast(data).At(0));
     if (script.IsScript()) {
-      return TypedData::RawCast(Array::Cast(data).At(1));
+      return ExternalTypedData::RawCast(Array::Cast(data).At(1));
     }
   }
   if (IsClosureFunction()) {
@@ -7713,6 +7824,38 @@
   }
   Zone* zone = Thread::Current()->zone();
   const Script& func_script = Script::Handle(zone, script());
+
+  if (func_script.kind() == RawScript::kKernelTag) {
+    intptr_t from_line;
+    intptr_t from_col;
+    intptr_t to_line;
+    intptr_t to_col;
+    intptr_t to_length;
+    func_script.GetTokenLocation(token_pos(), &from_line, &from_col);
+    func_script.GetTokenLocation(end_token_pos(), &to_line, &to_col,
+                                 &to_length);
+
+    if (to_length == 1) {
+      // Handle special cases for end tokens of closures (where we exclude the
+      // last token):
+      // (1) "foo(() => null, bar);": End token is `,', but we don't print it.
+      // (2) "foo(() => null);": End token is ')`, but we don't print it.
+      // (3) "var foo = () => null;": End token is `;', but in this case the
+      // token semicolon belongs to the assignment so we skip it.
+      const String& src = String::Handle(func_script.Source());
+      uint16_t end_char = src.CharAt(end_token_pos().value());
+      if ((end_char == ',') ||  // Case 1.
+          (end_char == ')') ||  // Case 2.
+          (end_char == ';' && String::Handle(zone, name())
+                                  .Equals("<anonymous closure>"))) {  // Case 3.
+        to_length = 0;
+      }
+    }
+
+    return func_script.GetSnippet(from_line, from_col, to_line,
+                                  to_col + to_length);
+  }
+
   const TokenStream& stream = TokenStream::Handle(zone, func_script.tokens());
   if (!func_script.HasSource()) {
     // When source is not available, avoid printing the whole token stream and
@@ -7919,6 +8062,9 @@
     case RawFunction::kNoSuchMethodDispatcher:
       kind_str = " no-such-method-dispatcher";
       break;
+    case RawFunction::kDynamicInvocationForwarder:
+      kind_str = " dynamic-invocation-forwader";
+      break;
     case RawFunction::kInvokeFieldDispatcher:
       kind_str = "invoke-field-dispatcher";
       break;
@@ -8152,7 +8298,7 @@
   return PatchClass::Cast(obj).script();
 }
 
-RawTypedData* Field::KernelData() const {
+RawExternalTypedData* Field::KernelData() const {
   const Object& obj = Object::Handle(this->raw_ptr()->owner_);
   if (obj.IsClass()) {
     Library& library = Library::Handle(Class::Cast(obj).library());
@@ -10227,7 +10373,7 @@
   StorePointer(&raw_ptr()->url_, name.raw());
 }
 
-void Library::set_kernel_data(const TypedData& data) const {
+void Library::set_kernel_data(const ExternalTypedData& data) const {
   StorePointer(&raw_ptr()->kernel_data_, data.raw());
 }
 
@@ -10951,7 +11097,8 @@
 
 // TODO(hausner): we might want to add a script dictionary to the
 // library class to make this lookup faster.
-RawScript* Library::LookupScript(const String& url) const {
+RawScript* Library::LookupScript(const String& url,
+                                 bool useResolvedUri /* = false */) const {
   const intptr_t url_length = url.Length();
   if (url_length == 0) {
     return Script::null();
@@ -10962,7 +11109,11 @@
   const intptr_t num_scripts = scripts.Length();
   for (int i = 0; i < num_scripts; i++) {
     script ^= scripts.At(i);
-    script_url = script.url();
+    if (!useResolvedUri) {
+      script_url = script.url();
+    } else {
+      script_url = script.resolved_url();
+    }
     const intptr_t start_idx = script_url.Length() - url_length;
     if ((start_idx == 0) && url.Equals(script_url)) {
       return script.raw();
@@ -11399,7 +11550,7 @@
                              const Array& param_values,
                              const Array& type_param_names,
                              const TypeArguments& type_param_values) const {
-  ASSERT(kernel_data() == TypedData::null() ||
+  ASSERT(kernel_data() == ExternalTypedData::null() ||
          !FLAG_enable_kernel_expression_compilation);
   // Evaluate the expression as a static function of the toplevel class.
   Class& top_level_class = Class::Handle(toplevel_class());
@@ -11489,15 +11640,13 @@
   Thread* T = Thread::Current();
 
   kernel::Program* kernel_pgm =
-      kernel::Program::ReadFromBuffer(kernel_bytes, kernel_length, true);
+      kernel::Program::ReadFromBuffer(kernel_bytes, kernel_length);
 
   if (kernel_pgm == NULL) {
     return ApiError::New(String::Handle(
         String::New("Kernel isolate returned ill-formed kernel.")));
   }
 
-  kernel_pgm->set_release_buffer_callback(ReleaseFetchedBytes);
-
   Function& callee = Function::Handle();
   intptr_t num_cids = I->class_table()->NumCids();
   GrowableObjectArray& libraries =
@@ -11531,7 +11680,7 @@
   // callee, so it doesn't require access it's parent library during
   // compilation.
   callee.SetKernelDataAndScript(Script::Handle(callee.script()),
-                                TypedData::Handle(loaded.kernel_data()),
+                                ExternalTypedData::Handle(loaded.kernel_data()),
                                 loaded.kernel_offset());
 
   // Reparent the callee to the real enclosing class so we can remove the fake
@@ -12291,12 +12440,13 @@
   return reinterpret_cast<RawKernelProgramInfo*>(raw);
 }
 
-RawKernelProgramInfo* KernelProgramInfo::New(const TypedData& string_offsets,
-                                             const TypedData& string_data,
-                                             const TypedData& canonical_names,
-                                             const TypedData& metadata_payloads,
-                                             const TypedData& metadata_mappings,
-                                             const Array& scripts) {
+RawKernelProgramInfo* KernelProgramInfo::New(
+    const TypedData& string_offsets,
+    const ExternalTypedData& string_data,
+    const TypedData& canonical_names,
+    const ExternalTypedData& metadata_payloads,
+    const ExternalTypedData& metadata_mappings,
+    const Array& scripts) {
   const KernelProgramInfo& info =
       KernelProgramInfo::Handle(KernelProgramInfo::New());
   info.StorePointer(&info.raw_ptr()->string_offsets_, string_offsets.raw());
@@ -13645,8 +13795,18 @@
   const String& name = String::Handle(target_name());
   const Class& smi_class = Class::Handle(Smi::Class());
   Zone* zone = Thread::Current()->zone();
-  const Function& smi_op_target =
+  Function& smi_op_target =
       Function::Handle(Resolver::ResolveDynamicAnyArgs(zone, smi_class, name));
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (smi_op_target.IsNull() &&
+      Function::IsDynamicInvocationForwaderName(name)) {
+    const String& demangled =
+        String::Handle(Function::DemangleDynamicInvocationForwarderName(name));
+    smi_op_target = Resolver::ResolveDynamicAnyArgs(zone, smi_class, demangled);
+  }
+#endif
+
   if (NumberOfChecksIs(0)) {
     GrowableArray<intptr_t> class_ids(2);
     class_ids.Add(kSmiCid);
@@ -13704,6 +13864,13 @@
 }
 
 bool ICData::ValidateInterceptor(const Function& target) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  const String& name = String::Handle(target_name());
+  if (Function::IsDynamicInvocationForwaderName(name)) {
+    return Function::DemangleDynamicInvocationForwarderName(name) ==
+           target.name();
+  }
+#endif
   ObjectStore* store = Isolate::Current()->object_store();
   ASSERT((target.raw() == store->simple_instance_of_true_function()) ||
          (target.raw() == store->simple_instance_of_false_function()));
@@ -14779,7 +14946,7 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 #if defined(DART_USE_INTERPRETER)
-RawCode* Code::FinalizeBytecode(void* bytecode_data,
+RawCode* Code::FinalizeBytecode(const void* bytecode_data,
                                 intptr_t bytecode_size,
                                 const ObjectPool& object_pool,
                                 CodeStatistics* stats /* = nullptr */) {
@@ -14796,7 +14963,7 @@
   // Copy the bytecode data into the instruction area. No fixups to apply.
   MemoryRegion instrs_region(reinterpret_cast<void*>(instrs.PayloadStart()),
                              instrs.Size());
-  MemoryRegion bytecode_region(bytecode_data, bytecode_size);
+  MemoryRegion bytecode_region(const_cast<void*>(bytecode_data), bytecode_size);
   // TODO(regis): Avoid copying bytecode.
   instrs_region.CopyFrom(0, bytecode_region);
 
@@ -15816,7 +15983,7 @@
   }
 
   const Library& library = Library::Handle(method_cls.library());
-  ASSERT(library.kernel_data() == TypedData::null() ||
+  ASSERT(library.kernel_data() == ExternalTypedData::null() ||
          !FLAG_enable_kernel_expression_compilation);
   const Function& eval_func = Function::Handle(
       Function::EvaluateHelper(method_cls, expr, param_names, false));
@@ -15929,6 +16096,8 @@
 
 bool Instance::CheckAndCanonicalizeFields(Thread* thread,
                                           const char** error_str) const {
+  ASSERT(error_str != NULL);
+  ASSERT(*error_str == NULL);
   if (GetClassId() >= kNumPredefinedCids) {
     // Iterate over all fields, canonicalize numbers and strings, expect all
     // other instances to be canonical otherwise report error (return false).
@@ -15941,12 +16110,15 @@
       obj = *this->FieldAddrAtOffset(offset);
       if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
         if (obj.IsNumber() || obj.IsString()) {
-          obj = Instance::Cast(obj).CheckAndCanonicalize(thread, NULL);
+          obj = Instance::Cast(obj).CheckAndCanonicalize(thread, error_str);
+          if (*error_str != NULL) {
+            return false;
+          }
           ASSERT(!obj.IsNull());
           this->SetFieldAtOffset(offset, obj);
         } else {
-          ASSERT(error_str != NULL);
-          char* chars = OS::SCreate(zone, "field: %s\n", obj.ToCString());
+          char* chars = OS::SCreate(zone, "field: %s, owner: %s\n",
+                                    obj.ToCString(), ToCString());
           *error_str = chars;
           return false;
         }
@@ -15965,6 +16137,8 @@
 
 RawInstance* Instance::CheckAndCanonicalize(Thread* thread,
                                             const char** error_str) const {
+  ASSERT(error_str != NULL);
+  ASSERT(*error_str == NULL);
   ASSERT(!IsNull());
   if (this->IsCanonical()) {
     return this->raw();
@@ -21247,6 +21421,8 @@
 
 bool Array::CheckAndCanonicalizeFields(Thread* thread,
                                        const char** error_str) const {
+  ASSERT(error_str != NULL);
+  ASSERT(*error_str == NULL);
   intptr_t len = Length();
   if (len > 0) {
     Zone* zone = thread->zone();
@@ -21257,11 +21433,13 @@
       obj = At(i);
       if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
         if (obj.IsNumber() || obj.IsString()) {
-          obj = Instance::Cast(obj).CheckAndCanonicalize(thread, NULL);
+          obj = Instance::Cast(obj).CheckAndCanonicalize(thread, error_str);
+          if (*error_str != NULL) {
+            return false;
+          }
           ASSERT(!obj.IsNull());
           this->SetAt(i, obj);
         } else {
-          ASSERT(error_str != NULL);
           char* chars = OS::SCreate(zone, "element at index %" Pd ": %s\n", i,
                                     obj.ToCString());
           *error_str = chars;
@@ -21771,6 +21949,9 @@
                                              uint8_t* data,
                                              intptr_t len,
                                              Heap::Space space) {
+  if (len < 0 || len > ExternalTypedData::MaxElements(class_id)) {
+    FATAL1("Fatal error in ExternalTypedData::New: invalid len %" Pd "\n", len);
+  }
   ExternalTypedData& result = ExternalTypedData::Handle();
   {
     RawObject* raw =
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 89513ea..8c69cb2 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1442,6 +1442,10 @@
   void CheckReload(const Class& replacement,
                    IsolateReloadContext* context) const;
 
+  void AddInvocationDispatcher(const String& target_name,
+                               const Array& args_desc,
+                               const Function& dispatcher) const;
+
  private:
   bool CanReloadFinalized(const Class& replacement,
                           IsolateReloadContext* context) const;
@@ -1640,10 +1644,10 @@
   RawClass* patched_class() const { return raw_ptr()->patched_class_; }
   RawClass* origin_class() const { return raw_ptr()->origin_class_; }
   RawScript* script() const { return raw_ptr()->script_; }
-  RawTypedData* library_kernel_data() const {
+  RawExternalTypedData* library_kernel_data() const {
     return raw_ptr()->library_kernel_data_;
   }
-  void set_library_kernel_data(const TypedData& data) const;
+  void set_library_kernel_data(const ExternalTypedData& data) const;
 
   intptr_t library_kernel_offset() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2302,6 +2306,10 @@
     return kind() == RawFunction::kInvokeFieldDispatcher;
   }
 
+  bool IsDynamicInvocationForwader() const {
+    return kind() == RawFunction::kDynamicInvocationForwarder;
+  }
+
   bool IsImplicitGetterOrSetter() const {
     return kind() == RawFunction::kImplicitGetter ||
            kind() == RawFunction::kImplicitSetter ||
@@ -2367,6 +2375,7 @@
       case RawFunction::kMethodExtractor:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
+      case RawFunction::kDynamicInvocationForwarder:
         return true;
       case RawFunction::kClosureFunction:
       case RawFunction::kImplicitClosureFunction:
@@ -2400,6 +2409,7 @@
       case RawFunction::kMethodExtractor:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
+      case RawFunction::kDynamicInvocationForwarder:
         return false;
       default:
         UNREACHABLE();
@@ -2523,12 +2533,12 @@
   }
 
   void SetKernelDataAndScript(const Script& script,
-                              const TypedData& data,
+                              const ExternalTypedData& data,
                               intptr_t offset);
 
   intptr_t KernelDataProgramOffset() const;
 
-  RawTypedData* KernelData() const;
+  RawExternalTypedData* KernelData() const;
 
   bool IsOptimizable() const;
   void SetIsOptimizable(bool value) const;
@@ -2609,6 +2619,7 @@
       case RawFunction::kImplicitSetter:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
+      case RawFunction::kDynamicInvocationForwarder:
         return true;
       default:
         return false;
@@ -2770,6 +2781,17 @@
   RawFunction* CreateMethodExtractor(const String& getter_name) const;
   RawFunction* GetMethodExtractor(const String& getter_name) const;
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  static bool IsDynamicInvocationForwaderName(const String& name);
+  static RawString* DemangleDynamicInvocationForwarderName(const String& name);
+  static RawString* CreateDynamicInvocationForwarderName(const String& name);
+
+  RawFunction* CreateDynamicInvocationForwarder(
+      const String& mangled_name) const;
+  RawFunction* GetDynamicInvocationForwarder(const String& mangled_name,
+                                             bool allow_add = true) const;
+#endif
+
   // Allocate new function object, clone values from this function. The
   // owner of the clone is new_owner.
   RawFunction* Clone(const Class& new_owner) const;
@@ -3137,7 +3159,7 @@
 #endif
   }
 
-  RawTypedData* KernelData() const;
+  RawExternalTypedData* KernelData() const;
 
   intptr_t KernelDataProgramOffset() const;
 
@@ -3578,6 +3600,8 @@
     return raw_ptr()->tokens_;
   }
 
+  RawTypedData* line_starts() const;
+
   void set_line_starts(const TypedData& value) const;
 
   void set_debug_positions(const Array& value) const;
@@ -3635,7 +3659,6 @@
   void set_kind(RawScript::Kind value) const;
   void set_load_timestamp(int64_t value) const;
   void set_tokens(const TokenStream& value) const;
-  RawTypedData* line_starts() const;
   RawArray* debug_positions() const;
 
   static RawScript* New();
@@ -3785,7 +3808,7 @@
   RawFunction* LookupFunctionAllowPrivate(const String& name) const;
   RawFunction* LookupLocalFunction(const String& name) const;
   RawLibraryPrefix* LookupLocalLibraryPrefix(const String& name) const;
-  RawScript* LookupScript(const String& url) const;
+  RawScript* LookupScript(const String& url, bool useResolvedUri = false) const;
   RawArray* LoadedScripts() const;
 
   // Resolve name in the scope of this library. First check the cache
@@ -3886,8 +3909,8 @@
 
   inline intptr_t UrlHash() const;
 
-  RawTypedData* kernel_data() const { return raw_ptr()->kernel_data_; }
-  void set_kernel_data(const TypedData& data) const;
+  RawExternalTypedData* kernel_data() const { return raw_ptr()->kernel_data_; }
+  void set_kernel_data(const ExternalTypedData& data) const;
 
   intptr_t kernel_offset() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -4057,10 +4080,10 @@
 class KernelProgramInfo : public Object {
  public:
   static RawKernelProgramInfo* New(const TypedData& string_offsets,
-                                   const TypedData& string_data,
+                                   const ExternalTypedData& string_data,
                                    const TypedData& canonical_names,
-                                   const TypedData& metadata_payload,
-                                   const TypedData& metadata_mappings,
+                                   const ExternalTypedData& metadata_payload,
+                                   const ExternalTypedData& metadata_mappings,
                                    const Array& scripts);
 
   static intptr_t InstanceSize() {
@@ -4069,15 +4092,15 @@
 
   RawTypedData* string_offsets() const { return raw_ptr()->string_offsets_; }
 
-  RawTypedData* string_data() const { return raw_ptr()->string_data_; }
+  RawExternalTypedData* string_data() const { return raw_ptr()->string_data_; }
 
   RawTypedData* canonical_names() const { return raw_ptr()->canonical_names_; }
 
-  RawTypedData* metadata_payloads() const {
+  RawExternalTypedData* metadata_payloads() const {
     return raw_ptr()->metadata_payloads_;
   }
 
-  RawTypedData* metadata_mappings() const {
+  RawExternalTypedData* metadata_mappings() const {
     return raw_ptr()->metadata_mappings_;
   }
 
@@ -4990,7 +5013,7 @@
                                bool optimized,
                                CodeStatistics* stats = nullptr);
 #if defined(DART_USE_INTERPRETER)
-  static RawCode* FinalizeBytecode(void* bytecode_data,
+  static RawCode* FinalizeBytecode(const void* bytecode_data,
                                    intptr_t bytecode_size,
                                    const ObjectPool& object_pool,
                                    CodeStatistics* stats = nullptr);
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index aecf5ef..d2197e3 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -345,7 +345,7 @@
       PatchClass::Handle(PatchClass::New(*this, Script::Handle(script())));
   ASSERT(!patch.IsNull());
   const Library& lib = Library::Handle(library());
-  patch.set_library_kernel_data(TypedData::Handle(lib.kernel_data()));
+  patch.set_library_kernel_data(ExternalTypedData::Handle(lib.kernel_data()));
   patch.set_library_kernel_offset(lib.kernel_offset());
 
   const Array& funcs = Array::Handle(functions());
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index cf0f807..0470f1a 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -52,8 +52,11 @@
   RW(Type, int32x4_type)                                                       \
   RW(Type, float64x2_type)                                                     \
   RW(Type, string_type)                                                        \
-  RW(TypeArguments, type_argument_string)                                      \
   RW(TypeArguments, type_argument_int)                                         \
+  RW(TypeArguments, type_argument_double)                                      \
+  RW(TypeArguments, type_argument_string)                                      \
+  RW(TypeArguments, type_argument_string_dynamic)                              \
+  RW(TypeArguments, type_argument_string_string)                               \
   RW(Class, compiletime_error_class)                                           \
   RW(Class, pragma_class)                                                      \
   RW(Class, future_class)                                                      \
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index bf7d68f..5d7a7f0 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -824,7 +824,7 @@
   RawClass* patched_class_;
   RawClass* origin_class_;
   RawScript* script_;
-  RawTypedData* library_kernel_data_;
+  RawExternalTypedData* library_kernel_data_;
   VISIT_TO(RawObject*, library_kernel_data_);
 
   RawObject** to_snapshot(Snapshot::Kind kind) {
@@ -867,6 +867,9 @@
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
     kInvokeFieldDispatcher,   // invokes a field as a closure.
     kIrregexpFunction,  // represents a generated irregexp matcher function.
+    kDynamicInvocationForwarder,  // represents forwarder which performs type
+                                  // checks for arguments of a dynamic
+                                  // invocation.
   };
 
   enum AsyncModifier {
@@ -1168,7 +1171,7 @@
   RawArray* imports_;        // List of Namespaces imported without prefix.
   RawArray* exports_;        // List of re-exported Namespaces.
   RawInstance* load_error_;  // Error iff load_state_ == kLoadError.
-  RawTypedData* kernel_data_;
+  RawExternalTypedData* kernel_data_;
   RawObject** to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1224,10 +1227,10 @@
 
   VISIT_FROM(RawObject*, string_offsets_);
   RawTypedData* string_offsets_;
-  RawTypedData* string_data_;
+  RawExternalTypedData* string_data_;
   RawTypedData* canonical_names_;
-  RawTypedData* metadata_payloads_;
-  RawTypedData* metadata_mappings_;
+  RawExternalTypedData* metadata_payloads_;
+  RawExternalTypedData* metadata_mappings_;
   RawArray* scripts_;
   RawArray* constants_;
   RawGrowableObjectArray* potential_natives_;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index fce31ee..435e697 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1868,7 +1868,11 @@
   obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(),
                           HEAP_SPACE(kind));
   if (RawObject::IsCanonical(tags)) {
-    obj = obj.CheckAndCanonicalize(reader->thread(), NULL);
+    const char* error_str = NULL;
+    obj = obj.CheckAndCanonicalize(reader->thread(), &error_str);
+    if (error_str != NULL) {
+      FATAL1("Failed to canonicalize: %s", error_str);
+    }
   }
   reader->AddBackRef(object_id, &obj, kIsDeserialized);
 
@@ -2226,7 +2230,11 @@
     // Read all the individual elements for inlined objects.
     reader->ArrayReadFrom(object_id, *array, len, tags);
     if (RawObject::IsCanonical(tags)) {
-      *array ^= array->CheckAndCanonicalize(reader->thread(), NULL);
+      const char* error_str = NULL;
+      *array ^= array->CheckAndCanonicalize(reader->thread(), &error_str);
+      if (error_str != NULL) {
+        FATAL1("Failed to canonicalize: %s", error_str);
+      }
     }
   }
   return raw(*array);
@@ -2552,7 +2560,11 @@
   // When reading a script snapshot or a message snapshot we always have
   // to canonicalize the object.
   if (RawObject::IsCanonical(tags)) {
-    result ^= result.CheckAndCanonicalize(reader->thread(), NULL);
+    const char* error_str = NULL;
+    result ^= result.CheckAndCanonicalize(reader->thread(), &error_str);
+    if (error_str != NULL) {
+      FATAL1("Failed to canonicalize: %s", error_str);
+    }
     ASSERT(!result.IsNull());
     ASSERT(result.IsCanonical());
   }
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index b0238ad..abb9130 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -69,16 +69,30 @@
     THR_Print("ResolveDynamic '%s' for class %s\n", function_name.ToCString(),
               String::Handle(zone, cls.Name()).ToCString());
   }
+  Function& function = Function::Handle(zone);
+
+  String& demangled = String::Handle(zone);
 
   const bool is_getter = Field::IsGetterName(function_name);
-  String& field_name = String::Handle(zone);
   if (is_getter) {
-    field_name ^= Field::NameFromGetter(function_name);
+    demangled ^= Field::NameFromGetter(function_name);
   }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (Function::IsDynamicInvocationForwaderName(function_name)) {
+    ASSERT(!FLAG_precompiled_mode);
+    demangled ^=
+        Function::DemangleDynamicInvocationForwarderName(function_name);
+    function =
+        ResolveDynamicAnyArgs(zone, receiver_class, demangled, allow_add);
+    return function.IsNull() ? function.raw()
+                             : function.GetDynamicInvocationForwarder(
+                                   function_name, allow_add);
+  }
+#endif
+
   // Now look for an instance function whose name matches function_name
   // in the class.
-  Function& function = Function::Handle(zone);
   while (!cls.IsNull()) {
     function ^= cls.LookupDynamicFunction(function_name);
     if (!function.IsNull()) {
@@ -87,7 +101,7 @@
     // Getter invocation might actually be a method extraction.
     if (FLAG_lazy_dispatchers) {
       if (is_getter && function.IsNull()) {
-        function ^= cls.LookupDynamicFunction(field_name);
+        function ^= cls.LookupDynamicFunction(demangled);
         if (!function.IsNull() && allow_add) {
           // We were looking for the getter but found a method with the same
           // name. Create a method extractor and return it.
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 9a87566..38d5fa1 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -218,6 +218,13 @@
   Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args);
 }
 
+DEFINE_RUNTIME_ENTRY(ArgumentErrorUnboxedInt64, 0) {
+  // Unboxed value is passed through a dedicated slot in Thread.
+  int64_t unboxed_value = arguments.thread()->unboxed_int64_runtime_arg();
+  const Integer& value = Integer::Handle(zone, Integer::New(unboxed_value));
+  Exceptions::ThrowArgumentError(value);
+}
+
 // Allocation of a fixed length array of given element type.
 // This runtime entry is never called for allocating a List of a generic type,
 // because a prior run time call instantiates the element type if necessary.
@@ -1017,6 +1024,16 @@
                                    const String& target_name) {
   const Class& receiver_class = Class::Handle(receiver.clazz());
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  // Handle noSuchMethod for dyn:methodName by getting a noSuchMethod dispatcher
+  // (or a call-through getter for methodName).
+  if (Function::IsDynamicInvocationForwaderName(target_name)) {
+    const String& demangled = String::Handle(
+        Function::DemangleDynamicInvocationForwarderName(target_name));
+    return InlineCacheMissHelper(receiver, args_descriptor, demangled);
+  }
+#endif
+
   Function& result = Function::Handle();
   if (!ResolveCallThroughGetter(receiver, receiver_class, target_name,
                                 args_descriptor, &result)) {
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 2c5f7f5..65c2c0a 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -35,6 +35,7 @@
   V(PatchStaticCall)                                                           \
   V(RangeError)                                                                \
   V(NullError)                                                                 \
+  V(ArgumentErrorUnboxedInt64)                                                 \
   V(ReThrow)                                                                   \
   V(StackOverflow)                                                             \
   V(Throw)                                                                     \
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 26fe952..424ca0d 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -50,7 +50,7 @@
 
 static bool IsObjectStoreTypeId(intptr_t index) {
   // Check if this is a type which is stored in the object store.
-  return (index >= kObjectType && index <= kArrayType);
+  return (index >= kObjectType && index <= kStringStringTypeArguments);
 }
 
 static bool IsSplitClassId(intptr_t class_id) {
@@ -74,7 +74,7 @@
   return (class_id + kClassIdsOffset);
 }
 
-static RawType* GetType(ObjectStore* object_store, intptr_t index) {
+static RawObject* GetType(ObjectStore* object_store, intptr_t index) {
   switch (index) {
     case kObjectType:
       return object_store->object_type();
@@ -98,6 +98,16 @@
       return object_store->string_type();
     case kArrayType:
       return object_store->array_type();
+    case kIntTypeArguments:
+      return object_store->type_argument_int();
+    case kDoubleTypeArguments:
+      return object_store->type_argument_double();
+    case kStringTypeArguments:
+      return object_store->type_argument_string();
+    case kStringDynamicTypeArguments:
+      return object_store->type_argument_string_dynamic();
+    case kStringStringTypeArguments:
+      return object_store->type_argument_string_string();
     default:
       break;
   }
@@ -106,8 +116,7 @@
 }
 
 static intptr_t GetTypeIndex(ObjectStore* object_store,
-                             const RawType* raw_type) {
-  ASSERT(raw_type->IsHeapObject());
+                             const RawObject* raw_type) {
   if (raw_type == object_store->object_type()) {
     return kObjectType;
   } else if (raw_type == object_store->null_type()) {
@@ -130,6 +139,16 @@
     return kStringType;
   } else if (raw_type == object_store->array_type()) {
     return kArrayType;
+  } else if (raw_type == object_store->type_argument_int()) {
+    return kIntTypeArguments;
+  } else if (raw_type == object_store->type_argument_double()) {
+    return kDoubleTypeArguments;
+  } else if (raw_type == object_store->type_argument_string()) {
+    return kStringTypeArguments;
+  } else if (raw_type == object_store->type_argument_string_dynamic()) {
+    return kStringDynamicTypeArguments;
+  } else if (raw_type == object_store->type_argument_string_string()) {
+    return kStringStringTypeArguments;
   }
   return kInvalidIndex;
 }
@@ -579,7 +598,11 @@
       offset += kWordSize;
     }
     if (RawObject::IsCanonical(tags)) {
-      *result = result->CheckAndCanonicalize(thread(), NULL);
+      const char* error_str = NULL;
+      *result = result->CheckAndCanonicalize(thread(), &error_str);
+      if (error_str != NULL) {
+        FATAL1("Failed to canonicalize %s\n", error_str);
+      }
       ASSERT(!result->IsNull());
     }
   }
@@ -1186,8 +1209,7 @@
   }
 
   // Now check it is a preinitialized type object.
-  RawType* raw_type = reinterpret_cast<RawType*>(rawobj);
-  intptr_t index = GetTypeIndex(object_store(), raw_type);
+  intptr_t index = GetTypeIndex(object_store(), rawobj);
   if (index != kInvalidIndex) {
     WriteIndexedObject(index);
     return true;
diff --git a/runtime/vm/snapshot_ids.h b/runtime/vm/snapshot_ids.h
index d767648..c4fa6b7 100644
--- a/runtime/vm/snapshot_ids.h
+++ b/runtime/vm/snapshot_ids.h
@@ -42,6 +42,11 @@
   kBoolType,
   kStringType,
   kArrayType,
+  kIntTypeArguments,
+  kDoubleTypeArguments,
+  kStringTypeArguments,
+  kStringDynamicTypeArguments,
+  kStringStringTypeArguments,
   kEmptyTypeArguments,
 
   kExtractorParameterTypes,
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 50e5b36..d901830 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -367,6 +367,7 @@
   V(GetterPrefix, "get:")                                                      \
   V(SetterPrefix, "set:")                                                      \
   V(InitPrefix, "init:")                                                       \
+  V(DynamicPrefix, "dyn:")                                                     \
   V(Index, "index")                                                            \
   V(DartScheme, "dart:")                                                       \
   V(DartSchemePrivate, "dart:_")                                               \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 5d62829..c04d527 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -69,6 +69,7 @@
       vm_tag_(0),
       task_kind_(kUnknownTask),
       async_stack_trace_(StackTrace::null()),
+      unboxed_int64_runtime_arg_(0),
       dart_stream_(NULL),
       os_thread_(NULL),
       thread_lock_(new Monitor()),
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index eb81ca54..d8f2792 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -564,6 +564,16 @@
   void set_vm_tag(uword tag) { vm_tag_ = tag; }
   static intptr_t vm_tag_offset() { return OFFSET_OF(Thread, vm_tag_); }
 
+  int64_t unboxed_int64_runtime_arg() const {
+    return unboxed_int64_runtime_arg_;
+  }
+  void set_unboxed_int64_runtime_arg(int64_t value) {
+    unboxed_int64_runtime_arg_ = value;
+  }
+  static intptr_t unboxed_int64_runtime_arg_offset() {
+    return OFFSET_OF(Thread, unboxed_int64_runtime_arg_);
+  }
+
   RawGrowableObjectArray* pending_functions();
   void clear_pending_functions();
 
@@ -788,6 +798,12 @@
   uword vm_tag_;
   TaskKind task_kind_;
   RawStackTrace* async_stack_trace_;
+  // Memory location dedicated for passing unboxed int64 values from
+  // generated code to runtime.
+  // TODO(dartbug.com/33549): Clean this up when unboxed values
+  // could be passed as arguments.
+  int64_t unboxed_int64_runtime_arg_;
+
 // State that is cached in the TLS for fast access in generated code.
 #define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value)      \
   type_name member_name;
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 836fa3f..c065f34 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -233,7 +233,9 @@
                                          const uint8_t** kernel_buffer,
                                          intptr_t* kernel_buffer_size,
                                          bool incrementally,
-                                         bool allow_compile_errors) {
+                                         bool allow_compile_errors,
+                                         const char* multiroot_filepaths,
+                                         const char* multiroot_scheme) {
   // clang-format off
   Dart_SourceFile sourcefiles[] = {
     {
@@ -245,7 +247,8 @@
   // clang-format on
   return CompileTestScriptWithDFE(
       url, sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
-      kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors);
+      kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors,
+      multiroot_filepaths, multiroot_scheme);
 }
 
 #if 0
@@ -303,12 +306,15 @@
                                          const uint8_t** kernel_buffer,
                                          intptr_t* kernel_buffer_size,
                                          bool incrementally,
-                                         bool allow_compile_errors) {
+                                         bool allow_compile_errors,
+                                         const char* multiroot_filepaths,
+                                         const char* multiroot_scheme) {
   Zone* zone = Thread::Current()->zone();
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
       url, FLAG_strong ? platform_strong_dill : platform_dill,
       FLAG_strong ? platform_strong_dill_size : platform_dill_size,
-      sourcefiles_count, sourcefiles, incrementally, NULL);
+      sourcefiles_count, sourcefiles, incrementally, NULL, multiroot_filepaths,
+      multiroot_scheme);
   return ValidateCompilationResult(zone, compilation_result, kernel_buffer,
                                    kernel_buffer_size, allow_compile_errors);
 }
@@ -546,15 +552,20 @@
                                             Dart_NativeEntryResolver resolver,
                                             bool finalize,
                                             bool incrementally,
-                                            bool allow_compile_errors) {
+                                            bool allow_compile_errors,
+                                            const char* entry_script_uri,
+                                            const char* multiroot_filepaths,
+                                            const char* multiroot_scheme) {
   // First script is the main script.
   Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
   EXPECT_VALID(result);
   const uint8_t* kernel_buffer = NULL;
   intptr_t kernel_buffer_size = 0;
   char* error = TestCase::CompileTestScriptWithDFE(
-      sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
-      &kernel_buffer_size, incrementally, allow_compile_errors);
+      entry_script_uri != NULL ? entry_script_uri : sourcefiles[0].uri,
+      sourcefiles_count, sourcefiles, &kernel_buffer, &kernel_buffer_size,
+      incrementally, allow_compile_errors, multiroot_filepaths,
+      multiroot_scheme);
   if ((kernel_buffer == NULL) && error != NULL) {
     return Dart_NewApiError(error);
   }
@@ -564,7 +575,8 @@
   DART_CHECK_VALID(lib);
 
   // BOGUS: Kernel doesn't correctly represent the root library.
-  lib = Dart_LookupLibrary(Dart_NewStringFromCString(sourcefiles[0].uri));
+  lib = Dart_LookupLibrary(Dart_NewStringFromCString(
+      entry_script_uri != NULL ? entry_script_uri : sourcefiles[0].uri));
   DART_CHECK_VALID(lib);
   result = Dart_SetRootLibrary(lib);
   DART_CHECK_VALID(result);
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 5dd5122..7f41d26 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -319,14 +319,18 @@
                                         const uint8_t** kernel_buffer,
                                         intptr_t* kernel_buffer_size,
                                         bool incrementally = true,
-                                        bool allow_compile_errors = false);
+                                        bool allow_compile_errors = false,
+                                        const char* multiroot_filepaths = NULL,
+                                        const char* multiroot_scheme = NULL);
   static char* CompileTestScriptWithDFE(const char* url,
                                         int sourcefiles_count,
                                         Dart_SourceFile sourcefiles[],
                                         const uint8_t** kernel_buffer,
                                         intptr_t* kernel_buffer_size,
                                         bool incrementally = true,
-                                        bool allow_compile_errors = false);
+                                        bool allow_compile_errors = false,
+                                        const char* multiroot_filepaths = NULL,
+                                        const char* multiroot_scheme = NULL);
   static Dart_Handle LoadTestScript(const char* script,
                                     Dart_NativeEntryResolver resolver,
                                     const char* lib_uri = USER_TEST_URI,
@@ -346,7 +350,10 @@
       Dart_NativeEntryResolver resolver = NULL,
       bool finalize = true,
       bool incrementally = true,
-      bool allow_compile_errors = false);
+      bool allow_compile_errors = false,
+      const char* entry_script_uri = NULL,
+      const char* multiroot_filepaths = NULL,
+      const char* multiroot_scheme = NULL);
   static Dart_Handle LoadCoreTestScript(const char* script,
                                         Dart_NativeEntryResolver resolver);
 
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index 0b676c2..5bc755d 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -60,14 +60,14 @@
   const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE |
                          (is_executable ? ZX_VM_FLAG_PERM_EXECUTE : 0);
   uword address;
-  status = zx_vmar_map(zx_vmar_root_self(), 0, vmo, 0, size, flags, &address);
+  status = zx_vmar_map_old(zx_vmar_root_self(), 0, vmo, 0, size, flags, &address);
   zx_handle_close(vmo);
   if (status != ZX_OK) {
-    LOG_ERR("zx_vmar_map(%ld, %u) failed: %s\n", size, flags,
+    LOG_ERR("zx_vmar_map_old(%ld, %u) failed: %s\n", size, flags,
             zx_status_get_string(status));
     return NULL;
   }
-  LOG_INFO("zx_vmar_map(%ld, %u) success\n", size, flags);
+  LOG_INFO("zx_vmar_map_old(%ld, %u) success\n", size, flags);
 
   MemoryRegion region(reinterpret_cast<void*>(address), size);
   return new VirtualMemory(region, region);
@@ -97,10 +97,10 @@
   const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE |
                          (is_executable ? ZX_VM_FLAG_PERM_EXECUTE : 0);
   uword base;
-  status = zx_vmar_map(vmar, 0u, vmo, 0u, allocated_size, flags, &base);
+  status = zx_vmar_map_old(vmar, 0u, vmo, 0u, allocated_size, flags, &base);
   zx_handle_close(vmo);
   if (status != ZX_OK) {
-    LOG_ERR("zx_vmar_map(%ld, %u) failed: %s\n", size, flags,
+    LOG_ERR("zx_vmar_map_old(%ld, %u) failed: %s\n", size, flags,
             zx_status_get_string(status));
     return NULL;
   }
@@ -180,13 +180,13 @@
              ZX_VM_FLAG_PERM_EXECUTE;
       break;
   }
-  zx_status_t status = zx_vmar_protect(zx_vmar_root_self(), page_address,
+  zx_status_t status = zx_vmar_protect_old(zx_vmar_root_self(), page_address,
                                        end_address - page_address, prot);
   if (status != ZX_OK) {
-    FATAL3("zx_vmar_protect(%lx, %lx) failed: %s\n", page_address,
+    FATAL3("zx_vmar_protect_old(%lx, %lx) failed: %s\n", page_address,
            end_address - page_address, zx_status_get_string(status));
   }
-  LOG_INFO("zx_vmar_protect(%lx, %lx, %x) success\n", page_address,
+  LOG_INFO("zx_vmar_protect_old(%lx, %lx, %x) success\n", page_address,
            end_address - page_address, prot);
 }
 
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index c84f526..226f959 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -46,7 +46,6 @@
 # ........dartdevk.dart.snapshot
 # ........kernel_worker.dart.snapshot
 # ........pub.dart.snapshot
-# ........pub2.dart.snapshot
 #.........resources/
 #...........dartdoc/
 #..............packages
@@ -134,10 +133,6 @@
     "pub",
     "../utils/pub",
   ],
-  [
-    "pub2",
-    "../utils/pub:pub2",
-  ],
 ]
 
 _full_sdk_snapshots = [
@@ -178,10 +173,6 @@
     "../utils/pub",
   ],
   [
-    "pub2",
-    "../utils/pub:pub2",
-  ],
-  [
     "kernel-service",
     "../utils/kernel-service",
   ],
diff --git a/sdk/bin/pub_sdk b/sdk/bin/pub_sdk
index 85d3b97..4d29878 100755
--- a/sdk/bin/pub_sdk
+++ b/sdk/bin/pub_sdk
@@ -42,9 +42,9 @@
 # Run the pub snapshot.
 DART="$BIN_DIR/dart"
 if array_contains "--no-preview-dart-2" "${VM_OPTIONS[@]}"; then
-  SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
-  exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
+  echo "Pub no longer supports Dart 1"
+  exit -1
 else
-  SNAPSHOT="$BIN_DIR/snapshots/pub2.dart.snapshot"
+  SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
   exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
 fi
diff --git a/sdk/bin/pub_sdk.bat b/sdk/bin/pub_sdk.bat
index 564e512..bde0e4a 100644
--- a/sdk/bin/pub_sdk.bat
+++ b/sdk/bin/pub_sdk.bat
@@ -29,9 +29,9 @@
 )
 
 if defined USING_DART_1 (
-  "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub.dart.snapshot" %*
+  echo "Pub no longer supports Dart 1"
 ) else (
-  "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub2.dart.snapshot" %*
+  "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub.dart.snapshot" %*
 )
 
 endlocal
diff --git a/sdk/lib/_http/websocket.dart b/sdk/lib/_http/websocket.dart
index 35f4690..64dbeb1 100644
--- a/sdk/lib/_http/websocket.dart
+++ b/sdk/lib/_http/websocket.dart
@@ -55,50 +55,38 @@
  * the options of WebSocket compression.
  */
 class CompressionOptions {
-  /**
-   * Default WebSocket Compression options.
-   * Compression will be enabled with the following options:
-   * clientNoContextTakeover: false
-   * serverNoContextTakeover: false
-   * clientMaxWindowBits: 15
-   * serverMaxWindowBits: 15
-   */
+  /// Default WebSocket Compression options.
+  ///
+  /// Compression will be enabled with the following options:
+  ///
+  /// * `clientNoContextTakeover`: false
+  /// * `serverNoContextTakeover`: false
+  /// * `clientMaxWindowBits`: 15
+  /// * `serverMaxWindowBits`: 15
   static const CompressionOptions compressionDefault =
       const CompressionOptions();
   @Deprecated("Use compressionDefault instead")
   static const CompressionOptions DEFAULT = compressionDefault;
 
-  /**
-   * Disables WebSocket Compression.
-   */
+  /// Disables WebSocket Compression.
   static const CompressionOptions compressionOff =
       const CompressionOptions(enabled: false);
   @Deprecated("Use compressionOff instead")
   static const CompressionOptions OFF = compressionOff;
 
-  /**
-   * Control whether the client will reuse it's compression instances.
-   */
+  /// Controls whether the client will reuse its compression instances.
   final bool clientNoContextTakeover;
 
-  /**
-   * Control whether the server will reuse it's compression instances.
-   */
+  /// Controls whether the server will reuse its compression instances.
   final bool serverNoContextTakeover;
 
-  /**
-   * Sets the Max Window Bits for the Client.
-   */
+  /// Determines the max window bits for the client.
   final int clientMaxWindowBits;
 
-  /**
-   * Sets the Max Window Bits for the Server.
-   */
+  /// Determines the max window bits for the server.
   final int serverMaxWindowBits;
 
-  /**
-   * Enables or disables WebSocket compression.
-   */
+  /// Enables or disables WebSocket compression.
   final bool enabled;
 
   const CompressionOptions(
@@ -109,10 +97,12 @@
       this.enabled: true});
 
   /// Parses list of requested server headers to return server compression
-  /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will
-  /// attempt to use value from headers. Defaults to
-  /// [WebSocket.DEFAULT_WINDOW_BITS]. Returns a [_CompressionMaxWindowBits]
-  /// object which contains the response headers and negotiated max window bits.
+  /// response headers.
+  ///
+  /// Uses [serverMaxWindowBits] value if set, otherwise will attempt to use
+  /// value from headers. Defaults to [WebSocket.DEFAULT_WINDOW_BITS]. Returns a
+  /// [_CompressionMaxWindowBits] object which contains the response headers and
+  /// negotiated max window bits.
   _CompressionMaxWindowBits _createServerResponseHeader(HeaderValue requested) {
     var info = new _CompressionMaxWindowBits();
 
@@ -161,14 +151,16 @@
     return info;
   }
 
-  /// Create a Compression Header. If [requested] is null or contains
-  /// client request headers, returns Client compression request headers with
-  /// default settings for `client_max_window_bits` header value.
-  /// If [requested] contains server response headers this method returns
-  /// a Server compression response header negotiating the max window bits
-  /// for both client and server as requested server_max_window_bits value.
-  /// This method returns a [_CompressionMaxWindowBits] object with the
-  /// response headers and negotiated maxWindowBits value.
+  /// Create a Compression Header.
+  ///
+  /// If [requested] is null or contains client request headers, returns Client
+  /// compression request headers with default settings for
+  /// `client_max_window_bits` header value.  If [requested] contains server
+  /// response headers this method returns a Server compression response header
+  /// negotiating the max window bits for both client and server as requested
+  /// `server_max_window_bits` value.  This method returns a
+  /// [_CompressionMaxWindowBits] object with the response headers and
+  /// negotiated `maxWindowBits` value.
   _CompressionMaxWindowBits _createHeader([HeaderValue requested]) {
     var info = new _CompressionMaxWindowBits("", 0);
     if (!enabled) {
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index f875f0c..dad3151 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -1466,10 +1466,10 @@
   }
   void Function(Object) unaryOnError;
   void Function(Object, StackTrace) binaryOnError;
-  if (onError is void Function(Object)) {
-    unaryOnError = onError;
-  } else if (onError is void Function(Object, StackTrace)) {
+  if (onError is void Function(Object, StackTrace)) {
     binaryOnError = onError;
+  } else if (onError is void Function(Object)) {
+    unaryOnError = onError;
   } else {
     throw new ArgumentError("onError callback must take either an Object "
         "(the error), or both an Object (the error) and a StackTrace.");
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e7fe7d4..97735c9 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -11641,7 +11641,10 @@
     implements ElementList<E>, NodeListWrapper {
   final List<Node> _nodeList;
 
-  _FrozenElementList._wrap(this._nodeList);
+  _FrozenElementList._wrap(this._nodeList) {
+    assert(this._nodeList.every((element) => element is E),
+        "Query expects only HTML elements of type $E but found ${this._nodeList.firstWhere((e) => e is! E)}");
+  }
 
   int get length => _nodeList.length;
 
@@ -13958,8 +13961,6 @@
   @JSName('removeAttributeNS')
   void _removeAttributeNS(String namespaceURI, String localName) native;
 
-  void requestFullscreen() native;
-
   void requestPointerLock() native;
 
   void scroll([options_OR_x, num y]) {
@@ -14052,6 +14053,21 @@
 
   void setPointerCapture(int pointerId) native;
 
+  @JSName('webkitRequestFullscreen')
+  /**
+   * Displays this element fullscreen.
+   *
+   * ## Other resources
+   *
+   * * [Using the fullscreen
+   *   API](http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
+   *   tutorial from WebPlatform.org.
+   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
+   */
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  void requestFullscreen() native;
+
   // From ChildNode
 
   void after(Object nodes) native;
@@ -25674,7 +25690,8 @@
 
   List<RtcRtpSender> getSenders() native;
 
-  Future getStats() => promiseToFuture<dynamic>(JS("", "#.getStats()", this));
+  Future<RtcStatsReport> getStats() =>
+      promiseToFuture<RtcStatsReport>(JS("", "#.getStats()", this));
 
   void removeStream(MediaStream stream) native;
 
@@ -27346,8 +27363,6 @@
 
 @Native("SpeechSynthesis")
 class SpeechSynthesis extends EventTarget {
-  @DomName('SpeechSynthesis.getVoices')
-  @DocsEditable()
   List<SpeechSynthesisVoice> getVoices() {
     List<SpeechSynthesisVoice> voices = _getVoices();
     if (voices.length > 0) applyExtension('SpeechSynthesisVoice', voices[0]);
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index 852a267..10f3c39 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -53,16 +53,14 @@
   /** Constant used to indicate that no OS error code is available. */
   static const int noErrorCode = -1;
 
-  /**
-    * Error message supplied by the operating system. null if no message is
-    * associated with the error.
-    */
+  /// Error message supplied by the operating system. This may be `null` or
+  /// empty if no message is associated with the error.
   final String message;
 
-  /**
-    * Error code supplied by the operating system. Will have the value
-    * [noErrorCode] if there is no error code associated with the error.
-    */
+  /// Error code supplied by the operating system.
+  ///
+  /// Will have the value [OSError.noErrorCode] if there is no error code
+  /// associated with the error.
   final int errorCode;
 
   /** Creates an OSError object from a message and an errorCode. */
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 236aa2b..08995da 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -365,8 +365,8 @@
 /**
  * Get the last-accessed time of the file.
  *
- * Returns the date and time when the file was last accessed, if the
- * information is available.
+ * Returns a `Future<DateTime>` that completes with the date and time when the
+ * file was last accessed, if the information is available.
  *
  * Throws a [FileSystemException] if the operation fails.
  */
@@ -386,6 +386,8 @@
   /**
    * Modifies the time the file was last accessed.
    *
+   * Returns a [Future] that completes once the operation has completed.
+   *
    * Throws a [FileSystemException] if the time cannot be set.
    */
   Future setLastAccessed(DateTime time);
@@ -400,8 +402,8 @@
 /**
  * Get the last-modified time of the file.
  *
- * Returns the date and time when the file was last modified, if the
- * information is available.
+ * Returns a `Future<DateTime>` that completes with the date and time when the
+ * file was last modified, if the information is available.
  *
  * Throws a [FileSystemException] if the operation fails.
  */
@@ -421,6 +423,8 @@
   /**
    * Modifies the time the file was last modified.
    *
+   * Returns a [Future] that completes once the operation has completed.
+   *
    * Throws a [FileSystemException] if the time cannot be set.
    */
   Future setLastModified(DateTime time);
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index bc7e88a..6131c0e 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -107,32 +107,27 @@
  * For example, here's a mini server that listens for 'ws' data
  * on a WebSocket:
  *
- *     runZoned(() {
- *       HttpServer.bind('127.0.0.1', 4040).then((server) {
- *         server.listen((HttpRequest req) {
- *           if (req.uri.path == '/ws') {
- *             WebSocketTransformer.upgrade(req).then((socket) {
- *               socket.listen(handleMsg);
- *             });
- *           }
- *         });
+ *     runZoned(() async {
+ *       var server = await HttpServer.bind('127.0.0.1', 4040);
+ *       server.listen((HttpRequest req) async {
+ *         if (req.uri.path == '/ws') {
+ *           var socket = await WebSocketTransformer.upgrade(req);
+ *           socket.listen(handleMsg);
+ *         }
  *       });
- *     },
- *     onError: (e) => print("An error occurred."));
+ *     }, onError: (e) => print("An error occurred."));
  *
  * The client connects to the WebSocket using the `connect()` method
  * and a URI that uses the Web Socket protocol.
  * The client can write to the WebSocket with the `add()` method.
  * For example,
  *
- *     WebSocket.connect('ws://127.0.0.1:4040/ws').then((socket) {
- *       socket.add('Hello, World!');
- *     });
+ *     var socket = await WebSocket.connect('ws://127.0.0.1:4040/ws');
+ *     socket.add('Hello, World!');
  *
  * Check out the
- * [dartiverse_search](https://github.com/dart-lang/sample-dartiverse-search)
- * sample for a client/server pair that uses
- * WebSockets to communicate.
+ * [websocket_sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/websockets/basics)
+ * app, which uses WebSockets to communicate with a server.
  *
  * ## Socket and ServerSocket
  *
diff --git a/sdk/lib/math/random.dart b/sdk/lib/math/random.dart
index 47c5582..99906cd 100644
--- a/sdk/lib/math/random.dart
+++ b/sdk/lib/math/random.dart
@@ -4,15 +4,12 @@
 
 part of dart.math;
 
-/**
- * A generator of random bool, int, or double values.
- *
- * The default implementation supplies a stream of
- * pseudo-random bits that are not suitable for cryptographic purposes.
- *
- * Use the Random.secure() constructor for cryptographic
- * purposes.
- */
+/// A generator of random bool, int, or double values.
+///
+/// The default implementation supplies a stream of pseudo-random bits that are
+/// not suitable for cryptographic purposes.
+///
+/// Use the [Random.secure]() constructor for cryptographic purposes.
 abstract class Random {
   /**
    * Creates a random number generator.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 750ea6a..60298fa 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -7044,13 +7044,28 @@
 Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
 LayoutTests/fast/canvas/gradient-addColorStop-with-invalid-color_t01: Pass, RuntimeError
 LayoutTests/fast/canvas/rgba-parsing_t01: Pass, RuntimeError
+LayoutTests/fast/files/blob-parts-slice-test_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LayoutTests/fast/files/blob-slice-overflow_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LayoutTests/fast/files/blob-slice-test_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/Duration_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/Duration_A02_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inDays_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inHours_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inMinutes_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
 LibTest/core/double/isInfinite_A01_t03: CompileTimeError # Larger than 64 bit int
+LibTest/core/double/operator_GE_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/double/operator_GT_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/double/operator_LE_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/double/operator_LT_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 LibTest/core/int/abs_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/ceil_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/floor_A01_t01: CompileTimeError # Larger than 64 bit int
+LibTest/core/int/hashCode_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 LibTest/core/int/isInfinite_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/isNaN_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/isNegative_A01_t01: CompileTimeError # Larger than 64 bit int
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 4f64cd4..7eabb3c 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -73,6 +73,8 @@
 Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError
 Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError
+Language/Generics/syntax_t02: CompileTimeError
+Language/Generics/syntax_t03: CompileTimeError
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_members_t01: CompileTimeError
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: CompileTimeError
 Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: CompileTimeError
@@ -1107,8 +1109,6 @@
 Language/Types/Static_Types/malformed_type_t04: CompileTimeError
 Language/Types/Static_Types/malformed_type_t05: CompileTimeError
 Language/Types/Static_Types/malformed_type_t06: CompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: Crash
-Language/Types/Type_Declarations/Typedef/self_reference_t09: Crash
 Language/Types/Type_Declarations/Typedef/syntax_t01: CompileTimeError
 Language/Types/Type_Void/syntax_t08: MissingCompileTimeError
 Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
diff --git a/tests/compiler/dart2js/closure/data/instantiation2.dart b/tests/compiler/dart2js/closure/data/instantiation2.dart
index 4fd81d1..dc0c408 100644
--- a/tests/compiler/dart2js/closure/data/instantiation2.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation2.dart
@@ -12,7 +12,8 @@
   method() {
     return
         /*kernel.hasThis*/
-        /*!kernel.fields=[this],free=[this],hasThis*/
+        /*strong.fields=[this],free=[this],hasThis*/
+        /*omit.fields=[this],free=[this],hasThis*/
         () {
       F<S> c = f;
       return c;
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
index 52788fc..5d3b976 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
@@ -6,7 +6,8 @@
 
 @NoInline()
 method<T>() {
-  /*!strong.*/
+  /*kernel.*/
+  /*omit.*/
   /*strong.fields=[T],free=[T]*/
   dynamic local() => <T>[];
   return local;
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
index 89fe422..a89aa0e 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
@@ -9,7 +9,8 @@
   /*element: A.method:hasThis*/
   @NoInline()
   method() {
-    /*!strong.hasThis*/
+    /*kernel.hasThis*/
+    /*omit.hasThis*/
     /*strong.fields=[this],free=[this],hasThis*/
     dynamic local() => <T>[];
     return local;
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
index 6cfb9e9..db1a485 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
@@ -6,7 +6,8 @@
 
 @NoInline()
 method<T>() {
-  /*!strong.*/
+  /*kernel.*/
+  /*omit.*/
   /*strong.fields=[T],free=[T]*/
   dynamic local() => <T, int>{};
   return local;
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
index 146de88..dfc0fa5 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
@@ -9,7 +9,8 @@
   /*element: A.method:hasThis*/
   @NoInline()
   method() {
-    /*!strong.hasThis*/
+    /*kernel.hasThis*/
+    /*omit.hasThis*/
     /*strong.fields=[this],free=[this],hasThis*/
     dynamic local() => <T, int>{};
     return local;
diff --git a/tests/compiler/dart2js/closure/data/test_type.dart b/tests/compiler/dart2js/closure/data/test_type.dart
index 1cd8aef..63cd76b 100644
--- a/tests/compiler/dart2js/closure/data/test_type.dart
+++ b/tests/compiler/dart2js/closure/data/test_type.dart
@@ -38,7 +38,8 @@
 class Class3<T> {
   /*element: Class3.method3:hasThis*/
   method3(dynamic o) {
-    /*!strong.fields=[o],free=[o],hasThis*/
+    /*kernel.fields=[o],free=[o],hasThis*/
+    /*omit.fields=[o],free=[o],hasThis*/
     /*strong.fields=[o,this],free=[o,this],hasThis*/
     T local() => o;
     return local;
diff --git a/tests/compiler/dart2js/closure/data/type_annotations.dart b/tests/compiler/dart2js/closure/data/type_annotations.dart
index a891048..cf9d582 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations.dart
@@ -48,7 +48,8 @@
 class Class2<T> {
   /*element: Class2.method2:hasThis*/
   method2() {
-    /*!strong.hasThis*/
+    /*kernel.hasThis*/
+    /*omit.hasThis*/
     /*strong.fields=[this],free=[this],hasThis*/
     dynamic local(T t) => t;
     return local;
@@ -63,7 +64,8 @@
 class Class3<T> {
   /*element: Class3.method3:hasThis*/
   method3(dynamic o) {
-    /*!strong.fields=[o],free=[o],hasThis*/
+    /*kernel.fields=[o],free=[o],hasThis*/
+    /*omit.fields=[o],free=[o],hasThis*/
     /*strong.fields=[o,this],free=[o,this],hasThis*/
     T local() => o;
     return local;
@@ -106,7 +108,8 @@
 class Class6<T> {
   /*element: Class6.method6:hasThis*/
   method6() {
-    /*!strong.hasThis*/
+    /*kernel.hasThis*/
+    /*omit.hasThis*/
     /*strong.fields=[this],free=[this],hasThis*/
     dynamic local(T t) {
       /*fields=[t],free=[t],hasThis*/
@@ -126,7 +129,8 @@
 class Class7<T> {
   /*element: Class7.method7:hasThis*/
   method7(dynamic o) {
-    /*!strong.fields=[o],free=[o],hasThis*/
+    /*kernel.fields=[o],free=[o],hasThis*/
+    /*omit.fields=[o],free=[o],hasThis*/
     /*strong.fields=[o,this],free=[o,this],hasThis*/
     T local() {
       /*fields=[o],free=[o],hasThis*/
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index 40bbeb5..d4323ed 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -14,7 +14,7 @@
 import '../inference/type_mask_test_helper.dart';
 import '../memory_compiler.dart';
 
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   'main.dart': r"""
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
index b69a0fd..598996d 100644
--- a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
@@ -47,6 +47,6 @@
   asyncTest(() async {
     // The [numberOfParameters] value is somewhat arbitrary.
     print('--test from kernel------------------------------------------------');
-    await runTests(numberOfParameters: 2000);
+    await runTests(numberOfParameters: 1000);
   });
 }
diff --git a/tests/compiler/dart2js/deferred/closures_test.dart b/tests/compiler/dart2js/deferred/closures_test.dart
index f8d7dcc..ea6148b 100644
--- a/tests/compiler/dart2js/deferred/closures_test.dart
+++ b/tests/compiler/dart2js/deferred/closures_test.dart
@@ -36,7 +36,7 @@
 }
 
 // Make sure that deferred constants are not inlined into the main hunk.
-const Map sources = const {
+const Map<String, String> sources = const {
   "main.dart": """
     import 'lib.dart' deferred as lib;
 
diff --git a/tests/compiler/dart2js/deferred/custom_element_test.dart b/tests/compiler/dart2js/deferred/custom_element_test.dart
index d2e6236..3b39cfd 100644
--- a/tests/compiler/dart2js/deferred/custom_element_test.dart
+++ b/tests/compiler/dart2js/deferred/custom_element_test.dart
@@ -38,7 +38,7 @@
 // The main library imports a file defining a custom element.
 // Registering this class implicitly causes the constructors to be
 // live. Check that this is handled.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "lib.dart" deferred as a;
 import 'dart:html';
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index e65d0c2..e4d9e05 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
@@ -91,7 +91,7 @@
 }
 
 // Make sure that deferred constants are not inlined into the main hunk.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "dart:async";
 
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
index 25c48e3..4c3db2a 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
@@ -51,7 +51,7 @@
 }
 
 // Make sure that deferred constants are not inlined into the main hunk.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "dart:async";
 
diff --git a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
index 6b38487..f016ac2 100644
--- a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
@@ -39,7 +39,7 @@
 // We force additional runtime type support to be output for A by instantiating
 // it with a type argument, and testing for the type. The extra support should
 // go to the deferred hunk.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import 'lib.dart' deferred as lib show f, A, instance;
 
diff --git a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
index 4ed0b6d..4e72c4c 100644
--- a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
@@ -59,7 +59,7 @@
 // lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
 // uses lib4.bar2.  So two output units should be created for lib4, one for each
 // import.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import 'lib.dart' deferred as lib;
 
diff --git a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
index f3aecaa..1a67951 100644
--- a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
@@ -41,7 +41,7 @@
 
 // Make sure that the implicit references to supers are found by the deferred
 // loading dependency mechanism.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "lib.dart" deferred as lib;
 
diff --git a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
index 6c53fcf..789baf0 100644
--- a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
+++ b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
@@ -64,7 +64,7 @@
 
 // Make sure that empty functions are inlined and that functions from
 // main also are inlined (assuming normal heuristics).
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "dart:async";
 
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
index 985ad2a..e953c59 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
@@ -38,7 +38,7 @@
 // lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
 // uses lib4.bar2.  So two output units should be created for lib4, one for each
 // import.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "dart:async";
 
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
index f20cef3..8c34df7 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
@@ -82,7 +82,7 @@
 // lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
 // uses lib4.bar2.  So two output units should be created for lib4, one for each
 // import.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import "dart:async";
 import 'lib1.dart' deferred as lib1;
diff --git a/tests/compiler/dart2js/deferred/load_mapping_test.dart b/tests/compiler/dart2js/deferred/load_mapping_test.dart
index c5de70f..6efef69 100644
--- a/tests/compiler/dart2js/deferred/load_mapping_test.dart
+++ b/tests/compiler/dart2js/deferred/load_mapping_test.dart
@@ -31,7 +31,7 @@
   });
 }
 
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   "main.dart": """
 import 'dart:convert' deferred as convert;
 import 'lib1.dart' deferred as lib1;
diff --git a/tests/compiler/dart2js/deferred/not_in_main_test.dart b/tests/compiler/dart2js/deferred/not_in_main_test.dart
index a259716..93c9c27 100644
--- a/tests/compiler/dart2js/deferred/not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred/not_in_main_test.dart
@@ -52,7 +52,7 @@
 
 // lib1 imports lib2 deferred. But mainlib never uses DeferredLibrary.
 // Test that this case works.
-const Map TEST1 = const {
+const Map<String, String> TEST1 = const {
   "main.dart": """
 library mainlib;
 
@@ -80,7 +80,7 @@
 
 // main indirectly uses class A from shared. A should still be included in the
 // main fragment.
-const Map TEST2 = const {
+const Map<String, String> TEST2 = const {
   "main.dart": """
 import 'def.dart' deferred as def;
 import 'shared.dart';
diff --git a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
index 67b8c44..6741047 100644
--- a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
@@ -27,7 +27,7 @@
   });
 }
 
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   'main.dart': """
 class Greeting {
   final message;
diff --git a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
index 9cfb6cb..39bbc85 100644
--- a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/compiler.dart' as compiler;
 import 'package:compiler/src/filenames.dart';
 
-const SOURCES = const {
+const Map<String, String> SOURCES = const {
   "/main.dart": """
     import "foo.dart";
     main() => foo();
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 5b10bee..7d543c7 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -91,7 +91,8 @@
           break;
         case 'NoSuchMethodError':
           onTest(testMarker, testType);
-          null.foo;
+          dynamic n;
+          n.foo;
           break;
         case '':
           onTest(testMarker, testType);
@@ -209,7 +210,8 @@
 
   entry.enableWriteString = false;
 
-  Map _expectedExitCode({bool beforeRun: false, bool fatalWarnings: false}) {
+  Map<String, int> _expectedExitCode(
+      {bool beforeRun: false, bool fatalWarnings: false}) {
     if (beforeRun) {
       return {
         '': 0,
diff --git a/tests/compiler/dart2js/end_to_end/library_env_test.dart b/tests/compiler/dart2js/end_to_end/library_env_test.dart
index 85a4498..fc9b41e 100644
--- a/tests/compiler/dart2js/end_to_end/library_env_test.dart
+++ b/tests/compiler/dart2js/end_to_end/library_env_test.dart
@@ -79,7 +79,7 @@
 final platformDir = Uri.parse(Platform.resolvedExecutable).resolve('.');
 
 class CustomCompiler extends CompilerImpl {
-  CustomCompiler(options, environment)
+  CustomCompiler(List<String> options, Map<String, String> environment)
       : super(
             const DummyCompilerInput(),
             const NullCompilerOutput(),
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index a077442..15dd004 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -452,6 +452,31 @@
     }
     return _computedDataForEachFile[file];
   }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('MemberAnnotations(');
+    String comma = '';
+    if (_computedDataForEachFile.isNotEmpty &&
+        (_computedDataForEachFile.length > 1 ||
+            _computedDataForEachFile.values.single.isNotEmpty)) {
+      sb.write('data:{');
+      _computedDataForEachFile.forEach((Uri uri, Map<Id, DataType> data) {
+        sb.write(comma);
+        sb.write('$uri:');
+        sb.write(data);
+        comma = ',';
+      });
+      sb.write('}');
+    }
+    if (globalData.isNotEmpty) {
+      sb.write(comma);
+      sb.write('global:');
+      sb.write(globalData);
+    }
+    sb.write(')');
+    return sb.toString();
+  }
 }
 
 typedef void Callback();
@@ -501,10 +526,12 @@
     int end = entities.length * (shardIndex + 1) ~/ shards;
     entities = entities.sublist(start, end);
   }
+  int testCount = 0;
   for (FileSystemEntity entity in entities) {
     String name = entity.uri.pathSegments.last;
     if (args.isNotEmpty && !args.contains(name) && !continued) continue;
     if (shouldContinue) continued = true;
+    testCount++;
     List<String> testOptions = options.toList();
     bool strongModeOnlyTest = false;
     bool trustTypeAnnotations = false;
@@ -652,6 +679,7 @@
     }
   }
   Expect.isFalse(hasFailures, 'Errors found.');
+  Expect.isTrue(testCount > 0, "No files were tested.");
 }
 
 final Set<String> userFiles = new Set<String>();
diff --git a/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
new file mode 100644
index 0000000..8b629ec
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
@@ -0,0 +1,117 @@
+// 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.
+
+main() {
+  staticCalledInForLoop();
+  staticCalledInForInLoop();
+  staticCalledInWhileLoop();
+  staticCalledInDoLoop();
+  instanceCalledInForLoop();
+  staticCalledIndirectlyInForLoop();
+}
+
+/*element: _staticCalledInForLoop:loop*/
+_staticCalledInForLoop() {}
+
+/*element: _staticNotCalledInForLoop:*/
+_staticNotCalledInForLoop() {}
+
+/*element: staticCalledInForLoop:*/
+staticCalledInForLoop() {
+  _staticNotCalledInForLoop();
+  for (int i = 0; i < 10; i++) {
+    _staticCalledInForLoop();
+  }
+  _staticNotCalledInForLoop();
+}
+
+/*element: _staticCalledInForInLoop:loop*/
+_staticCalledInForInLoop() {}
+
+/*element: _staticNotCalledInForInLoop:*/
+_staticNotCalledInForInLoop() {}
+
+/*element: staticCalledInForInLoop:*/
+staticCalledInForInLoop() {
+  _staticNotCalledInForInLoop();
+  // ignore: unused_local_variable
+  for (int i in [1, 2, 3]) {
+    _staticCalledInForInLoop();
+  }
+  _staticNotCalledInForInLoop();
+}
+
+/*element: _staticCalledInWhileLoop:loop*/
+_staticCalledInWhileLoop() {}
+
+/*element: _staticNotCalledInWhileLoop:*/
+_staticNotCalledInWhileLoop() {}
+
+/*element: staticCalledInWhileLoop:*/
+staticCalledInWhileLoop() {
+  int i = 0;
+  _staticNotCalledInWhileLoop();
+  while (i < 10) {
+    _staticCalledInWhileLoop();
+    i++;
+  }
+  _staticNotCalledInWhileLoop();
+}
+
+/*element: _staticCalledInDoLoop:loop*/
+_staticCalledInDoLoop() {}
+
+/*element: _staticNotCalledInDoLoop:*/
+_staticNotCalledInDoLoop() {}
+
+/*element: staticCalledInDoLoop:*/
+staticCalledInDoLoop() {
+  int i = 0;
+  _staticNotCalledInDoLoop();
+  do {
+    _staticCalledInDoLoop();
+    i++;
+  } while (i <= 10);
+  _staticNotCalledInDoLoop();
+}
+
+class Class {
+  /*element: Class.constructorCalledInForLoop:loop*/
+  Class.constructorCalledInForLoop();
+
+  /*element: Class.constructorNotCalledInForLoop:*/
+  Class.constructorNotCalledInForLoop();
+
+  // TODO(johnniwinther): Should we track instance calls in loops?
+  /*element: Class.instanceCalledInForLoop:*/
+  instanceCalledInForLoop() {}
+
+  /*element: Class.instanceNotCalledInForLoop:*/
+  instanceNotCalledInForLoop() {}
+}
+
+/*element: instanceCalledInForLoop:*/
+instanceCalledInForLoop() {
+  var c = new Class.constructorNotCalledInForLoop();
+  c.instanceNotCalledInForLoop();
+  for (int i = 0; i < 10; i++) {
+    new Class.constructorCalledInForLoop();
+    c.instanceCalledInForLoop();
+  }
+  c.instanceNotCalledInForLoop();
+}
+
+// TODO(johnniwinther): Should we track indirect calls in loops?
+/*element: _staticCalledIndirectlyInForLoop:*/
+_staticCalledIndirectlyInForLoop() {}
+
+/*element: _staticCalledIndirectlyInForLoopHelper:loop*/
+_staticCalledIndirectlyInForLoopHelper() => _staticCalledIndirectlyInForLoop();
+
+/*element: staticCalledIndirectlyInForLoop:*/
+staticCalledIndirectlyInForLoop() {
+  for (int i = 0; i < 10; i++) {
+    _staticCalledIndirectlyInForLoopHelper();
+  }
+}
diff --git a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
new file mode 100644
index 0000000..4d24402
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data/cannot_throw.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.
+
+// ignore: import_internal_library
+import 'dart:_js_helper';
+
+main() {
+  noThrows();
+  noInline();
+  throws();
+}
+
+// We trust the annotation.
+/*element: noThrows:no-throw*/
+@NoThrows()
+@NoInline() // Required for the @NoThrows() annotation.
+noThrows() => throw '';
+
+// Check that the @NoInline() annotation has no impact on its own.
+/*element: noInline:*/
+@NoInline()
+noInline() {}
+
+// TODO(johnniwinther): Should we infer this?
+/*element: throws:*/
+throws() => 0;
diff --git a/tests/compiler/dart2js/inference/inference_data/function_apply.dart b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
new file mode 100644
index 0000000..b02d84a
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  directCall();
+  indirectCall();
+  instanceTearOff();
+  localCall();
+  instantiatedCall();
+}
+
+/*element: _directCall:apply*/
+_directCall() {}
+
+/*element: directCall:*/
+void directCall() {
+  Function.apply(_directCall, []);
+}
+
+/*element: _indirectCall:apply*/
+_indirectCall() {}
+
+/*element: _indirectCallHelper:*/
+_indirectCallHelper(f) => Function.apply(f, []);
+
+/*element: indirectCall:*/
+void indirectCall() {
+  _indirectCallHelper(_indirectCall);
+}
+
+/*element: Class.:*/
+class Class {
+  /*element: Class.instanceTearOff1:apply*/
+  instanceTearOff1() {}
+
+  /*element: Class.instanceTearOff2:*/
+  instanceTearOff2() {}
+}
+
+/*element: _instanceTearOffHelper:*/
+_instanceTearOffHelper(f) => Function.apply(f, []);
+
+instanceTearOff() {
+  var c = new Class();
+  _instanceTearOffHelper(c.instanceTearOff1);
+  return c.instanceTearOff2;
+}
+
+localCall() {
+  /*apply*/ local1() {}
+  local2() {}
+  local3() {}
+
+  Function.apply(local1, []);
+  local2();
+  return local3;
+}
+
+instantiatedCall() {
+  /*apply*/ local1<T>(T t) {}
+  local2<T>(T t) {}
+  local3<T>(T t) {}
+
+  Function(int) f1 = local1;
+  Function(int) f2 = local2;
+  Function(int) f3 = local3;
+
+  Function.apply(f1, [0]);
+  f2(0);
+  return f3;
+}
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
new file mode 100644
index 0000000..ac4a410
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/inferred_data.dart';
+import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
+import 'package:compiler/src/world.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir =
+        new Directory.fromUri(Platform.script.resolve('inference_data'));
+    await checkTests(dataDir, computeMemberIrInferredData,
+        args: args, options: [stopAfterTypeInference]);
+  });
+}
+
+class Tags {
+  static const String functionApply = 'apply';
+  static const String calledInLoop = 'loop';
+  static const String cannotThrow = 'no-throw';
+}
+
+abstract class ComputeValueMixin<T> {
+  InferredData get inferredData;
+
+  String getMemberValue(MemberEntity member) {
+    Features features = new Features();
+    if (member is FunctionEntity) {
+      if (inferredData.getMightBePassedToApply(member)) {
+        features.add(Tags.functionApply);
+      }
+      if (inferredData.getCannotThrow(member)) {
+        features.add(Tags.cannotThrow);
+      }
+    }
+    if (inferredData.isCalledInLoop(member)) {
+      features.add(Tags.calledInLoop);
+    }
+    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) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 9ee5314..a820afe 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/world.dart' show KClosedWorld;
 import '../memory_compiler.dart';
 
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
   'main.dart': r"""
 import 'package:meta/dart2js.dart';
 
diff --git a/tests/compiler/dart2js/instantiated_classes_test.dart b/tests/compiler/dart2js/instantiated_classes_test.dart
index 4c1aab1..b51bee2 100644
--- a/tests/compiler/dart2js/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/instantiated_classes_test.dart
@@ -26,7 +26,9 @@
       LibraryEntity mainLibrary =
           env.compiler.frontendStrategy.elementEnvironment.mainLibrary;
       Iterable<ClassEntity> expectedClasses =
-          directlyInstantiatedClasses.map(env.getElement);
+          directlyInstantiatedClasses.map((String name) {
+        return env.getElement(name);
+      });
       Iterable<ClassEntity> actualClasses = env
           .compiler.resolutionWorldBuilder.directlyInstantiatedClasses
           .where((c) => c.library == mainLibrary);
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index cb9cf2c..25377d5 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';
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index f91acf6..833334f 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -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
@@ -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) {
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index 885bb45..d5af387 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -187,20 +187,23 @@
         'MapConstant(<int, int>{IntConstant(0): IntConstant(2)})',
         expectedErrors: MessageKind.EQUAL_MAP_ENTRY_KEY),
     const ConstantData(
-        'const bool.fromEnvironment("foo", defaultValue: false)', const {
-      const {}: 'BoolConstant(false)',
-      const {'foo': 'true'}: 'BoolConstant(true)'
-    }),
+        'const bool.fromEnvironment("foo", defaultValue: false)',
+        const <Map<String, String>, String>{
+          const {}: 'BoolConstant(false)',
+          const {'foo': 'true'}: 'BoolConstant(true)'
+        }),
     const ConstantData(
-        'const int.fromEnvironment("foo", defaultValue: 42)', const {
-      const {}: 'IntConstant(42)',
-      const {'foo': '87'}: 'IntConstant(87)'
-    }),
+        'const int.fromEnvironment("foo", defaultValue: 42)',
+        const <Map<String, String>, String>{
+          const {}: 'IntConstant(42)',
+          const {'foo': '87'}: 'IntConstant(87)'
+        }),
     const ConstantData(
-        'const String.fromEnvironment("foo", defaultValue: "bar")', const {
-      const {}: 'StringConstant("bar")',
-      const {'foo': 'foo'}: 'StringConstant("foo")'
-    }),
+        'const String.fromEnvironment("foo", defaultValue: "bar")',
+        const <Map<String, String>, String>{
+          const {}: 'StringConstant("bar")',
+          const {'foo': 'foo'}: 'StringConstant("foo")'
+        }),
   ]),
   const TestData('env', '''
 const a = const bool.fromEnvironment("foo", defaultValue: true);
@@ -249,7 +252,8 @@
         'const C.named(87)',
         'ConstructedConstant(C(field1=IntConstant(87),'
         'field2=IntConstant(87)))'),
-    const ConstantData('const C(field1: a, field2: b)', const {
+    const ConstantData(
+        'const C(field1: a, field2: b)', const <Map<String, String>, String>{
       const {}: 'ConstructedConstant(C(field1=BoolConstant(true),'
           'field2=IntConstant(42)))',
       const {'foo': 'false', 'bar': '87'}:
@@ -303,12 +307,12 @@
   const B(a) : super(a, a * 2);
 }
 ''', const [
-    const ConstantData('const A(c, d)', const {
+    const ConstantData('const A(c, d)', const <Map<String, String>, String>{
       const {}: 'ConstructedConstant(A(field=IntConstant(15)))',
       const {'foo': '7', 'bar': '11'}:
           'ConstructedConstant(A(field=IntConstant(18)))',
     }),
-    const ConstantData('const B(d)', const {
+    const ConstantData('const B(d)', const <Map<String, String>, String>{
       const {}: 'ConstructedConstant(B(field=IntConstant(30)))',
       const {'bar': '42'}: 'ConstructedConstant(B(field=IntConstant(126)))',
     }),
@@ -616,7 +620,9 @@
         var expectedResults =
             strongMode ? data.strongModeResults : data.expectedResults;
         if (expectedResults is String) {
-          expectedResults = {const <String, String>{}: expectedResults};
+          expectedResults = <Map<String, String>, String>{
+            const <String, String>{}: expectedResults
+          };
         }
         expectedResults.forEach((Map<String, String> env, String expectedText) {
           MemoryEnvironment environment =
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index fd5e963..fac2f27 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -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 a00a701..2844a00 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -108,10 +108,8 @@
     ElementEnvironment elementEnvironment,
     List<DartType> arguments,
     List<DartType> parameters,
-    String name1,
-    String name2) {
-  DartType type1 = getType(elementEnvironment, name1);
-  DartType type2 = getType(elementEnvironment, name2);
+    DartType type1,
+    DartType type2) {
   DartType subst = type1.subst(arguments, parameters);
   Expect.equals(
       type2, subst, "$type1.subst($arguments,$parameters)=$subst != $type2");
@@ -119,57 +117,7 @@
 
 testTypeSubstitution() async {
   var env = await TypeEnvironment.create(r"""
-      typedef void Typedef1<X,Y>(X x1, Y y2);
-      typedef void Typedef2<Z>(Z z1);
-
-      class Class<T,S> {
-        void void1() {}
-        void void2() {}
-        void dynamic1(dynamic a) {}
-        void dynamic2(dynamic b) {}
-        void int1(int a) {}
-        void int2(int a) {}
-        void String1(String a) {}
-        void String2(String a) {}
-        void ListInt1(List<int> a) {}
-        void ListInt2(List<int> b) {}
-        void ListT1(List<T> a) {}
-        void ListT2(List<int> b) {}
-        void ListS1(List<S> a) {}
-        void ListS2(List<String> b) {}
-        void ListListT1(List<List<T>> a) {}
-        void ListListT2(List<List<int>> b) {}
-        void ListRaw1(List a) {}
-        void ListRaw2(List b) {}
-        void ListDynamic1(List<dynamic> a) {}
-        void ListDynamic2(List<dynamic> b) {}
-        void MapIntString1(Map<T,S> a) {}
-        void MapIntString2(Map<int,String> b) {}
-        void MapTString1(Map<T,String> a) {}
-        void MapTString2(Map<int,String> b) {}
-        void MapDynamicString1(Map<dynamic,String> a) {}
-        void MapDynamicString2(Map<dynamic,String> b) {}
-        void TypeVarT1(T t1) {}
-        void TypeVarT2(int t2) {}
-        void TypeVarS1(S s1) {}
-        void TypeVarS2(String s2) {}
-        void Function1a(int a(String s1)) {}
-        void Function2a(int b(String s2)) {}
-        void Function1b(void a(T t1, S s1)) {}
-        void Function2b(void b(int t2, String s2)) {}
-        void Function1c(void a(dynamic t1, dynamic s1)) {}
-        void Function2c(void b(dynamic t2, dynamic s2)) {}
-        void Typedef1a(Typedef1<T,S> a) {}
-        void Typedef2a(Typedef1<int,String> b) {}
-        void Typedef1b(Typedef1<dynamic,dynamic> a) {}
-        void Typedef2b(Typedef1<dynamic,dynamic> b) {}
-        void Typedef1c(Typedef1 a) {}
-        void Typedef2c(Typedef1 b) {}
-        void Typedef1d(Typedef2<T> a) {}
-        void Typedef2d(Typedef2<int> b) {}
-        void Typedef1e(Typedef2<S> a) {}
-        void Typedef2e(Typedef2<String> b) {}
-      }
+      class Class<T,S> {}
       """);
   InterfaceType Class_T_S = env["Class"];
   Expect.isNotNull(Class_T_S);
@@ -184,82 +132,89 @@
   Expect.isNotNull(S);
   Expect.isTrue(S.isTypeVariable);
 
-  DartType intType = env['int']; //getType(compiler, "int1");
+  DartType intType = env['int'];
   Expect.isNotNull(intType);
   Expect.isTrue(intType.isInterfaceType);
 
-  DartType StringType = env['String']; //getType(compiler, "String1");
+  DartType StringType = env['String'];
   Expect.isNotNull(StringType);
   Expect.isTrue(StringType.isInterfaceType);
 
+  ClassEntity ListClass = env.getElement('List');
+  ClassEntity MapClass = env.getElement('Map');
+
   List<DartType> parameters = <DartType>[T, S];
   List<DartType> arguments = <DartType>[intType, StringType];
 
-  // TODO(johnniwinther): Create types directly from strings to improve
-  // test readability.
-
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "void1", "void2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "dynamic1", "dynamic2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "int1", "int2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "String1", "String2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListInt1", "ListInt2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListT1", "ListT2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListS1", "ListS2");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "ListListT1",
-      "ListListT2");
-  testSubstitution(
-      env.elementEnvironment, arguments, parameters, "ListRaw1", "ListRaw2");
   testSubstitution(env.elementEnvironment, arguments, parameters,
-      "ListDynamic1", "ListDynamic2");
+      const VoidType(), const VoidType());
   testSubstitution(env.elementEnvironment, arguments, parameters,
-      "MapIntString1", "MapIntString2");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "MapTString1",
-      "MapTString2");
+      const DynamicType(), const DynamicType());
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, intType, intType);
+  testSubstitution(
+      env.elementEnvironment, arguments, parameters, StringType, StringType);
   testSubstitution(env.elementEnvironment, arguments, parameters,
-      "MapDynamicString1", "MapDynamicString2");
+      instantiate(ListClass, [intType]), instantiate(ListClass, [intType]));
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      instantiate(ListClass, [T]), instantiate(ListClass, [intType]));
+  testSubstitution(env.elementEnvironment, arguments, parameters,
+      instantiate(ListClass, [S]), instantiate(ListClass, [StringType]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "TypeVarT1", "TypeVarT2");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(ListClass, [
+        instantiate(ListClass, [T])
+      ]),
+      instantiate(ListClass, [
+        instantiate(ListClass, [intType])
+      ]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "TypeVarS1", "TypeVarS2");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1a",
-      "Function2a");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1b",
-      "Function2b");
-  testSubstitution(env.elementEnvironment, arguments, parameters, "Function1c",
-      "Function2c");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(ListClass, [const DynamicType()]),
+      instantiate(ListClass, [const DynamicType()]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1a", "Typedef2a");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(MapClass, [intType, StringType]),
+      instantiate(MapClass, [intType, StringType]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1b", "Typedef2b");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(MapClass, [T, StringType]),
+      instantiate(MapClass, [intType, StringType]));
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1c", "Typedef2c");
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      instantiate(MapClass, [const DynamicType(), StringType]),
+      instantiate(MapClass, [const DynamicType(), StringType]));
+  testSubstitution(env.elementEnvironment, arguments, parameters, T, intType);
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1d", "Typedef2d");
+      env.elementEnvironment, arguments, parameters, S, StringType);
   testSubstitution(
-      env.elementEnvironment, arguments, parameters, "Typedef1e", "Typedef2e");
-
-  // Substitution in unalias.
-  DartType Typedef2_int_String = getType(env.elementEnvironment, "Typedef2a");
-  Expect.isNotNull(Typedef2_int_String);
-  DartType Function_int_String = getType(env.elementEnvironment, "Function2b");
-  Expect.isNotNull(Function_int_String);
-  DartType unalias1 = Typedef2_int_String.unaliased;
-  Expect.equals(Function_int_String, unalias1,
-      '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');
-
-  DartType Typedef1 = getType(env.elementEnvironment, "Typedef1c");
-  Expect.isNotNull(Typedef1);
-  DartType Function_dynamic_dynamic =
-      getType(env.elementEnvironment, "Function1c");
-  Expect.isNotNull(Function_dynamic_dynamic);
-  DartType unalias2 = Typedef1.unaliased;
-  Expect.equals(Function_dynamic_dynamic, unalias2,
-      '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      new FunctionType(intType, [StringType], [], [], [], []),
+      new FunctionType(intType, [StringType], [], [], [], []));
+  testSubstitution(
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      new FunctionType(const VoidType(), [T, S], [], [], [], []),
+      new FunctionType(
+          const VoidType(), [intType, StringType], [], [], [], []));
+  testSubstitution(
+      env.elementEnvironment,
+      arguments,
+      parameters,
+      new FunctionType(const VoidType(), [const DynamicType()], [], [], [], []),
+      new FunctionType(
+          const VoidType(), [const DynamicType()], [], [], [], []));
 }
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index 3abdd5d..78e93f1 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() {
@@ -550,65 +551,106 @@
   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,
+      ClassQuery query2, SubclassResult expectedResult) {
+    SubclassResult result1 =
+        closedWorld.classHierarchy.commonSubclasses(cls1, query1, cls2, query2);
+    SubclassResult result2 =
+        closedWorld.classHierarchy.commonSubclasses(cls2, query2, cls1, query1);
+    Expect.equals(
+        result1.query,
+        result2.query,
         "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
         "\n a vs b: $result1\n b vs a: $result2");
     Expect.setEquals(
-        expectedResult,
-        result1,
+        result1.classes,
+        result2.classes,
+        "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
+        "\n a vs b: $result1\n b vs a: $result2");
+    Expect.equals(
+        expectedResult.query,
+        result1.query,
+        "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
+        "\n expected: $expectedResult\n actual: $result1");
+    Expect.setEquals(
+        expectedResult.classes,
+        result1.classes,
         "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
         "\n expected: $expectedResult\n actual: $result1");
   }
 
-  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]);
+  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, [A]));
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.EXACT, [A]));
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.EXACT, [A]));
+  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
+  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
+  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBTYPE, [A]));
 
-  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]);
+  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [J]));
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G, I, J]));
 
-  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, C, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, [C]));
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, [C]));
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBTYPE, [C]));
 
-  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(B, ClassQuery.EXACT, C, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.EXACT, []));
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, []));
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
+      new SubclassResult.internal(ClassQuery.SUBCLASS, [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..735e390 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() {
diff --git a/tests/compiler/dart2js/rti/data/async_foreach.dart b/tests/compiler/dart2js/rti/data/async_foreach.dart
new file mode 100644
index 0000000..775cdbe
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_foreach.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*kernel.class: Class:*/
+/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
+/*omit.class: Class:needsArgs*/
+class Class<T> {
+  method() {
+    var list = <T>[];
+    // With the `is dynamic Function(Object)` test in the async implementation
+    // the closure, with type `dynamic Function(T)`, needs its signature,
+    // requiring the need for type arguments on `Class`.
+    //
+    // This happens because the closure is thought as possibly going to the
+    // async.errorHandler callback.
+    list.forEach(
+        /*strong.needsSignature*/
+        /*omit.needsSignature*/
+        (x) => print(x));
+  }
+}
+
+main() async {
+  new Class<int>().method();
+}
diff --git a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
new file mode 100644
index 0000000..2e390bf
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/*kernel.class: Class:*/
+/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
+/*omit.class: Class:*/
+class Class<T> {
+  method() {
+    var list = <T>[];
+    // If any method was `async`, this would have triggered the need for type
+    // arguments on `Class`. See the 'async_foreach.dart' test.
+    list.forEach(
+        /*strong.needsSignature*/
+        /*omit.*/
+        (x) => print(x));
+  }
+}
+
+main() {
+  new Class<int>().method();
+}
diff --git a/tests/compiler/dart2js/rti/data/async_local.dart b/tests/compiler/dart2js/rti/data/async_local.dart
new file mode 100644
index 0000000..45f0a91
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_local.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.
+
+main() async {
+  // With the `is dynamic Function(Object,StackTrace)` test in the async
+  // implementation the closure, with type `dynamic Function(dynamic, dynamic)`,
+  // needs its signature.
+  //
+  // This happens because the closure is thought as possibly going to the
+  // async.errorHandler callback.
+  /*kernel.*/
+  /*strong.needsSignature*/
+  /*omit.needsSignature*/
+  local(object, stacktrace) => null;
+
+  return local;
+}
diff --git a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
new file mode 100644
index 0000000..4651639
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_local_nonasync.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.
+
+main() {
+  // If any method was `async`, this would have triggered the need for the
+  // signature on this closure. See the 'async_local.dart' test.
+  /*kernel.*/
+  /*strong.*/
+  /*omit.*/
+  local(object, stacktrace) => null;
+
+  return local;
+}
diff --git a/tests/compiler/dart2js/rti/data/async_local_typed.dart b/tests/compiler/dart2js/rti/data/async_local_typed.dart
new file mode 100644
index 0000000..40de910
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_local_typed.dart
@@ -0,0 +1,21 @@
+// 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.
+
+/*kernel.class: Class:*/
+/*strong.class: Class:explicit=[Class<int>],needsArgs*/
+/*omit.class: Class:*/
+class Class<T> {}
+
+main() async {
+  // Despite the `is dynamic Function(Object,StackTrace)` test in the async
+  // implementation the closure, with type
+  // `dynamic Function(dynamic, Class<int>)`, is not a potential subtype and
+  // therefore doesn't need its signature.
+  /*kernel.*/
+  /*strong.needsSignature*/
+  /*omit.*/
+  local(object, Class<int> stacktrace) => null;
+
+  return local;
+}
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 2db2947..69a082c1 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -5,10 +5,13 @@
 import 'package:expect/expect.dart';
 import 'package:meta/dart2js.dart';
 
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.call:needsSignature*/
+  /*kernel.element: A.call:needsSignature*/
+  /*strong.element: A.call:*/
+  /*omit.element: A.call:*/
   call(T t) {}
 }
 
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
index 6678ce8..cb5b8c4 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
@@ -5,10 +5,13 @@
 import 'package:expect/expect.dart';
 import 'package:meta/dart2js.dart';
 
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.call:needsSignature*/
+  /*kernel.element: A.call:needsSignature*/
+  /*strong.element: A.call:*/
+  /*omit.element: A.call:*/
   call(T t) {}
 }
 
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index df64b7e..eb55472 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
+/*omit.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   m() {
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
index 0b26509f..f14aa06 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
@@ -4,7 +4,8 @@
 
 import 'package:expect/expect.dart';
 
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @NoInline()
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index 0b26509f..f14aa06 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -4,7 +4,8 @@
 
 import 'package:expect/expect.dart';
 
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @NoInline()
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
index e928292..aed8273 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
 /*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[B.instanceMethod],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
index ba29c64..7dffcff 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
 /*strong.class: A:explicit=[A]*/
 class A {
   /*element: A.instanceMethod:deps=[staticMethod],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 4a84003..acef47b 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -8,7 +8,8 @@
 /*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
 class A<T> {}
 
-/*!strong.class: A1:*/
+/*kernel.class: A1:*/
+/*omit.class: A1:*/
 /*strong.class: A1:implicit=[A1]*/
 class A1 implements A<C1> {}
 
diff --git a/tests/compiler/dart2js/rti/data/generic_creation.dart b/tests/compiler/dart2js/rti/data/generic_creation.dart
index d2bb3be..25b4a20 100644
--- a/tests/compiler/dart2js/rti/data/generic_creation.dart
+++ b/tests/compiler/dart2js/rti/data/generic_creation.dart
@@ -6,41 +6,50 @@
 
 /*class: A:needsArgs*/
 /*kernel.element: A.:needsSignature*/
-/*!kernel.element: A.:*/
+/*strong.element: A.:*/
+/*omit.element: A.:*/
 class A<X, Y, Z> {
   /*kernel.element: A.shift:needsSignature*/
-  /*!kernel.element: A.shift:*/
+  /*strong.element: A.shift:*/
+  /*omit.element: A.shift:*/
   shift() => new A<Z, X, Y>();
 
   /*kernel.element: A.swap:needsSignature*/
-  /*!kernel.element: A.swap:*/
+  /*strong.element: A.swap:*/
+  /*omit.element: A.swap:*/
   swap() => new A<Z, Y, X>();
 
   /*kernel.element: A.first:needsSignature*/
-  /*!kernel.element: A.first:*/
+  /*strong.element: A.first:*/
+  /*omit.element: A.first:*/
   first() => new A<X, X, X>();
 
   /*kernel.element: A.last:needsSignature*/
-  /*!kernel.element: A.last:*/
+  /*strong.element: A.last:*/
+  /*omit.element: A.last:*/
   last() => new A<Z, Z, Z>();
 
   /*kernel.element: A.wrap:needsSignature*/
-  /*!kernel.element: A.wrap:*/
+  /*strong.element: A.wrap:*/
+  /*omit.element: A.wrap:*/
   wrap() => new A<A<X, X, X>, A<Y, Y, Y>, A<Z, Z, Z>>();
 }
 
 /*kernel.element: B.:needsSignature*/
-/*!kernel.element: B.:*/
+/*strong.element: B.:*/
+/*omit.element: B.:*/
 class B extends A<U, V, W> {}
 
 /*class: C:needsArgs*/
 /*kernel.element: C.:needsSignature*/
-/*!kernel.element: C.:*/
+/*strong.element: C.:*/
+/*omit.element: C.:*/
 class C<T> extends A<U, T, W> {}
 
 /*class: D:needsArgs*/
 /*kernel.element: D.:needsSignature*/
-/*!kernel.element: D.:*/
+/*strong.element: D.:*/
+/*omit.element: D.:*/
 class D<X, Y, Z> extends A<Y, Z, X> {}
 
 class U {}
@@ -50,11 +59,13 @@
 class W {}
 
 /*kernel.element: sameType:needsSignature*/
-/*!kernel.element: sameType:*/
+/*strong.element: sameType:*/
+/*omit.element: sameType:*/
 sameType(a, b) => Expect.equals(a.runtimeType, b.runtimeType);
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   A a = new A<U, V, W>();
   sameType(new A<W, U, V>(), a.shift());
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
index f438d3f..957e2cd 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
@@ -4,22 +4,26 @@
 
 // Test derived from language_2/generic_methods_dynamic_test/05
 
-/*!strong.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+/*kernel.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+/*omit.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
 /*strong.class: global#JSArray:deps=[ArrayIterator,EmptyIterable,List,ListIterable,SubListIterable],direct,explicit=[Iterable<JSArray.E>,JSArray,JSArray.E,JSArray<ArrayIterator.E>,List<JSArray.E>],implicit=[JSArray.E],needsArgs*/
 
-/*!strong.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
+/*kernel.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
+/*omit.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
 /*strong.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable,makeListFixedLength],direct,explicit=[List,List.E,List<B>,List<JSArray.E>,List<String>,List<makeListFixedLength.T>],implicit=[List.E],needsArgs*/
 
 import "package:expect/expect.dart";
 
 class A {}
 
-/*!strong.class: B:explicit=[List<B>]*/
+/*kernel.class: B:explicit=[List<B>]*/
+/*omit.class: B:explicit=[List<B>]*/
 /*strong.class: B:explicit=[List<B>],implicit=[B]*/
 class B {}
 
 class C {
-  /*!strong.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*kernel.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*omit.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   /*strong.element: C.bar:direct,explicit=[Iterable<bar.T>],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   List<T> bar<T>(Iterable<T> t) => <T>[t.first];
 }
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
index e7b8007..c6a1e97 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
@@ -6,7 +6,8 @@
 
 import "package:expect/expect.dart";
 
-/*!strong.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*kernel.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*omit.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
 /*strong.class: A:deps=[C.bar],direct,explicit=[A.T,A<B>,A<bar.T>],needsArgs*/
 class A<T> {
   final T field;
@@ -14,12 +15,14 @@
   A(this.field);
 }
 
-/*!strong.class: B:explicit=[A<B>]*/
+/*kernel.class: B:explicit=[A<B>]*/
+/*omit.class: B:explicit=[A<B>]*/
 /*strong.class: B:explicit=[A<B>],implicit=[B]*/
 class B {}
 
 class C {
-  /*!strong.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*kernel.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+  /*omit.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   /*strong.element: C.bar:explicit=[A<bar.T>],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
   A<T> bar<T>(A<T> t) => new A<T>(t.field);
 }
diff --git a/tests/compiler/dart2js/rti/data/indirect_through_static.dart b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
index 6359003..f8c9344 100644
--- a/tests/compiler/dart2js/rti/data/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: A:*/
-/*!kernel.class: A:implicit=[A]*/
+/*strong.class: A:implicit=[A]*/
+/*omit.class: A:implicit=[A]*/
 abstract class A {}
 
 class B implements A {}
@@ -31,7 +32,8 @@
 }
 
 /*kernel.element: lookup:direct,explicit=[C<lookup.T>]*/
-/*!kernel.element: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
+/*strong.element: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
+/*omit.element: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
 C<T> lookup<T>(String key) {
   final value = map[key];
   if (value != null && value is C<T>) {
diff --git a/tests/compiler/dart2js/rti/data/instantiation2.dart b/tests/compiler/dart2js/rti/data/instantiation2.dart
index fd7022c..5fc92bb 100644
--- a/tests/compiler/dart2js/rti/data/instantiation2.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation2.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.element: f:direct,explicit=[f.T]*/
-/*!kernel.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*strong.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*omit.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/rti/data/instantiation4.dart b/tests/compiler/dart2js/rti/data/instantiation4.dart
index b9f1a78..35f00d4 100644
--- a/tests/compiler/dart2js/rti/data/instantiation4.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation4.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.element: f:direct,explicit=[f.T]*/
-/*!kernel.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*strong.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*omit.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/rti/data/instantiation6.dart b/tests/compiler/dart2js/rti/data/instantiation6.dart
index feb9e52..86b3684 100644
--- a/tests/compiler/dart2js/rti/data/instantiation6.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation6.dart
@@ -3,12 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.element: f:direct,explicit=[f.T]*/
-/*!kernel.element: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
+/*strong.element: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
+/*omit.element: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
 
-/*!kernel.element: method:indirect,needsArgs*/
+/*strong.element: method:indirect,needsArgs*/
+/*omit.element: method:indirect,needsArgs*/
 method<S>() {
   F<S> c;
 
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index b7c851c..1704785 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -24,7 +24,8 @@
   }
 }
 
-/*!strong.class: Class2:needsArgs*/
+/*kernel.class: Class2:needsArgs*/
+/*omit.class: Class2:needsArgs*/
 /*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
 class Class2<T> {
   method4() {
@@ -43,7 +44,8 @@
   }
 }
 
-/*!strong.class: Class4:*/
+/*kernel.class: Class4:*/
+/*omit.class: Class4:*/
 /*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
 class Class4<T> {
   method6() {
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 8376333..1bda5e6 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -2,16 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!strong.class: global#Map:*/
+/*kernel.class: global#Map:*/
+/*omit.class: global#Map:*/
 /*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
 
-/*!strong.class: global#LinkedHashMap:deps=[Map]*/
+/*kernel.class: global#LinkedHashMap:deps=[Map]*/
+/*omit.class: global#LinkedHashMap:deps=[Map]*/
 /*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
 
-/*!strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+/*kernel.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
 /*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
 
-/*!strong.class: global#double:explicit=[double]*/
+/*kernel.class: global#double:explicit=[double]*/
+/*omit.class: global#double:explicit=[double]*/
 /*strong.class: global#double:explicit=[double],implicit=[double]*/
 
 /*class: global#JSDouble:*/
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 073f358..b883fe0 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set.dart
@@ -2,16 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!strong.class: global#Map:deps=[Class],needsArgs*/
+/*kernel.class: global#Map:deps=[Class],needsArgs*/
+/*omit.class: global#Map:deps=[Class],needsArgs*/
 /*strong.class: global#Map:deps=[Class,JsLinkedHashMap,MapMixin],explicit=[Map,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,Map<MapMixin.K,MapMixin.V>],indirect,needsArgs*/
 
-/*!strong.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*kernel.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*omit.class: global#LinkedHashMap:deps=[Map],needsArgs*/
 /*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
 
-/*!strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*kernel.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
 /*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],indirect,needsArgs*/
 
-/*!strong.class: global#double:explicit=[double]*/
+/*kernel.class: global#double:explicit=[double]*/
+/*omit.class: global#double:explicit=[double]*/
 /*strong.class: global#double:explicit=[double],implicit=[double]*/
 
 /*class: global#JSDouble:*/
@@ -23,7 +27,8 @@
   set is Set<String>;
 }
 
-/*!strong.class: Class:needsArgs*/
+/*kernel.class: Class:needsArgs*/
+/*omit.class: Class:needsArgs*/
 /*strong.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
 class Class<T, S> {
   m() {
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index 7c24e036..b76455a 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -15,10 +15,13 @@
   Object method3(num n) => null;
 }
 
-/*!strong.class: Class2:needsArgs*/
+/*kernel.class: Class2:needsArgs*/
 /*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
+/*omit.class: Class2:*/
 class Class2<T> {
-  /*element: Class2.method4:needsSignature*/
+  /*kernel.element: Class2.method4:needsSignature*/
+  /*strong.element: Class2.method4:*/
+  /*omit.element: Class2.method4:*/
   num method4(T n) => null;
 }
 
@@ -28,7 +31,8 @@
   T method5(num n) => null;
 }
 
-/*!strong.class: Class4:*/
+/*kernel.class: Class4:*/
+/*omit.class: Class4:*/
 /*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
 class Class4<T> {
   /*element: Class4.method6:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
index a591ef6..3fb3610 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
@@ -5,15 +5,18 @@
 import 'package:expect/expect.dart';
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   /*needsSignature*/
   local1a() {}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
index 5958d4a..a573e8b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
@@ -5,22 +5,27 @@
 import 'package:expect/expect.dart';
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   /*kernel.needsSignature*/
-  /*!kernel.needsArgs,needsSignature*/
+  /*strong.needsArgs,needsSignature*/
+  /*omit.needsArgs,needsSignature*/
   T local1a<T>() => null;
 
   /*kernel.needsSignature*/
-  /*!kernel.needsArgs,needsSignature*/
+  /*strong.needsArgs,needsSignature*/
+  /*omit.needsArgs,needsSignature*/
   T local1b<T>() => null;
 
   /*kernel.needsSignature*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
index 74d0adb..c32e678 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
@@ -6,15 +6,18 @@
 
 String method() => null;
 
-/*!strong.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*omit.class: Class1:needsArgs*/
 /*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 
   /*kernel.element: Class1.method:needsSignature*/
-  /*!kernel.element: Class1.method:*/
+  /*strong.element: Class1.method:*/
+  /*omit.element: Class1.method:*/
   method() {
     /*needsSignature*/
     T local1a() => null;
@@ -32,15 +35,18 @@
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   new Class1<int>().method();
   new Class2<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
index 456b5db..91267c0 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
@@ -5,38 +5,46 @@
 import 'package:expect/expect.dart';
 
 /*kernel.class: Class1:needsArgs*/
-/*!kernel.class: Class1:*/
+/*strong.class: Class1:*/
+/*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 
   // TODO(johnniwinther): Currently only methods that use class type variables
   // in their signature are marked as 'needs signature'. Change this to mark
   // all methods that need to support access to their function type at runtime.
   /*kernel.element: Class1.method1a:needsSignature*/
-  /*!kernel.element: Class1.method1a:*/
+  /*strong.element: Class1.method1a:*/
+  /*omit.element: Class1.method1a:*/
   method1a() => null;
 
   /*kernel.element: Class1.method1b:needsSignature*/
-  /*!kernel.element: Class1.method1b:*/
+  /*strong.element: Class1.method1b:*/
+  /*omit.element: Class1.method1b:*/
   method1b() => null;
 
   /*kernel.element: Class1.method2:needsSignature*/
-  /*!kernel.element: Class1.method2:*/
+  /*strong.element: Class1.method2:*/
+  /*omit.element: Class1.method2:*/
   method2(t, s) => t;
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   var c = new Class1<int>();
 
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
index 28c000f..e2aa421 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
@@ -4,36 +4,44 @@
 
 import 'package:expect/expect.dart';
 
-/*!strong.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*omit.class: Class1:needsArgs*/
 /*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 
   /*kernel.element: Class1.method1a:needsSignature*/
-  /*!kernel.element: Class1.method1a:needsSignature*/
+  /*strong.element: Class1.method1a:needsSignature*/
+  /*omit.element: Class1.method1a:needsSignature*/
   T method1a() => null;
 
   /*kernel.element: Class1.method1b:needsSignature*/
-  /*!kernel.element: Class1.method1b:needsSignature*/
+  /*strong.element: Class1.method1b:needsSignature*/
+  /*omit.element: Class1.method1b:needsSignature*/
   T method1b() => null;
 
   /*kernel.element: Class1.method2:needsSignature*/
-  /*!kernel.element: Class1.method2:needsSignature*/
+  /*strong.element: Class1.method2:needsSignature*/
+  /*omit.element: Class1.method2:needsSignature*/
   T method2(T t, String s) => t;
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   var c = new Class1<int>();
 
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
index b8771d8..af2cce5 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
@@ -5,27 +5,33 @@
 import 'package:expect/expect.dart';
 
 /*kernel.element: method1a:needsSignature*/
-/*!kernel.element: method1a:*/
+/*strong.element: method1a:*/
+/*omit.element: method1a:*/
 method1a() => null;
 
 /*kernel.element: method1b:needsSignature*/
-/*!kernel.element: method1b:*/
+/*strong.element: method1b:*/
+/*omit.element: method1b:*/
 method1b() => null;
 
 /*kernel.element: method2:needsSignature*/
-/*!kernel.element: method2:*/
+/*strong.element: method2:*/
+/*omit.element: method2:*/
 method2(t, s) => t;
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
   Expect.isFalse(method1a.runtimeType == method2.runtimeType);
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
index b3ff672..23d1a3b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -5,11 +5,13 @@
 import 'package:expect/expect.dart';
 
 /*kernel.element: method1a:needsSignature*/
-/*!kernel.element: method1a:needsArgs*/
+/*strong.element: method1a:needsArgs*/
+/*omit.element: method1a:needsArgs*/
 T method1a<T>() => null;
 
 /*kernel.element: method1b:needsSignature*/
-/*!kernel.element: method1b:needsArgs*/
+/*strong.element: method1b:needsArgs*/
+/*omit.element: method1b:needsArgs*/
 T method1b<T>() => null;
 
 /*kernel.element: method2:needsSignature*/
@@ -18,15 +20,18 @@
 T method2<T>(T t, String s) => t;
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
   Expect.isFalse(method1a.runtimeType == method2.runtimeType);
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
index 9c4ebae..4f871d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -5,18 +5,22 @@
 import 'package:expect/expect.dart';
 
 /*kernel.class: Class1:needsArgs*/
-/*!kernel.class: Class1:*/
+/*strong.class: Class1:*/
+/*omit.class: Class1:*/
 class Class1<S> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 
   /*kernel.element: Class1.method1a:needsSignature*/
-  /*!kernel.element: Class1.method1a:needsArgs*/
+  /*strong.element: Class1.method1a:needsArgs*/
+  /*omit.element: Class1.method1a:needsArgs*/
   T method1a<T>() => null;
 
   /*kernel.element: Class1.method1b:needsSignature*/
-  /*!kernel.element: Class1.method1b:needsArgs*/
+  /*strong.element: Class1.method1b:needsArgs*/
+  /*omit.element: Class1.method1b:needsArgs*/
   T method1b<T>() => null;
 
   /*kernel.element: Class1.method2:needsSignature*/
@@ -26,15 +30,18 @@
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   var c = new Class1<int>();
 
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
index 9d67301..4eb0481 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
@@ -3,21 +3,26 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
-  /*!omit.needsSignature*/
+  /*kernel.needsSignature*/
+  /*strong.needsSignature*/
   /*omit.*/
   local1() {}
 
-  /*!omit.needsSignature*/
+  /*kernel.needsSignature*/
+  /*strong.needsSignature*/
   /*omit.*/
   local2(int i, String s) => i;
 
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
index 034011c..c2d9ef4 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
@@ -3,15 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   /*kernel.needsSignature*/
   /*strong.needsArgs,needsSignature*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
index 69f305d..fbc1805 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
@@ -2,28 +2,34 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 
-  /*!omit.element: Class1.method:needsSignature*/
+  /*kernel.element: Class1.method:needsSignature*/
+  /*strong.element: Class1.method:needsSignature*/
   /*omit.element: Class1.method:*/
   T method() => null;
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print(cls1.method.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
index ca9f34b..72d9834 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
@@ -5,7 +5,8 @@
 /*class: Class1:*/
 class Class1 {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 
   /*kernel.element: Class1.method:needsSignature*/
@@ -15,15 +16,18 @@
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1 cls1 = new Class1();
   print(cls1.method.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
index 25274f4..86081c3 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
@@ -3,23 +3,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
 /*kernel.element: method1:needsSignature*/
-/*!kernel.element: method1:*/
+/*strong.element: method1:*/
+/*omit.element: method1:*/
 method1() {}
 
 /*kernel.element: method2:needsSignature*/
-/*!kernel.element: method2:*/
+/*strong.element: method2:*/
+/*omit.element: method2:*/
 method2(int i, String s) => i;
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   print('${method1.runtimeType}');
   method2(0, '');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
index 6a1ae66..f64f35f 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
@@ -3,10 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
 class Class<T> {
   /*kernel.element: Class.:needsSignature*/
-  /*!kernel.element: Class.:*/
+  /*strong.element: Class.:*/
+  /*omit.element: Class.:*/
   Class();
 }
 
@@ -21,7 +23,8 @@
 method2<T>(t, s) => t;
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   print('${method1.runtimeType}');
   method2(0, '');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
index 06a762f..3c7aed7 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
@@ -7,11 +7,13 @@
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
   /*kernel.element: Class1a.:needsSignature*/
-  /*!kernel.element: Class1a.:*/
+  /*strong.element: Class1a.:*/
+  /*omit.element: Class1a.:*/
   Class1a();
 
   /*kernel.element: Class1a.==:needsSignature*/
-  /*!kernel.element: Class1a.==:*/
+  /*strong.element: Class1a.==:*/
+  /*omit.element: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return runtimeType == other.runtimeType;
@@ -21,7 +23,8 @@
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
   /*kernel.element: Class1b.:needsSignature*/
-  /*!kernel.element: Class1b.:*/
+  /*strong.element: Class1b.:*/
+  /*omit.element: Class1b.:*/
   Class1b();
 }
 
@@ -30,20 +33,24 @@
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
   /*kernel.element: Class1c.:needsSignature*/
-  /*!kernel.element: Class1c.:*/
+  /*strong.element: Class1c.:*/
+  /*omit.element: Class1c.:*/
   Class1c();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
index 19554c5..72fb155 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
@@ -7,11 +7,13 @@
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
   /*kernel.element: Class1a.:needsSignature*/
-  /*!kernel.element: Class1a.:*/
+  /*strong.element: Class1a.:*/
+  /*omit.element: Class1a.:*/
   Class1a();
 
   /*kernel.element: Class1a.==:needsSignature*/
-  /*!kernel.element: Class1a.==:*/
+  /*strong.element: Class1a.==:*/
+  /*omit.element: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return other.runtimeType == runtimeType;
@@ -21,7 +23,8 @@
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
   /*kernel.element: Class1b.:needsSignature*/
-  /*!kernel.element: Class1b.:*/
+  /*strong.element: Class1b.:*/
+  /*omit.element: Class1b.:*/
   Class1b();
 }
 
@@ -30,20 +33,24 @@
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
   /*kernel.element: Class1c.:needsSignature*/
-  /*!kernel.element: Class1c.:*/
+  /*strong.element: Class1c.:*/
+  /*omit.element: Class1c.:*/
   Class1c();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
index 913cc57..4994e58 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
@@ -7,11 +7,13 @@
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
   /*kernel.element: Class1a.:needsSignature*/
-  /*!kernel.element: Class1a.:*/
+  /*strong.element: Class1a.:*/
+  /*omit.element: Class1a.:*/
   Class1a();
 
   /*kernel.element: Class1a.==:needsSignature*/
-  /*!kernel.element: Class1a.==:*/
+  /*strong.element: Class1a.==:*/
+  /*omit.element: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return runtimeType == other?.runtimeType;
@@ -21,7 +23,8 @@
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
   /*kernel.element: Class1b.:needsSignature*/
-  /*!kernel.element: Class1b.:*/
+  /*strong.element: Class1b.:*/
+  /*omit.element: Class1b.:*/
   Class1b();
 }
 
@@ -30,20 +33,24 @@
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
   /*kernel.element: Class1c.:needsSignature*/
-  /*!kernel.element: Class1c.:*/
+  /*strong.element: Class1c.:*/
+  /*omit.element: Class1c.:*/
   Class1c();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
index 7993bcd..3eb953a 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
@@ -7,11 +7,13 @@
 /*class: Class1a:needsArgs*/
 class Class1a<T> {
   /*kernel.element: Class1a.:needsSignature*/
-  /*!kernel.element: Class1a.:*/
+  /*strong.element: Class1a.:*/
+  /*omit.element: Class1a.:*/
   Class1a();
 
   /*kernel.element: Class1a.==:needsSignature*/
-  /*!kernel.element: Class1a.==:*/
+  /*strong.element: Class1a.==:*/
+  /*omit.element: Class1a.==:*/
   bool operator ==(other) {
     if (identical(this, other)) return true;
     return other?.runtimeType == runtimeType;
@@ -21,7 +23,8 @@
 /*class: Class1b:needsArgs*/
 class Class1b<T> extends Class1a<T> {
   /*kernel.element: Class1b.:needsSignature*/
-  /*!kernel.element: Class1b.:*/
+  /*strong.element: Class1b.:*/
+  /*omit.element: Class1b.:*/
   Class1b();
 }
 
@@ -30,20 +33,24 @@
 /*class: Class1c:needsArgs*/
 class Class1c<T> implements Class1a<T> {
   /*kernel.element: Class1c.:needsSignature*/
-  /*!kernel.element: Class1c.:*/
+  /*strong.element: Class1c.:*/
+  /*omit.element: Class1c.:*/
   Class1c();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1a<int> cls1a = new Class1a<int>();
   Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
index edf0fb3..5275254 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
@@ -2,32 +2,39 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:*/
+/*kernel.class: Class1:*/
+/*strong.class: Class1:*/
 /*omit.class: Class1:*/
 class Class1 {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
-/*!omit.class: Class3:needsArgs*/
+/*kernel.class: Class3:needsArgs*/
+/*strong.class: Class3:needsArgs*/
 /*omit.class: Class3:*/
 class Class3<T> implements Class1 {
   /*kernel.element: Class3.:needsSignature*/
-  /*!kernel.element: Class3.:*/
+  /*strong.element: Class3.:*/
+  /*omit.element: Class3.:*/
   Class3();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1 cls1 = new Class1();
   print(cls1.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
index 7c3ca11..6124657 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
@@ -2,24 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print('${cls1.runtimeType}');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
index 02503de..fdff124 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
@@ -2,24 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print(cls1.runtimeType?.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
index 221554c..ba06a77 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
@@ -2,24 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print(cls1?.runtimeType?.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
index f68c923..79f159b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
@@ -2,24 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1<int> cls1 = new Class1<int>();
   print('${cls1?.runtimeType}');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
index 6ca7b43..5d18fbe 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -2,24 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
-/*!omit.class: Class2:needsArgs*/
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:needsArgs*/
 /*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   dynamic cls1 = new Class1<int>();
   print('${cls1.runtimeType}');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
index edf0fb3..5275254 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
@@ -2,32 +2,39 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!omit.class: Class1:*/
+/*kernel.class: Class1:*/
+/*strong.class: Class1:*/
 /*omit.class: Class1:*/
 class Class1 {
   /*kernel.element: Class1.:needsSignature*/
-  /*!kernel.element: Class1.:*/
+  /*strong.element: Class1.:*/
+  /*omit.element: Class1.:*/
   Class1();
 }
 
 /*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
 class Class2<T> {
   /*kernel.element: Class2.:needsSignature*/
-  /*!kernel.element: Class2.:*/
+  /*strong.element: Class2.:*/
+  /*omit.element: Class2.:*/
   Class2();
 }
 
-/*!omit.class: Class3:needsArgs*/
+/*kernel.class: Class3:needsArgs*/
+/*strong.class: Class3:needsArgs*/
 /*omit.class: Class3:*/
 class Class3<T> implements Class1 {
   /*kernel.element: Class3.:needsSignature*/
-  /*!kernel.element: Class3.:*/
+  /*strong.element: Class3.:*/
+  /*omit.element: Class3.:*/
   Class3();
 }
 
 /*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
 main() {
   Class1 cls1 = new Class1();
   print(cls1.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index 2579700..c8263c4 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -2,10 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.m:needsSignature*/
+  /*kernel.element: A.m:needsSignature*/
+  /*strong.element: A.m:*/
+  /*omit.element: A.m:*/
   void m(T t) {}
 
   /*element: A.f:*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
index 887e55f..7437085 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
@@ -3,9 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:needsArgs*/
+/*omit.class: A:*/
 class A<T> {
-  /*element: A.m:needsSignature*/
+  /*kernel.element: A.m:needsSignature*/
+  /*strong.element: A.m:*/
+  /*omit.element: A.m:*/
   void m(T t) {}
 
   /*element: A.f:*/
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
new file mode 100644
index 0000000..ccc9db9
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Based on language/generic_methods_dynamic_test/02
+
+library generic_methods_dynamic_test;
+
+/*class: A:checkedInstance,checks=[],typeArgument*/
+class A {}
+
+/*class: B:checks=[],instance*/
+class B {}
+
+/*class: C:*/
+class C {
+  T foo<T>(T t) => t;
+  List<T> bar<T>(Iterable<T> t) => <T>[t.first];
+}
+
+main() {
+  B b = new B();
+  C c = new C();
+  dynamic obj = c;
+  obj.foo<A>(b);
+}
diff --git a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
index a80da25..2813753 100644
--- a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
@@ -3,15 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*kernel.class: A:*/
-/*!kernel.class: A:checkedInstance,checks=[],typeArgument*/
+/*strong.class: A:checkedInstance,checks=[],typeArgument*/
+/*omit.class: A:checkedInstance,checks=[],typeArgument*/
 abstract class A {}
 
 /*kernel.class: B:checks=[],typeArgument*/
-/*!kernel.class: B:checks=[$isA],typeArgument*/
+/*strong.class: B:checks=[$isA],typeArgument*/
+/*omit.class: B:checks=[$isA],typeArgument*/
 class B implements A {}
 
 /*kernel.class: C:checks=[],instance*/
-/*!kernel.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*omit.class: C:checkedInstance,checks=[],instance,typeArgument*/
 class C<T> {}
 
 final Map<String, C> map = {};
diff --git a/tests/compiler/dart2js/sha1_short_test_vectors.dart b/tests/compiler/dart2js/sha1_short_test_vectors.dart
index a4d8b51..e41844a 100644
--- a/tests/compiler/dart2js/sha1_short_test_vectors.dart
+++ b/tests/compiler/dart2js/sha1_short_test_vectors.dart
@@ -7,7 +7,7 @@
 // Standard test vectors from:
 //   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
 
-const sha1_short_inputs = const [
+const List<List<int>> sha1_short_inputs = const [
   const [],
   const [0x36],
   const [0x19, 0x5a],
diff --git a/tests/compiler/dart2js/sha1_test.dart b/tests/compiler/dart2js/sha1_test.dart
index c2002c9..f431fa6 100644
--- a/tests/compiler/dart2js/sha1_test.dart
+++ b/tests/compiler/dart2js/sha1_test.dart
@@ -569,7 +569,7 @@
   expect(digest, sha.close());
 }
 
-void _testStandardVectors(inputs, mds) {
+void _testStandardVectors(List<List<int>> inputs, mds) {
   for (var i = 0; i < inputs.length; i++) {
     var hash = new SHA1();
     hash.add(inputs[i]);
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index 88372a5..6b3a329 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
@@ -19,6 +19,7 @@
 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';
 
@@ -187,7 +188,7 @@
 /// A wrapper of [JavaScriptSourceInformationStrategy] that records
 /// [RecordedSourceInformationProcess].
 class RecordingSourceInformationStrategy
-    extends JavaScriptSourceInformationStrategy {
+    extends JavaScriptSourceInformationStrategy<ir.Node> {
   final JavaScriptSourceInformationStrategy strategy;
   final Map<RecordedSourceInformationProcess, js.Node> processMap =
       <RecordedSourceInformationProcess, js.Node>{};
@@ -197,7 +198,8 @@
   RecordingSourceInformationStrategy(this.strategy);
 
   @override
-  SourceInformationBuilder createBuilderForContext(MemberEntity member) {
+  SourceInformationBuilder<ir.Node> createBuilderForContext(
+      MemberEntity member) {
     return strategy.createBuilderForContext(member);
   }
 
diff --git a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
index f044fba..375f5b2 100644
--- a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
@@ -13,9 +13,9 @@
 
 test(List events, Map<int, List<int>> expectedPositions) {
   BufferedOutputSink sink = new BufferedOutputSink();
-  LocationProvider locationProvider = new LocationCollector();
-  // ignore: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-  CodeOutput output = new StreamCodeOutput(sink, [locationProvider]);
+  LocationCollector locationProvider = new LocationCollector();
+  CodeOutput output =
+      new StreamCodeOutput(sink, <CodeOutputListener>[locationProvider]);
   for (var event in events) {
     if (event is String) {
       output.add(event);
@@ -78,7 +78,7 @@
     3: null
   });
 
-  Map positions = {
+  Map<int, List<int>> positions = {
     0: [0, 0],
     1: [0, 1],
     2: [1, 0],
diff --git a/tests/compiler/dart2js/uri_retention_test.dart b/tests/compiler/dart2js/uri_retention_test.dart
index eaa6b35..1654612 100644
--- a/tests/compiler/dart2js/uri_retention_test.dart
+++ b/tests/compiler/dart2js/uri_retention_test.dart
@@ -13,7 +13,7 @@
 import 'memory_compiler.dart' show runCompiler, OutputCollector;
 
 Future<String> compileSources(sources, {bool minify}) async {
-  var options = [];
+  var options = <String>[];
   if (minify) options.add(Flags.minify);
   OutputCollector outputCollector = new OutputCollector();
   await runCompiler(
diff --git a/tests/compiler/dart2js_extra/33572_test.dart b/tests/compiler/dart2js_extra/33572_test.dart
new file mode 100644
index 0000000..b8d475f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/33572_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.
+
+// Regression test for issue 32853.
+
+import "package:expect/expect.dart";
+import "package:meta/dart2js.dart" show noInline;
+
+class A {
+  final x = null;
+  final y;
+  const A(this.y);
+}
+
+main() {
+  var a1 = new A(1);
+  var a2 = const A(2);
+  test(a1, null, 1);
+  test(a2, null, 2);
+}
+
+@noInline
+test(a, expectedX, expectedY) {
+  Expect.equals(expectedX, a.x);
+  Expect.equals(expectedY, a.y);
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 1cb40c4..f457fda 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -191,11 +191,13 @@
 bit_twiddling_bigint_test: CompileTimeError #Large integer literal. Not representable in JS.
 bit_twiddling_test: CompileTimeError # Large integer literal. Not representable in JS.
 compare_to2_test: RuntimeError
+date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 double_ceil_test: CompileTimeError # Large integer literal. Not representable in JS.
 double_floor_test: CompileTimeError # Large integer literal. Not representable in JS.
 double_parse_test/01: RuntimeError
 double_round_test: CompileTimeError # Large integer literal. Not representable in JS.
 double_truncate_test: CompileTimeError # Large integer literal. Not representable in JS.
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 hash_set_test/01: RuntimeError
 int_ceil_test: CompileTimeError # Large integer literal. Not representable in JS.
 int_ceil_to_double_test: CompileTimeError # Large integer literal. Not representable in JS.
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index d09fc30..1683b0a 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -31,9 +31,37 @@
 
 [ $compiler == dartdevk ]
 bigint_from_test: RuntimeError # Issue 32589
+bigint_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 bool_from_environment2_test/03: Crash
+compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_ceil_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_floor_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_round_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_truncate_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_from_environment_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 int_modulo_arith_test/modPow: RuntimeError
 int_modulo_arith_test/none: RuntimeError
+int_parse_radix_int64_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_round_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_round_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_to_int_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_arith_vm_test/modPow: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_arith_vm_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_sign_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 string_from_environment3_test/03: Crash
 
 [ $compiler == precompiler ]
@@ -212,7 +240,6 @@
 symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
 
 [ $compiler == dart2js && $fast_startup && $fasta && $strong ]
-cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError
 growable_list_test: RuntimeError
 integer_to_radix_string_test/01: RuntimeError
@@ -227,11 +254,37 @@
 uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
 
 [ $compiler == dart2js && $fasta ]
-int_parse_radix_int64_test/02: RuntimeError # WontFix: Int not precisely representable in JS
+bigint_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_ceil_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_floor_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_round_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+double_truncate_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_from_environment_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_parse_radix_int64_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 int_parse_radix_test/01: RuntimeError
+int_round_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_round_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_to_int_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_arith_vm_test/modPow: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_arith_vm_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_sign_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 
 [ $compiler == dart2js && $fasta && $host_checked && $strong ]
-cast_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
 integer_to_radix_string_test/01: RuntimeError
@@ -248,7 +301,6 @@
 uri_base_test: RuntimeError
 
 [ $compiler == dart2js && $fasta && $minified && $strong ]
-cast_test: RuntimeError
 dynamic_nosuchmethod_test: RuntimeError
 error_stack_trace1_test: RuntimeError # Issue 12399
 growable_list_test: RuntimeError # Concurrent modifications test always runs
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index ac10795..4c6c2c1 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -335,6 +335,7 @@
 deferred_not_loaded_check_test: RuntimeError
 deferred_redirecting_factory_test: RuntimeError
 deopt_inlined_function_lazy_test: CompileTimeError # Int larger than 64 bits.
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 double_int_to_string_test: RuntimeError
 duplicate_export_negative_test: Fail
 duplicate_implements_test/01: MissingCompileTimeError
@@ -387,6 +388,7 @@
 left_shift_test: RuntimeError
 library_env_test/has_mirror_support: RuntimeError, OK
 list_literal4_test: RuntimeError
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 main_not_a_function_test/01: CompileTimeError
 many_overridden_no_such_method_test: RuntimeError
 method_override5_test: RuntimeError
@@ -395,6 +397,7 @@
 method_override7_test/02: MissingCompileTimeError
 method_override8_test/00: MissingCompileTimeError
 method_override8_test/01: MissingCompileTimeError
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mint_arithmetic_test: RuntimeError
 mint_compares_test: CompileTimeError # Int larger than 64 bits
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
diff --git a/tests/language_2/cascade_test.dart b/tests/language_2/cascade_test.dart
index dca880d..7208093 100644
--- a/tests/language_2/cascade_test.dart
+++ b/tests/language_2/cascade_test.dart
@@ -40,7 +40,7 @@
     return null;
   }
 
-  int operator []=(int i, int value) {
+  operator []=(int i, int value) {
     if (i == 0) {
       x = value;
     } else if (i == 1) {
diff --git a/tests/language_2/const_constructor_nonconst_param_test.dart b/tests/language_2/const_constructor_nonconst_param_test.dart
new file mode 100644
index 0000000..aae46a6
--- /dev/null
+++ b/tests/language_2/const_constructor_nonconst_param_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.
+
+class A {
+  const A(int a);
+}
+
+class B {
+  final a; //    //# 01: compile-time error
+  const B(dynamic v) //
+      : a = A(v) //# 01: continued
+  ;
+}
+
+void main() {
+  const B("");
+}
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index a8deafd..8ad3271 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -10,7 +10,6 @@
 bad_initializer2_negative_test: Fail # Issue 14880
 built_in_identifier_prefix_test: CompileTimeError
 built_in_identifier_type_annotation_test/dynamic-gen: MissingCompileTimeError # Issue 28813
-cascade_test/none: Fail # Issue 11577
 config_import_corelib_test: StaticWarning, OK
 conflicting_type_variable_and_setter_test: CompileTimeError # Issue 25525
 const_cast2_test/01: CompileTimeError
@@ -34,7 +33,6 @@
 final_syntax_test/04: Fail # Issue 11124
 function_type_parameter2_negative_test: CompileTimeError
 function_type_parameter_negative_test: CompileTimeError
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 30929
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 30929
 generic_local_functions_test: CompileTimeError # Issue 28515
 generic_methods_generic_function_parameter_test: CompileTimeError # Issue 28515
@@ -237,6 +235,30 @@
 void_type_usage_test/paren_literal_map_value_init: MissingCompileTimeError
 void_type_usage_test/paren_return: MissingCompileTimeError
 void_type_usage_test/paren_void_init: MissingCompileTimeError
+web_int_literals_test/01: MissingCompileTimeError
+web_int_literals_test/02: MissingCompileTimeError
+web_int_literals_test/03: MissingCompileTimeError
+web_int_literals_test/10: MissingCompileTimeError
+web_int_literals_test/11: MissingCompileTimeError
+web_int_literals_test/12: MissingCompileTimeError
+web_int_literals_test/13: MissingCompileTimeError
+web_int_literals_test/14: MissingCompileTimeError
+web_int_literals_test/20: MissingCompileTimeError
+web_int_literals_test/21: MissingCompileTimeError
+web_int_literals_test/22: MissingCompileTimeError
+web_int_literals_test/23: MissingCompileTimeError
+web_int_literals_test/24: MissingCompileTimeError
+web_int_literals_test/25: MissingCompileTimeError
+web_int_literals_test/26: MissingCompileTimeError
+web_int_literals_test/27: MissingCompileTimeError
+web_int_literals_test/28: MissingCompileTimeError
+web_int_literals_test/29: MissingCompileTimeError
+web_int_literals_test/61: MissingCompileTimeError
+web_int_literals_test/62: MissingCompileTimeError
+web_int_literals_test/63: MissingCompileTimeError
+web_int_literals_test/64: MissingCompileTimeError
+web_int_literals_test/65: MissingCompileTimeError
+web_int_literals_test/70: MissingCompileTimeError
 
 [ $compiler == dart2analyzer && $runtime == none ]
 error_stacktrace_test/00: MissingCompileTimeError
@@ -1170,6 +1192,8 @@
 string_unicode3_negative_test: CompileTimeError
 string_unicode4_negative_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Issue 33553
+super_no_such_method5_test/01: MissingCompileTimeError # Issue 33553
 super_setter_test: StaticWarning # Issue 28823
 switch_case_test/none: CompileTimeError
 syntax_test/60: MissingCompileTimeError
@@ -1353,7 +1377,6 @@
 generic_constructor_mixin_test/01: MissingCompileTimeError
 generic_field_mixin6_test/01: MissingCompileTimeError
 generic_function_typedef2_test/04: MissingCompileTimeError
-generic_methods_generic_function_result_test/01: MissingCompileTimeError # Issue #30207
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_test/01: MissingCompileTimeError
 identical_const_test/01: MissingCompileTimeError
@@ -1628,6 +1651,8 @@
 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
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index ef32963..a79000f 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -58,17 +58,8 @@
 field_type_check2_test/01: MissingRuntimeError
 regress_23996_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
 
-[ $compiler == dart2js && $runtime != none ]
-covariant_tear_off_type_test: RuntimeError
-
 [ $compiler == dart2js && $runtime != none && $checked ]
 assert_with_message_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_type/function_type0_test: RuntimeError # Issue 30476
 function_type/function_type10_test: RuntimeError # Issue 30476
 function_type/function_type12_test: RuntimeError # Issue 30476
@@ -140,8 +131,6 @@
 function_type/function_type90_test: RuntimeError # Issue 30476
 function_type/function_type96_test: RuntimeError # Issue 30476
 function_type/function_type9_test: RuntimeError # Issue 30476
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
 syncstar_covariant_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
 syncstar_dcall_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
 
@@ -319,8 +308,6 @@
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
 generalized_void_syntax_test: CompileTimeError # Issue #30176.
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
 generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_typedef_test: RuntimeError
@@ -516,13 +503,9 @@
 [ $compiler == dart2js && !$checked && $fasta ]
 bool_check_test: RuntimeError
 bool_condition_check_test: RuntimeError
-forwarding_stub_tearoff_generic_test: RuntimeError
-forwarding_stub_tearoff_test: RuntimeError
-issue31596_implement_covariant_test: RuntimeError
 issue31596_super_test/02: MissingCompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
-issue31596_test: RuntimeError
 
 [ $compiler == dart2js && $fast_startup ]
 library_env_test/has_mirror_support: Fail # mirrors not supported
@@ -570,15 +553,12 @@
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
 cyclic_constructor_test/01: Crash # Stack Overflow
 cyclic_type_test/00: RuntimeError
 cyclic_type_test/02: RuntimeError
 cyclic_type_test/03: RuntimeError
 cyclic_type_test/04: RuntimeError
-cyclic_typedef_test/10: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_10.dart,
-cyclic_typedef_test/11: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_11.dart,
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -614,30 +594,15 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_dynamic_test/02: MissingRuntimeError
-generic_methods_dynamic_test/04: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_unused_parameter_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
@@ -759,7 +724,6 @@
 nested_generic_closure_test: RuntimeError
 no_main_test/01: CompileTimeError
 no_such_method_mock_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
@@ -775,7 +739,6 @@
 redirecting_factory_default_values_test/01: MissingCompileTimeError
 redirecting_factory_default_values_test/02: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError
-regress_23089_test: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/tests/language_2/regress_23089_test.dart,
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # non JS number semantics
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -785,7 +748,6 @@
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
@@ -799,9 +761,6 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -832,6 +791,10 @@
 type_variable_promotion_test: RuntimeError
 
 [ $compiler == dart2js && $fasta ]
+arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 call_method_as_cast_test/06: RuntimeError
 call_method_implicit_tear_off_implements_function_test/05: RuntimeError
 call_method_implicit_tear_off_implements_function_test/06: RuntimeError
@@ -840,13 +803,31 @@
 call_method_must_not_be_getter_test/03: RuntimeError # Issue 32155
 checked_setter2_test: RuntimeError # Issue 31128
 checked_setter_test: RuntimeError # Issue 31128
+const_constructor_nonconst_param_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/03: Pass # but it shouldn't until we fix issue 17207
 constructor_redirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
+deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 duplicate_interface_implements_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 generic_test/01: MissingCompileTimeError # front end does not validate `extends`
+guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 instantiate_tearoff_of_call_test: RuntimeError
+int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/05: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/10: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/20: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/40: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_identical_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mixin_type_parameter_inference_error_test/none: CompileTimeError
 mixin_type_parameter_inference_previous_mixin_test/01: CompileTimeError
 mixin_type_parameter_inference_previous_mixin_test/02: CompileTimeError
@@ -862,6 +843,7 @@
 mixin_type_parameter_inference_test/13: CompileTimeError
 mixin_type_parameter_inference_test/16: CompileTimeError
 mixin_type_parameter_inference_test/none: CompileTimeError
+number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 partial_tearoff_instantiation_test/05: Pass # for the wrong reason.
 partial_tearoff_instantiation_test/06: Pass # for the wrong reason.
 partial_tearoff_instantiation_test/07: Pass # for the wrong reason.
@@ -935,7 +917,6 @@
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
 cyclic_type_test/00: RuntimeError
@@ -946,8 +927,6 @@
 cyclic_type_variable_test/02: MissingCompileTimeError
 cyclic_type_variable_test/03: MissingCompileTimeError
 cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash # Stack Overflow
-cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
@@ -992,31 +971,16 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_dynamic_test/02: MissingRuntimeError
-generic_methods_dynamic_test/04: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -1198,7 +1162,6 @@
 nested_generic_closure_test: RuntimeError
 no_main_test/01: CompileTimeError
 no_such_method_mock_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
@@ -1229,7 +1192,6 @@
 redirecting_factory_reflection_test: RuntimeError
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
-regress_23089_test: Crash # Stack Overflow
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError # non JS number semantics
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -1239,7 +1201,6 @@
 regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
@@ -1256,9 +1217,6 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -1441,15 +1399,12 @@
 constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
 covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 cyclic_constructor_test/01: Crash # Issue 30856
 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/10: Crash # Stack Overflow
-cyclic_typedef_test/11: Crash # Stack Overflow
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
@@ -1494,29 +1449,16 @@
 full_stacktrace1_test: RuntimeError # Issue 12698
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
 function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test: RuntimeError
 generic_function_type_as_type_argument_test/01: MissingCompileTimeError
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
 generic_methods_bounds_test/01: MissingCompileTimeError
 generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_dynamic_test/02: MissingRuntimeError
-generic_methods_dynamic_test/04: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -1706,7 +1648,6 @@
 no_such_method_mock_test: RuntimeError
 no_such_method_native_test: RuntimeError
 no_such_method_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
@@ -1736,7 +1677,6 @@
 regress_13462_1_test: RuntimeError
 regress_18535_test: RuntimeError
 regress_21795_test: RuntimeError # Issue 12605
-regress_23089_test: Crash # Stack Overflow
 regress_23408_test: CompileTimeError
 regress_24283_test: RuntimeError, OK # Requires 64 bit numbers.
 regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -1746,7 +1686,6 @@
 regress_29784_test/01: Crash # Issue 29784
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
@@ -1764,9 +1703,6 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
 super_test: RuntimeError
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
@@ -1861,7 +1797,7 @@
 cyclic_type2_test: RuntimeError # Issue 31054
 cyclic_type_test/0*: RuntimeError # Issue 31054
 f_bounded_quantification5_test: RuntimeError # Issue 31054
-generic_closure_test: RuntimeError # Issue 31054
+generic_closure_test/01: RuntimeError # Uses runtimeType.toString()
 mixin_mixin2_test: RuntimeError # Issue 31054
 mixin_mixin3_test: RuntimeError # Issue 31054
 mixin_mixin4_test: RuntimeError # Issue 31054
@@ -1870,3 +1806,4 @@
 mixin_mixin_bound2_test: RuntimeError # Issue 31054
 mixin_mixin_bound_test: RuntimeError # Issue 31054
 mixin_mixin_type_arguments_test: RuntimeError # Issue 31054
+runtime_type_function_test: RuntimeError # Uses runtimeType.toString()
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index dccaa3a..7160089 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -162,6 +162,8 @@
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
+super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
 super_operator_index5_test: RuntimeError # 33470
 super_operator_index7_test: RuntimeError # 33470
 super_operator_index8_test: RuntimeError # 33470
@@ -282,10 +284,35 @@
 void_type_usage_test/paren_literal_map_value_init: MissingCompileTimeError
 void_type_usage_test/paren_return: MissingCompileTimeError
 void_type_usage_test/paren_void_init: MissingCompileTimeError
+web_int_literals_test/01: MissingCompileTimeError
+web_int_literals_test/02: MissingCompileTimeError
+web_int_literals_test/03: MissingCompileTimeError
+web_int_literals_test/10: MissingCompileTimeError
+web_int_literals_test/11: MissingCompileTimeError
+web_int_literals_test/12: MissingCompileTimeError
+web_int_literals_test/13: MissingCompileTimeError
+web_int_literals_test/14: MissingCompileTimeError
+web_int_literals_test/20: MissingCompileTimeError
+web_int_literals_test/21: MissingCompileTimeError
+web_int_literals_test/22: MissingCompileTimeError
+web_int_literals_test/23: MissingCompileTimeError
+web_int_literals_test/24: MissingCompileTimeError
+web_int_literals_test/25: MissingCompileTimeError
+web_int_literals_test/26: MissingCompileTimeError
+web_int_literals_test/27: MissingCompileTimeError
+web_int_literals_test/28: MissingCompileTimeError
+web_int_literals_test/29: MissingCompileTimeError
+web_int_literals_test/61: MissingCompileTimeError
+web_int_literals_test/62: MissingCompileTimeError
+web_int_literals_test/63: MissingCompileTimeError
+web_int_literals_test/64: MissingCompileTimeError
+web_int_literals_test/65: MissingCompileTimeError
+web_int_literals_test/70: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
 additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
 additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
+arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 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
@@ -294,6 +321,9 @@
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
+bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -326,6 +356,7 @@
 const_cast1_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
 const_constructor_nonconst_field_test/01: MissingCompileTimeError
+const_constructor_nonconst_param_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/02: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
@@ -343,8 +374,6 @@
 cyclic_type_variable_test/02: MissingCompileTimeError
 cyclic_type_variable_test/03: MissingCompileTimeError
 cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash
-cyclic_typedef_test/11: Crash
 default_factory2_test/01: MissingCompileTimeError
 default_factory_test/01: MissingCompileTimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
@@ -352,6 +381,8 @@
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
 deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
 deferred_load_library_wrong_args_test/01: CompileTimeError
+deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -377,6 +408,7 @@
 function_type_parameter2_negative_test: Fail
 function_type_parameter_negative_test: Fail
 generic_function_bounds_test: RuntimeError
+generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_methods_overriding_test/01: MissingCompileTimeError # Issue 29920
 generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -387,6 +419,8 @@
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
 getter_override_test/03: MissingCompileTimeError
+guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
 identical_const_test/03: MissingCompileTimeError
@@ -403,6 +437,7 @@
 implicit_creation/implicit_const_not_default_values_test/e6: Pass
 implicit_creation/implicit_const_not_default_values_test/e9: Pass
 instantiate_tearoff_of_call_test: CompileTimeError
+int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 issue18628_2_test/01: MissingCompileTimeError
 issue31596_override_test/07: MissingCompileTimeError
 issue31596_override_test/08: MissingCompileTimeError
@@ -411,6 +446,7 @@
 issue31596_super_test/03: CompileTimeError
 issue31596_super_test/04: MissingCompileTimeError
 issue31596_super_test/05: RuntimeError
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 malbounded_instantiation_test/01: MissingCompileTimeError
 malbounded_instantiation_test/02: MissingCompileTimeError
 malbounded_instantiation_test/03: MissingCompileTimeError
@@ -434,6 +470,9 @@
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_identical_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
 mixin_forwarding_constructor4_test/03: MissingCompileTimeError
@@ -515,6 +554,7 @@
 named_parameters_default_eq_test/02: MissingCompileTimeError
 no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
 null_no_such_method_test: CompileTimeError # Issue 31533
+number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
@@ -534,15 +574,14 @@
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 redirecting_factory_reflection_test: RuntimeError # UnimplementedError: node <InvalidExpression> `invalid-expression`
-regress_23089_test: Crash # Crashes in KernelClassBuilder.buildTypeArguments
 regress_23408_test: CompileTimeError # Issue 31533
 regress_24283_test: RuntimeError # Expect.equals(expected: <-1>, actual: <4294967295>) fails.
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError # Issue 31402 Error: A value of type '#lib2::Foo' can't be assigned to a variable of type '(#lib2::Foo) → void'.
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
-regress_30339_test: CompileTimeError
 regress_30339_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
+regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
 setter_override_test/00: MissingCompileTimeError
@@ -553,9 +592,6 @@
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError # Issue 33498
-super_operator_index7_test: CompileTimeError # Issue 33498
-super_operator_index8_test: CompileTimeError # Issue 33498
 switch_bad_case_test/01: MissingCompileTimeError
 switch_bad_case_test/02: MissingCompileTimeError
 switch_case_test/00: MissingCompileTimeError
@@ -655,7 +691,6 @@
 flatten_test/12: MissingRuntimeError # Issue 29920
 for_variable_capture_test: RuntimeError # Issue 29920; Expect.equals(expected: <1>, actual: <0>) fails.
 function_subtype_inline2_test: RuntimeError # Expect.fail('Missing type error: 'new C.c1(m2)'.')
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
 generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
 generic_instanceof2_test: RuntimeError # Issue 29920; ReferenceError: FooOfK$String is not defined
 generic_is_check_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index cca8c17..533ae5ff 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -48,8 +48,6 @@
 cyclic_type2_test: CompileTimeError
 cyclic_type_test/02: CompileTimeError
 cyclic_type_test/04: CompileTimeError
-cyclic_typedef_test/10: DartkCrash
-cyclic_typedef_test/11: DartkCrash
 deferred_call_empty_before_load_test: RuntimeError
 deferred_load_constants_test/none: RuntimeError
 deferred_not_loaded_check_test: RuntimeError
@@ -141,7 +139,6 @@
 override_inheritance_method_test/29: CompileTimeError
 parser_quirks_test: CompileTimeError
 regress_22443_test: RuntimeError
-regress_23089_test: DartkCrash
 regress_23408_test: CompileTimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
@@ -167,6 +164,7 @@
 type_promotion_functions_test/none: CompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError
 vm/type_cast_vm_test: RuntimeError
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
 
 [ $compiler == dartkp ]
 class_cycle_test/02: MissingCompileTimeError
@@ -176,6 +174,7 @@
 duplicate_implements_test/02: MissingCompileTimeError
 generic_methods_generic_function_result_test/01: MissingCompileTimeError
 generic_no_such_method_dispatcher_test: RuntimeError # Issue 31424
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
 
 [ $compiler == fasta ]
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError
@@ -189,6 +188,7 @@
 assertion_initializer_const_error2_test/cc09: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc10: MissingCompileTimeError
 const_cast1_test/02: MissingCompileTimeError
+const_constructor_nonconst_param_test/01: MissingCompileTimeError
 generic_test/01: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e1: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e10: MissingCompileTimeError
@@ -214,6 +214,7 @@
 vm/regress_33469_test/02: MissingCompileTimeError
 vm/regress_33469_test/03: MissingCompileTimeError
 vm/regress_33469_test/04: MissingCompileTimeError
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
 
 [ $fasta ]
 abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
@@ -740,8 +741,6 @@
 cyclic_type2_test: RuntimeError, CompileTimeError
 cyclic_type_test/02: RuntimeError, CompileTimeError
 cyclic_type_test/04: RuntimeError, CompileTimeError
-cyclic_typedef_test/10: Crash # Issue 32416.
-cyclic_typedef_test/11: Crash # Issue 32416.
 deferred_call_empty_before_load_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
@@ -817,7 +816,6 @@
 redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
 redirecting_factory_malbounded_test/01: MissingCompileTimeError
 regress_22443_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
-regress_23089_test: Crash # Issue 32417.
 regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23408_test: RuntimeError
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -848,6 +846,7 @@
 void_type_usage_test/conditional2_return_to_void: MissingCompileTimeError
 void_type_usage_test/conditional3_return_to_void: MissingCompileTimeError
 void_type_usage_test/conditional_return_to_void: MissingCompileTimeError
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
 wrong_number_type_arguments_test/01: MissingCompileTimeError
 wrong_number_type_arguments_test/none: Pass
 
@@ -905,7 +904,6 @@
 vm/type_vm_test/36: MissingRuntimeError
 
 [ $compiler == dartkp && $runtime == dart_precompiled ]
-super_no_such_method5_test: RuntimeError # Issue 33517
 type_alias_equality_test/02: RuntimeError # Issue 31359
 type_alias_equality_test/03: RuntimeError # Issue 31359
 type_alias_equality_test/04: RuntimeError # Issue 31359
@@ -1038,8 +1036,6 @@
 cyclic_type2_test: Fail, OK
 cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
 cyclic_type_test/04: Fail, OK
-cyclic_typedef_test/10: Crash # Issue 32416.
-cyclic_typedef_test/11: Crash # Issue 32416.
 deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
@@ -1168,7 +1164,6 @@
 regress_13462_1_test: SkipByDesign
 regress_18535_test: SkipByDesign
 regress_22443_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
-regress_23089_test: Crash # Issue 32417.
 regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23408_test: RuntimeError
 regress_28255_test: SkipByDesign
@@ -1281,8 +1276,6 @@
 config_import_test: Crash
 const_constructor3_test/04: MissingCompileTimeError
 constants_test/05: MissingCompileTimeError
-cyclic_typedef_test/10: Crash
-cyclic_typedef_test/11: Crash
 deferred_load_library_wrong_args_test/01: CompileTimeError
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -1365,7 +1358,6 @@
 override_inheritance_method_test/28: CompileTimeError
 override_inheritance_method_test/29: CompileTimeError
 parser_quirks_test: CompileTimeError
-regress_23089_test: Crash
 regress_23408_test: CompileTimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
@@ -1376,9 +1368,6 @@
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_operator_index6_test: CompileTimeError # Issue 33498
-super_operator_index7_test: CompileTimeError # Issue 33498
-super_operator_index8_test: CompileTimeError # Issue 33498
 try_catch_test/01: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError
 type_promotion_functions_test/03: CompileTimeError
@@ -1446,7 +1435,10 @@
 prefix_transitive_import_prefix_test/03: MissingCompileTimeError
 prefix_transitive_import_test/01: MissingCompileTimeError
 prefix_transitive_import_test/02: MissingCompileTimeError
+regress_23089_test: MissingCompileTimeError
 setter_override2_test/02: MissingCompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
+super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
 variable_shadow_class_test/01: MissingCompileTimeError
 
 [ $mode == debug && $runtime == vm && $strong && ($compiler == app_jitk || $compiler == dartk) ]
@@ -2079,7 +2071,6 @@
 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_28217_test/01: MissingCompileTimeError
@@ -2244,10 +2235,6 @@
 *: SkipByDesign # language_2 is only supported in strong mode.
 
 [ ($compiler == app_jitk || $compiler == dartk || $compiler == dartkp) && ($runtime == dart_precompiled || $runtime == vm) ]
-super_no_such_method4_test: RuntimeError # Issue 33517
-super_operator_index6_test: CompileTimeError # Issue 33498
-super_operator_index7_test: CompileTimeError # Issue 33498
-super_operator_index8_test: CompileTimeError # Issue 33498
 type_alias_equality_test/02: RuntimeError # Issue 31359
 type_alias_equality_test/03: RuntimeError # Issue 31359
 type_alias_equality_test/04: RuntimeError # Issue 31359
diff --git a/tests/language_2/super_no_such_method4_test.dart b/tests/language_2/super_no_such_method4_test.dart
index 88dd2d7..e63f790 100644
--- a/tests/language_2/super_no_such_method4_test.dart
+++ b/tests/language_2/super_no_such_method4_test.dart
@@ -13,7 +13,7 @@
 class B extends Object with A {
   noSuchMethod(im) => 87;
 
-  foo() => super.foo();
+  foo() => super.foo(); //# 01: compile-time error
 }
 
 main() {
diff --git a/tests/language_2/super_no_such_method5_test.dart b/tests/language_2/super_no_such_method5_test.dart
index e798e79..07a6e46 100644
--- a/tests/language_2/super_no_such_method5_test.dart
+++ b/tests/language_2/super_no_such_method5_test.dart
@@ -11,7 +11,7 @@
 }
 
 class B extends Object with A {
-  foo() => super.foo();
+  foo() => super.foo(); //# 01: compile-time error
 }
 
 main() {
diff --git a/tests/language_2/super_operator_index6_test.dart b/tests/language_2/super_operator_index6_test.dart
index 830e490..41bffa4 100644
--- a/tests/language_2/super_operator_index6_test.dart
+++ b/tests/language_2/super_operator_index6_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 
-abstract class A {
+class A {
   var indexField = new List(2);
   operator []=(index, value) {
     indexField[index] = value;
diff --git a/tests/language_2/super_operator_index7_test.dart b/tests/language_2/super_operator_index7_test.dart
index af5606e..b64fef6 100644
--- a/tests/language_2/super_operator_index7_test.dart
+++ b/tests/language_2/super_operator_index7_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 
-abstract class A {
+class A {
   var indexField = new List(2);
 
   operator []=(index, value);
diff --git a/tests/language_2/super_operator_index8_test.dart b/tests/language_2/super_operator_index8_test.dart
index f4ad7d6..558c5a4 100644
--- a/tests/language_2/super_operator_index8_test.dart
+++ b/tests/language_2/super_operator_index8_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 
-abstract class A {
+class A {
   var indexField = new List(2);
 
   operator []=(index, value);
diff --git a/tests/language_2/vm/shift_special_cases_test.dart b/tests/language_2/vm/shift_special_cases_test.dart
new file mode 100644
index 0000000..604a0a3
--- /dev/null
+++ b/tests/language_2/vm/shift_special_cases_test.dart
@@ -0,0 +1,345 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
+
+// Test for special cases of << and >> integer operations with int64.
+
+import "package:expect/expect.dart";
+
+// int64 value, does not fit to smi
+int v1 = 0x778899aabbccddee;
+int v2 = 0x6000000000000000;
+int v3 = -0x778899aabbccddee;
+int negativeInt64 = -0x7000000000000000;
+int smi = 128;
+int negativeSmi = -3;
+
+int shl(int a, int b) => a << b;
+int shr(int a, int b) => a >> b;
+
+int shlUint32(int a, int b) => ((a & 0xffff) << b) & 0xffff;
+int shrUint32(int a, int b) => (a & 0xffff) >> b;
+
+int testInt64ShlByNegative1(int a, int b) {
+  int x = a + 1;
+  int y = a - 2;
+  try {
+    x = a << b;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0x778899aabbccddef, x);
+    Expect.equals(0x778899aabbccddec, y);
+  }
+}
+
+int testInt64ShlByNegative2(int a, int b) {
+  int x = a + 1;
+  int y = a - 2;
+  try {
+    x = shl(a, b);
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0x778899aabbccddef, x);
+    Expect.equals(0x778899aabbccddec, y);
+  }
+}
+
+int testInt64ShlByNegative3(int a) {
+  int x = a + 1;
+  int y = a - 2;
+  try {
+    int i = -64;
+    x = a << i;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0x778899aabbccddef, x);
+    Expect.equals(0x778899aabbccddec, y);
+  }
+}
+
+int testInt64ShrByNegative1(int a, int b) {
+  int x = a + 1;
+  int y = a - 2;
+  try {
+    x = a >> b;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0x778899aabbccddef, x);
+    Expect.equals(0x778899aabbccddec, y);
+  }
+}
+
+int testInt64ShrByNegative2(int a, int b) {
+  int x = a + 1;
+  int y = a - 2;
+  try {
+    x = shr(a, b);
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0x778899aabbccddef, x);
+    Expect.equals(0x778899aabbccddec, y);
+  }
+}
+
+int testInt64ShrByNegative3(int a) {
+  int x = a + 1;
+  int y = a - 2;
+  try {
+    int i = -64;
+    x = a >> i;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0x778899aabbccddef, x);
+    Expect.equals(0x778899aabbccddec, y);
+  }
+}
+
+int testInt64ShlByLarge1(int a, int b) {
+  int x = a << b;
+  Expect.equals(0, x);
+}
+
+int testInt64ShlByLarge2(int a) {
+  int i = 64;
+  int x = a << i;
+  Expect.equals(0, x);
+}
+
+int testInt64ShlByLarge3(int a) {
+  int i = 0x7fffffffffffffff;
+  int x = a << i;
+  Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge1a(int a, int b) {
+  int x = a >> b;
+  Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge1b(int a, int b) {
+  int x = a >> b;
+  Expect.equals(-1, x);
+}
+
+int testInt64ShrByLarge2a(int a) {
+  int i = 64;
+  int x = a >> i;
+  Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge2b(int a) {
+  int i = 64;
+  int x = a >> i;
+  Expect.equals(-1, x);
+}
+
+int testInt64ShrByLarge3a(int a) {
+  int i = 0x7fffffffffffffff;
+  int x = a >> i;
+  Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge3b(int a) {
+  int i = 0x7fffffffffffffff;
+  int x = a >> i;
+  Expect.equals(-1, x);
+}
+
+int testUint32ShlByNegative1(int a, int b) {
+  int x = (a & 0xfff) + 1;
+  int y = (a & 0xfff) - 2;
+  try {
+    x = ((a & 0xffff) << b) & 0xffff;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0xdef, x);
+    Expect.equals(0xdec, y);
+  }
+  return x;
+}
+
+int testUint32ShlByNegative2(int a, int b) {
+  int x = (a & 0xfff) + 1;
+  int y = (a & 0xfff) - 2;
+  try {
+    x = shlUint32(a, b);
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0xdef, x);
+    Expect.equals(0xdec, y);
+  }
+}
+
+int testUint32ShlByNegative3(int a) {
+  int x = (a & 0xfff) + 1;
+  int y = (a & 0xfff) - 2;
+  try {
+    int i = -64;
+    x = ((a & 0xffff) << i) & 0xffff;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0xdef, x);
+    Expect.equals(0xdec, y);
+  }
+}
+
+int testUint32ShrByNegative1(int a, int b) {
+  int x = (a & 0xfff) + 1;
+  int y = (a & 0xfff) - 2;
+  try {
+    x = ((a & 0xffff) >> b) & 0xffff;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0xdef, x);
+    Expect.equals(0xdec, y);
+  }
+}
+
+int testUint32ShrByNegative2(int a, int b) {
+  int x = (a & 0xfff) + 1;
+  int y = (a & 0xfff) - 2;
+  try {
+    x = shrUint32(a, b);
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0xdef, x);
+    Expect.equals(0xdec, y);
+  }
+}
+
+int testUint32ShrByNegative3(int a) {
+  int x = (a & 0xfff) + 1;
+  int y = (a & 0xfff) - 2;
+  try {
+    int i = -64;
+    x = ((a & 0xffff) >> i) & 0xffff;
+    Expect.fail('Shift by negative count should throw an error');
+  } on ArgumentError {
+    Expect.equals(0xdef, x);
+    Expect.equals(0xdec, y);
+  }
+}
+
+int testUint32ShlByLarge1(int a, int b) {
+  int x = ((a & 0xffff) << b) & 0xffff;
+  Expect.equals(0, x);
+}
+
+int testUint32ShlByLarge2(int a) {
+  int i = 64;
+  int x = ((a & 0xffff) << i) & 0xffff;
+  Expect.equals(0, x);
+}
+
+int testUint32ShlByLarge3(int a) {
+  int i = 0x7fffffffffffffff;
+  int x = ((a & 0xffff) << i) & 0xffff;
+  Expect.equals(0, x);
+}
+
+int testUint32ShrByLarge1(int a, int b) {
+  int x = ((a & 0xffff) >> b) & 0xffff;
+  Expect.equals(0, x);
+}
+
+int testUint32ShrByLarge2(int a) {
+  int i = 64;
+  int x = ((a & 0xffff) >> i) & 0xffff;
+  Expect.equals(0, x);
+}
+
+int testUint32ShrByLarge3(int a) {
+  int i = 0x7fffffffffffffff;
+  int x = ((a & 0xffff) >> i) & 0xffff;
+  Expect.equals(0, x);
+}
+
+doTests1() {
+  testInt64ShlByNegative1(v1, negativeSmi);
+  testInt64ShlByNegative2(v1, negativeSmi);
+  testInt64ShlByNegative3(v1);
+
+  testInt64ShrByNegative1(v1, negativeSmi);
+  testInt64ShrByNegative2(v1, negativeSmi);
+  testInt64ShrByNegative3(v1);
+
+  testInt64ShlByLarge1(v1, smi);
+  testInt64ShlByLarge1(v3, smi);
+
+  testInt64ShlByLarge2(v1);
+  testInt64ShlByLarge2(v3);
+
+  testInt64ShlByLarge3(v1);
+  testInt64ShlByLarge3(v3);
+
+  testInt64ShrByLarge1a(v1, smi);
+  testInt64ShrByLarge1b(v3, smi);
+
+  testInt64ShrByLarge2a(v1);
+  testInt64ShrByLarge2b(v3);
+
+  testInt64ShrByLarge3a(v1);
+  testInt64ShrByLarge3b(v3);
+
+  testUint32ShlByNegative1(v1, negativeSmi);
+  testUint32ShlByNegative2(v1, negativeSmi);
+  testUint32ShlByNegative3(v1);
+
+  testUint32ShrByNegative1(v1, negativeSmi);
+  testUint32ShrByNegative2(v1, negativeSmi);
+  testUint32ShrByNegative3(v1);
+
+  testUint32ShlByLarge1(v1, smi);
+  testUint32ShlByLarge1(v3, smi);
+
+  testUint32ShlByLarge2(v1);
+  testUint32ShlByLarge2(v3);
+
+  testUint32ShlByLarge3(v1);
+  testUint32ShlByLarge3(v3);
+
+  testUint32ShrByLarge1(v1, smi);
+  testUint32ShrByLarge1(v3, smi);
+
+  testUint32ShrByLarge2(v1);
+  testUint32ShrByLarge2(v3);
+
+  testUint32ShrByLarge3(v1);
+  testUint32ShrByLarge3(v3);
+}
+
+doTests2() {
+  testInt64ShlByNegative1(v1, negativeInt64);
+  testInt64ShlByNegative2(v1, negativeInt64);
+
+  testInt64ShrByNegative1(v1, negativeInt64);
+  testInt64ShrByNegative2(v1, negativeInt64);
+
+  testInt64ShlByLarge1(v1, v2);
+  testInt64ShlByLarge1(v3, v2);
+
+  testInt64ShrByLarge1a(v1, v2);
+  testInt64ShrByLarge1b(v3, v2);
+
+  testUint32ShlByNegative1(v1, negativeInt64);
+  testUint32ShlByNegative2(v1, negativeInt64);
+
+  testUint32ShrByNegative1(v1, negativeInt64);
+  testUint32ShrByNegative2(v1, negativeInt64);
+
+  testUint32ShlByLarge1(v1, v2);
+  testUint32ShlByLarge1(v3, v2);
+
+  testUint32ShrByLarge1(v1, v2);
+  testUint32ShrByLarge1(v3, v2);
+}
+
+main() {
+  for (var i = 0; i < 20; ++i) {
+    doTests1();
+  }
+  for (var i = 0; i < 50; ++i) {
+    doTests2();
+  }
+}
diff --git a/tests/language_2/web_int_literals_test.dart b/tests/language_2/web_int_literals_test.dart
new file mode 100644
index 0000000..a85c49a
--- /dev/null
+++ b/tests/language_2/web_int_literals_test.dart
@@ -0,0 +1,66 @@
+// 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";
+
+main() {
+  check(0x8000000000000000);
+
+  check(0x7FFF00001111F000);
+  check(0x7FFF00001111FC00);
+  check(0x7FFF00001111FE00); //         //# 01: compile-time error
+  check(0x7FFF00001111FF00); //         //# 02: compile-time error
+  check(0x7FFF00001111FFFF); //         //# 03: compile-time error
+
+  check(0xFFFF00001111F000);
+  check(0xFFFF00001111F800);
+  check(0xFFFF00001111FC00); //         //# 10: compile-time error
+  check(0xFFFF00001111FE00); //         //# 11: compile-time error
+  check(0xFFFF00001111FF00); //         //# 12: compile-time error
+  check(0xFFFF00001111FFFF); //         //# 13: compile-time error
+
+  // Test all runs of 53 and 54 bits.
+  check(0x000FFFFFFFFFFFFF);
+  check(0x001FFFFFFFFFFFFF);
+  check(0x003FFFFFFFFFFFFF); //         //# 20: compile-time error
+  check(0x003FFFFFFFFFFFFE);
+  check(0x007FFFFFFFFFFFFE); //         //# 21: compile-time error
+  check(0x007FFFFFFFFFFFFC);
+  check(0x00FFFFFFFFFFFFFC); //         //# 22: compile-time error
+  check(0x00FFFFFFFFFFFFF8);
+  check(0x01FFFFFFFFFFFFF8); //         //# 23: compile-time error
+  check(0x01FFFFFFFFFFFFF0);
+  check(0x03FFFFFFFFFFFFF0); //         //# 22: compile-time error
+  check(0x03FFFFFFFFFFFFE0);
+  check(0x07FFFFFFFFFFFFE0); //         //# 24: compile-time error
+  check(0x07FFFFFFFFFFFFC0);
+  check(0x0FFFFFFFFFFFFFC0); //         //# 25: compile-time error
+  check(0x0FFFFFFFFFFFFF80);
+  check(0x1FFFFFFFFFFFFF80); //         //# 26: compile-time error
+  check(0x1FFFFFFFFFFFFF00);
+  check(0x3FFFFFFFFFFFFF00); //         //# 27: compile-time error
+  check(0x3FFFFFFFFFFFFE00);
+  check(0x7FFFFFFFFFFFFE00); //         //# 28: compile-time error
+  check(0x7FFFFFFFFFFFFC00);
+  check(0xFFFFFFFFFFFFFC00); //         //# 29: compile-time error
+  check(0xFFFFFFFFFFFFF800);
+
+  // Too big, even on VM.
+  check(9223372036854775808); //        //# 60: compile-time error
+  check(9223372036854775807); //        //# 61: compile-time error
+  check(9223372036854775806); //        //# 62: compile-time error
+  // 9223372036854775808 - 512 is rounded.
+  check(9223372036854775296); //        //# 63: compile-time error
+  // 9223372036854775808 - 1024 is exact.
+  check(9223372036854774784);
+
+  check(-9223372036854775808);
+  check(-9223372036854775807); //       //# 64: compile-time error
+  check(-9223372036854775296); //       //# 65: compile-time error
+  check(-9223372036854774784);
+
+  check(1000000000000000001); //        //# 70: compile-time error
+}
+
+check(int n) {}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 116c44e..9dd0262 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -278,6 +278,7 @@
 
 [ $compiler == dart2js && $fasta ]
 mirrors/*: SkipByDesign # mirrors not supported
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 
 [ $compiler == dart2js && $fasta && $host_checked ]
 async/stream_controller_async_test: Crash
diff --git a/tests/lib_2/async/run_zoned8_test.dart b/tests/lib_2/async/run_zoned8_test.dart
index 450eff6..fca3989 100644
--- a/tests/lib_2/async/run_zoned8_test.dart
+++ b/tests/lib_2/async/run_zoned8_test.dart
@@ -24,8 +24,9 @@
       events.add(counter);
       throw counter;
     });
-  }, onError: (e) {
+  }, onError: (e, [s]) {
     events.add("error: $e");
+    Expect.isNotNull(s); // Regression test for http://dartbug.com/33589
   });
 
   done.future.whenComplete(() {
diff --git a/tests/lib_2/html/element_classes_svg_test.dart b/tests/lib_2/html/element_classes_svg_test.dart
index e7214a5..23a6de0 100644
--- a/tests/lib_2/html/element_classes_svg_test.dart
+++ b/tests/lib_2/html/element_classes_svg_test.dart
@@ -34,12 +34,9 @@
   expect(noElementsTop.length, 0);
   expect(noElementsTop is List, true);
 
-  var varWeird = querySelectorAll<svg.CircleElement>('path');
-  expect(varWeird.length, 1);
-  expect(varWeird is List, true);
-  expect(varWeird is List<svg.CircleElement>, true);
-  // Runtime error expected 'PathElement' is not a subtype of expected type 'CircleElement'.'
-  Expect.throwsTypeError(() => varWeird[0] is svg.CircleElement);
+  // Expect runtime error all elements in the list are not the proper type.
+  Expect.throwsAssertionError(() => querySelectorAll<svg.CircleElement>('path'),
+      'All elements not of type CircleElement');
 
   var simpleElems = querySelectorAll('circle');
   expect(simpleElems.length, 1);
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index fed5352..ac52cb5 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -683,6 +683,10 @@
 html/indexeddb_5_test: RuntimeError
 html/js_typed_interop_default_arg_test/explicit_argument: RuntimeError
 html/js_typed_interop_test: RuntimeError
+math/double_pow_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 
 [ $compiler == dart2js && $fasta && $host_checked ]
 html/custom/mirrors_2_test: Crash # 'file:*/pkg/compiler/lib/src/common_elements.dart': Failed assertion: line 405 pos 12: 'element.name == '=='': is not true.
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 2fdab77..5a926e1 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -14,6 +14,10 @@
 convert/chunked_conversion_utf87_test: RuntimeError
 convert/utf82_test: RuntimeError
 html/debugger_test: CompileTimeError
+math/double_pow_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 
 [ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/element_animate_test/timing_dict: RuntimeError # Issue 29922
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index e8a160c..6ea3848 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -145,8 +145,8 @@
 mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
 mirrors/metadata_scope_test/none: RuntimeError
 mirrors/method_mirror_location_test: RuntimeError
-mirrors/method_mirror_source_line_ending_test: Crash
-mirrors/method_mirror_source_test: Crash
+mirrors/method_mirror_source_line_ending_test: RuntimeError # Issue 33478
+mirrors/method_mirror_source_test: RuntimeError # Issue 33041
 mirrors/mirrors_nsm_mismatch_test: CompileTimeError # Issue 31533
 mirrors/mirrors_nsm_test/dart2js: CompileTimeError # Issue 31533
 mirrors/mirrors_nsm_test/none: CompileTimeError # Issue 31533
diff --git a/tests/lib_2/mirrors/metadata_symbol_literal_test.dart b/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
new file mode 100644
index 0000000..e632d68
--- /dev/null
+++ b/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
@@ -0,0 +1,21 @@
+// 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:mirrors';
+import 'package:expect/expect.dart';
+
+class T {
+  const T(this.symbol);
+  final Symbol symbol;
+}
+
+class U {
+  @T(#x)
+  int field;
+}
+
+main() {
+  final metadata = reflectClass(U).declarations[#field].metadata;
+  Expect.identical((metadata.first.reflectee as T).symbol, const Symbol('x'));
+}
diff --git a/tests/standalone_2/io/non_utf8_directory_test.dart b/tests/standalone_2/io/non_utf8_directory_test.dart
index 1ebe6b9..1c58f3f 100644
--- a/tests/standalone_2/io/non_utf8_directory_test.dart
+++ b/tests/standalone_2/io/non_utf8_directory_test.dart
@@ -13,76 +13,80 @@
   var syncDir;
 
   test('Non-UTF8 Directory Listing', () async {
-    Directory.current = await Directory.systemTemp.createTemp();
-    final rawPath = new Uint8List.fromList([182]);
-    asyncDir = new Directory.fromRawPath(rawPath);
-    if (Platform.isMacOS || Platform.isIOS) {
-      try {
-        await asyncDir.create();
-      } on FileSystemException catch (e) {
-        // Macos doesn't support non-UTF-8 paths.
-        return;
-      }
-    } else {
-      await asyncDir.create();
-    }
-    expect(await asyncDir.exists(), isTrue);
-
-    await for (final e in Directory.current.list()) {
-      // FIXME(bkonyi): reenable when rawPath is exposed.
-      /*
-      if (Platform.isWindows) {
-        // Windows replaces invalid characters with � when creating file system
-        // entities.
-        final raw = e.rawPath;
-        expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+    Directory tmp;
+    try {
+      tmp = await Directory.systemTemp
+          .createTemp('non_utf8_directory_test_async');
+      final rawPath = new Uint8List.fromList([182]);
+      asyncDir = new Directory.fromRawPath(rawPath);
+      if (Platform.isMacOS || Platform.isIOS) {
+        try {
+          await asyncDir.create();
+        } on FileSystemException catch (e) {
+          // Macos doesn't support non-UTF-8 paths.
+          await tmp.delete(recursive: true);
+          return;
+        }
       } else {
-        expect(e.rawPath.last, 182);
+        await asyncDir.create();
       }
-      */
+      expect(await asyncDir.exists(), isTrue);
+
+      await for (final e in tmp.list()) {
+        // FIXME(bkonyi): reenable when rawPath is exposed.
+        /*
+        if (Platform.isWindows) {
+          // Windows replaces invalid characters with � when creating file system
+          // entities.
+          final raw = e.rawPath;
+          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+        } else {
+          expect(e.rawPath.last, 182);
+        }
+        */
+      }
+      await asyncDir.delete(recursive: true);
+    } finally {
+      await tmp.delete(recursive: true);
     }
-    await asyncDir.delete(recursive: true);
   });
 
   test('Non-UTF8 Directory Sync Listing', () {
-    Directory.current = Directory.systemTemp.createTempSync();
-    final rawPath = new Uint8List.fromList([182]);
-    syncDir = new Directory.fromRawPath(rawPath);
+    Directory tmp;
+    try {
+      tmp = Directory.systemTemp.createTempSync('non_utf8_directory_test_sync');
+      final rawPath = new Uint8List.fromList([182]);
+      syncDir = new Directory.fromRawPath(rawPath);
 
-    if (Platform.isMacOS || Platform.isIOS) {
-      try {
-        syncDir.createSync();
-      } on FileSystemException catch (e) {
-        // Macos doesn't support non-UTF-8 paths.
-        return;
-      }
-    } else {
-      syncDir.createSync();
-    }
-    expect(syncDir.existsSync(), isTrue);
-
-    for (final e in Directory.current.listSync()) {
-      // FIXME(bkonyi): reenable when rawPath is exposed.
-      /*
-      if (Platform.isWindows) {
-        // Windows replaces invalid characters with � when creating file system
-        // entities.
-        final raw = e.rawPath;
-        expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+      if (Platform.isMacOS || Platform.isIOS) {
+        try {
+          syncDir.createSync();
+        } on FileSystemException catch (e) {
+          // Macos doesn't support non-UTF-8 paths.
+          tmp.deleteSync(recursive: true);
+          return;
+        }
       } else {
-        expect(e.rawPath.last, 182);
+        syncDir.createSync();
       }
-      */
-    }
-    syncDir.deleteSync(recursive: true);
-  });
+      expect(syncDir.existsSync(), isTrue);
 
-  tearDown(() {
-    if ((asyncDir != null) && asyncDir.existsSync()) {
-      asyncDir.deleteSync(recursive: true);
-    }
-    if ((syncDir != null) && syncDir.existsSync()) {
+      for (final e in tmp.listSync()) {
+        // FIXME(bkonyi): reenable when rawPath is exposed.
+        /*
+        if (Platform.isWindows) {
+          // Windows replaces invalid characters with � when creating file system
+          // entities.
+          final raw = e.rawPath;
+          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+        } else {
+          expect(e.rawPath.last, 182);
+        }
+        */
+      }
       syncDir.deleteSync(recursive: true);
+    } finally {
+      tmp.deleteSync(recursive: true);
     }
   });
 }
diff --git a/tests/standalone_2/io/non_utf8_file_test.dart b/tests/standalone_2/io/non_utf8_file_test.dart
index df35c06..3bdafa1 100644
--- a/tests/standalone_2/io/non_utf8_file_test.dart
+++ b/tests/standalone_2/io/non_utf8_file_test.dart
@@ -13,84 +13,87 @@
   var syncFile;
 
   test('Non-UTF8 Filename', () async {
-    Directory.current = await Directory.systemTemp.createTemp();
-    final rawPath = new Uint8List.fromList([182]);
-    asyncFile = new File.fromRawPath(rawPath);
-    if (Platform.isMacOS || Platform.isIOS) {
-      try {
-        await asyncFile.create();
-      } on FileSystemException catch (e) {
-        // Macos doesn't support non-UTF-8 paths.
-        return;
-      }
-    } else {
-      await asyncFile.create();
-    }
-    expect(await asyncFile.exists(), isTrue);
-
-    for (final file in Directory.current.listSync()) {
-      // FIXME(bkonyi): reenable when rawPath is exposed.
-      /*
-      if (Platform.isWindows) {
-        // Windows replaces invalid characters with � when creating file system
-        // entities.
-        final raw = file.rawPath;
-        expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+    Directory tmp;
+    try {
+      tmp = await Directory.systemTemp.createTemp('non_utf8_file_test_async');
+      final rawPath = new Uint8List.fromList([182]);
+      asyncFile = new File.fromRawPath(rawPath);
+      if (Platform.isMacOS || Platform.isIOS) {
+        try {
+          await asyncFile.create();
+        } on FileSystemException catch (e) {
+          // Macos doesn't support non-UTF-8 paths.
+          await tmp.delete(recursive: true);
+          return;
+        }
       } else {
-        expect(file.rawPath.last, 182);
+        await asyncFile.create();
       }
-      */
-      // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
-      if (!Platform.isMacOS && !Platform.isIOS) {
-        expect(file.path.endsWith('�'), isTrue);
+      expect(await asyncFile.exists(), isTrue);
+
+      for (final file in tmp.listSync()) {
+        // FIXME(bkonyi): reenable when rawPath is exposed.
+        /*
+        if (Platform.isWindows) {
+          // Windows replaces invalid characters with � when creating file system
+          // entities.
+          final raw = file.rawPath;
+          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+        } else {
+          expect(file.rawPath.last, 182);
+        }
+        */
+        // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
+        if (!Platform.isMacOS && !Platform.isIOS) {
+          expect(file.path.endsWith('�'), isTrue);
+        }
       }
+      await asyncFile.delete();
+    } finally {
+      await tmp.delete(recursive: true);
     }
-    await asyncFile.delete();
   });
 
   test('Non-UTF8 Filename Sync', () {
-    Directory.current = Directory.systemTemp.createTempSync();
-    final rawPath = new Uint8List.fromList([182]);
-    syncFile = new File.fromRawPath(rawPath);
+    Directory tmp;
+    try {
+      tmp = Directory.systemTemp.createTempSync('non_utf8_file_test_sync');
+      final rawPath = new Uint8List.fromList([182]);
+      syncFile = new File.fromRawPath(rawPath);
 
-    if (Platform.isMacOS || Platform.isIOS) {
-      try {
-        syncFile.createSync();
-      } on FileSystemException catch (e) {
-        // Macos doesn't support non-UTF-8 paths.
-        return;
-      }
-    } else {
-      syncFile.createSync();
-    }
-    expect(syncFile.existsSync(), isTrue);
-
-    for (final file in Directory.current.listSync()) {
-      // FIXME(bkonyi): reenable when rawPath is exposed.
-      /*
-      if (Platform.isWindows) {
-        // Windows replaces invalid characters with � when creating file system
-        // entities.
-        final raw = file.rawPath;
-        expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+      if (Platform.isMacOS || Platform.isIOS) {
+        try {
+          syncFile.createSync();
+        } on FileSystemException catch (e) {
+          // Macos doesn't support non-UTF-8 paths.
+          tmp.deleteSync(recursive: true);
+          return;
+        }
       } else {
-        expect(file.rawPath.last, 182);
+        syncFile.createSync();
       }
-      */
-      // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
-      if (!Platform.isMacOS && !Platform.isIOS) {
-        expect(file.path.endsWith('�'), isTrue);
-      }
-    }
-    syncFile.deleteSync();
-  });
+      expect(syncFile.existsSync(), isTrue);
 
-  tearDown(() {
-    if ((asyncFile != null) && asyncFile.existsSync()) {
-      asyncFile.deleteSync();
-    }
-    if ((syncFile != null) && syncFile.existsSync()) {
+      for (final file in tmp.listSync()) {
+        // FIXME(bkonyi): reenable when rawPath is exposed.
+        /*
+        if (Platform.isWindows) {
+          // Windows replaces invalid characters with � when creating file system
+          // entities.
+          final raw = file.rawPath;
+          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+        } else {
+          expect(file.rawPath.last, 182);
+        }
+        */
+        // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
+        if (!Platform.isMacOS && !Platform.isIOS) {
+          expect(file.path.endsWith('�'), isTrue);
+        }
+      }
       syncFile.deleteSync();
+    } finally {
+      tmp.deleteSync(recursive: true);
     }
   });
 }
diff --git a/tests/standalone_2/io/non_utf8_link_test.dart b/tests/standalone_2/io/non_utf8_link_test.dart
index 4527412..aadd30a 100644
--- a/tests/standalone_2/io/non_utf8_link_test.dart
+++ b/tests/standalone_2/io/non_utf8_link_test.dart
@@ -16,114 +16,117 @@
   const dirName = 'foobar';
 
   test('Non-UTF8 Link', () async {
-    Directory tmp = await Directory.systemTemp.createTemp();
-    Directory.current = await tmp.resolveSymbolicLinks();
-    final path = join(Directory.current.path, dirName);
-    final rawPath =
-        utf8.encode(path).sublist(0, path.length - dirName.length).toList();
-    rawPath.add(47);
-    rawPath.add(182);
+    Directory tmp =
+        await Directory.systemTemp.createTemp('non_utf8_link_test_async');
+    try {
+      tmp = new Directory(await tmp.resolveSymbolicLinks());
+      final path = join(tmp.path, dirName);
+      final rawPath =
+          utf8.encode(path).sublist(0, path.length - dirName.length).toList();
+      rawPath.add(47);
+      rawPath.add(182);
 
-    final f = new Directory(path);
-    await f.create();
-    expect(await f.exists(), isTrue);
+      final f = new Directory(path);
+      await f.create();
+      expect(await f.exists(), isTrue);
 
-    final rawName = new Uint8List.fromList(rawPath);
-    asyncLink = new Link.fromRawPath(rawName);
+      final rawName = new Uint8List.fromList(rawPath);
+      asyncLink = new Link.fromRawPath(rawName);
 
-    if (Platform.isMacOS || Platform.isIOS) {
-      try {
-        asyncLink = await asyncLink.create(path);
-      } on FileSystemException catch (e) {
-        // Macos doesn't support non-UTF-8 paths.
-        return;
-      }
-    } else {
-      asyncLink = await asyncLink.create(path);
-    }
-    expect(await asyncLink.exists(), isTrue);
-
-    await for (final e in Directory.current.list()) {
-      if (e is Link) {
-        // FIXME(bkonyi): reenable when rawPath is exposed.
-        /*
-        if (Platform.isWindows) {
-          // Windows replaces invalid characters with � when creating file system
-          // entities.
-          final raw = e.rawPath;
-          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
-        } else {
-          expect(e.rawPath.last, 182);
+      if (Platform.isMacOS || Platform.isIOS) {
+        try {
+          asyncLink = await asyncLink.create(path);
+        } on FileSystemException catch (e) {
+          // Macos doesn't support non-UTF-8 paths.
+          await tmp.delete(recursive: true);
+          return;
         }
-        */
-        expect(e.path, path);
+      } else {
+        asyncLink = await asyncLink.create(path);
       }
-    }
+      expect(await asyncLink.exists(), isTrue);
 
-    // FIXME(bkonyi): reenable when rawPath is exposed.
-    // expect(asyncLink.absolute.rawPath, rawPath);
-    expect(await asyncLink.resolveSymbolicLinks(), path);
-    expect(await asyncLink.target(), path);
-    await asyncLink.delete();
+      await for (final e in tmp.list()) {
+        if (e is Link) {
+          // FIXME(bkonyi): reenable when rawPath is exposed.
+          /*
+          if (Platform.isWindows) {
+            // Windows replaces invalid characters with � when creating file system
+            // entities.
+            final raw = e.rawPath;
+            expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+          } else {
+            expect(e.rawPath.last, 182);
+          }
+          */
+          expect(e.path, path);
+        }
+      }
+
+      // FIXME(bkonyi): reenable when rawPath is exposed.
+      // expect(asyncLink.absolute.rawPath, rawPath);
+      expect(await asyncLink.resolveSymbolicLinks(), path);
+      expect(await asyncLink.target(), path);
+      await asyncLink.delete();
+    } finally {
+      await tmp.delete(recursive: true);
+    }
   });
 
   test('Non-UTF8 Link Sync', () {
-    Directory tmp = Directory.systemTemp.createTempSync();
-    Directory.current = tmp.resolveSymbolicLinksSync();
-    final path = join(Directory.current.path, dirName);
-    final rawPath =
-        utf8.encode(path).sublist(0, path.length - dirName.length).toList();
-    rawPath.add(47); // '/'
-    rawPath.add(182); // invalid UTF-8 character.
+    Directory tmp =
+        Directory.systemTemp.createTempSync('non_utf8_link_test_sync');
+    try {
+      tmp = new Directory(tmp.resolveSymbolicLinksSync());
+      final path = join(tmp.path, dirName);
+      final rawPath =
+          utf8.encode(path).sublist(0, path.length - dirName.length).toList();
+      rawPath.add(47); // '/'
+      rawPath.add(182); // invalid UTF-8 character.
 
-    final f = new Directory(path);
-    f.createSync();
-    expect(f.existsSync(), isTrue);
+      final f = new Directory(path);
+      f.createSync();
+      expect(f.existsSync(), isTrue);
 
-    final rawName = new Uint8List.fromList(rawPath);
-    syncLink = new Link.fromRawPath(rawName);
+      final rawName = new Uint8List.fromList(rawPath);
+      syncLink = new Link.fromRawPath(rawName);
 
-    if (Platform.isMacOS || Platform.isIOS) {
-      try {
-        syncLink.createSync(path);
-      } on FileSystemException catch (e) {
-        // Macos doesn't support non-UTF-8 paths.
-        return;
-      }
-    } else {
-      syncLink.createSync(path);
-    }
-    expect(syncLink.existsSync(), isTrue);
-
-    for (final e in Directory.current.listSync()) {
-      if (e is Link) {
-        // FIXME(bkonyi): reenable when rawPath is exposed.
-        /*
-        if (Platform.isWindows) {
-          // Windows replaces invalid characters with � when creating file system
-          // entities.
-          final raw = e.rawPath;
-          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
-        } else {
-          expect(e.rawPath.last, 182);
+      if (Platform.isMacOS || Platform.isIOS) {
+        try {
+          syncLink.createSync(path);
+        } on FileSystemException catch (e) {
+          // Macos doesn't support non-UTF-8 paths.
+          tmp.deleteSync(recursive: true);
+          return;
         }
-        */
-        expect(e.path, path);
+      } else {
+        syncLink.createSync(path);
       }
-    }
-    // FIXME(bkonyi): reenable when rawPath is exposed.
-    // expect(syncLink.absolute.rawPath, rawPath);
-    expect(syncLink.resolveSymbolicLinksSync(), path);
-    expect(syncLink.targetSync(), path);
-    syncLink.deleteSync();
-  });
+      expect(syncLink.existsSync(), isTrue);
 
-  tearDown(() {
-    if ((asyncLink != null) && asyncLink.existsSync()) {
-      asyncLink.deleteSync();
-    }
-    if ((syncLink != null) && syncLink.existsSync()) {
+      for (final e in tmp.listSync()) {
+        if (e is Link) {
+          // FIXME(bkonyi): reenable when rawPath is exposed.
+          /*
+          if (Platform.isWindows) {
+            // Windows replaces invalid characters with � when creating file system
+            // entities.
+            final raw = e.rawPath;
+            expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+          } else {
+            expect(e.rawPath.last, 182);
+          }
+          */
+          expect(e.path, path);
+        }
+      }
+      // FIXME(bkonyi): reenable when rawPath is exposed.
+      // expect(syncLink.absolute.rawPath, rawPath);
+      expect(syncLink.resolveSymbolicLinksSync(), path);
+      expect(syncLink.targetSync(), path);
       syncLink.deleteSync();
+    } finally {
+      tmp.deleteSync(recursive: true);
     }
   });
 }
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 77fcc36..be289b1 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -176,10 +176,6 @@
 deferred_transitive_import_error_test: Crash
 fragmentation_test: Pass, Crash # Issue 31421
 io/addlatexhash_test: Pass, Crash # Issue 31252
-io/non_utf8_directory_test: Skip # Issue 33519
-io/non_utf8_file_test: Skip # Issue 33519
-io/non_utf8_link_test: Skip # Issue 33519
-io/non_utf8_output_test: Skip # Issue 33519
 io/raw_datagram_read_all_test: Pass, Fail # Timing dependent.
 io/skipping_dart2js_compilations_test: Pass, Slow # Slow.
 io/test_runner_test: Pass, Slow # Slow.
diff --git a/tools/VERSION b/tools/VERSION
index c3f1dcf..bbc4468 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 64
-PRERELEASE_PATCH 1
+PRERELEASE 65
+PRERELEASE_PATCH 0
diff --git a/tools/apps/update_homebrew/lib/update_homebrew.dart b/tools/apps/update_homebrew/lib/update_homebrew.dart
index 2e251bb..521e35d 100644
--- a/tools/apps/update_homebrew/lib/update_homebrew.dart
+++ b/tools/apps/update_homebrew/lib/update_homebrew.dart
@@ -50,7 +50,8 @@
         'dart-archive', 'channels/$channel/release/$revision/VERSION',
         downloadOptions: DownloadOptions.FullMedia);
 
-    var versionObject = await json.fuse(ascii).decoder.bind(media.stream).first;
+    var versionObject =
+        await json.fuse(ascii).decoder.bind(media.stream).first as Map;
     return versionObject['version'];
   } finally {
     client.close();
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 3e2549b..786a339 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -393,7 +393,7 @@
           "arguments": ["--timeout=240", "--no-preview-dart-2"],
           "environment": {
             "ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
-            "ASAN_SYMBOLIZER_PATH": "buildtools/toolchain/clang+llvm-x86_64-linux/bin/llvm-symbolizer"
+            "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
           }
         },
         {
@@ -401,7 +401,7 @@
           "arguments": ["--checked", "--no-preview-dart-2", "--timeout=240"],
           "environment": {
             "ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
-            "ASAN_SYMBOLIZER_PATH": "buildtools/toolchain/clang+llvm-x86_64-linux/bin/llvm-symbolizer"
+            "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
           }
         }
       ]
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index a713b78..d5ee488 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -512,11 +512,10 @@
     [DartName=start2] void start(optional double when);
 };
 
-// Remove operations webkitRequestFullscreen replaced w/ requestFullscreen.
+// Remove operation requestFullscreen only use webKitRequestFullscreen.
 [DartSupplemental]
 interface Element : Node {
-    [DartSuppress] void webkitRequestFullScreen([Default=Undefined] optional unsigned short flags);
-    [DartSuppress] void webkitRequestFullscreen();
+    [DartSuppress] void requestFullscreen();
 };
 
 [DartSupplemental]
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 1f74820..7b7dabf 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -817,7 +817,7 @@
   "PaymentRequestEvent.openWindow": { "type": "WindowClient" },
   "RTCPeerConnection.createOffer": { "type": "RtcSessionDescription" },
   "RTCPeerConnection.createAnswer": { "type": "RtcSessionDescription" },
-  "RTCPeerConnection.getStats": { "type": "dictionary", "maplike": "RTCStatsReport"},
+  "RTCPeerConnection.getStats": { "type": "RtcStatsReport", "maplike": "RTCStatsReport"},
   "RTCPeerConnection.generateCertificate": { "type": "RtcCertificate" },
   "Permissions.query": { "type": "PermissionStatus" },
   "Permissions.request": { "type": "PermissionStatus" },
@@ -1328,15 +1328,19 @@
       promiseType = 'Future'
       promiseCall = 'promiseToFuture'
       if promiseFound is not(None):
+        paramType = promiseFound['type']
         if 'maplike' in promiseFound:
-          promiseCall = 'promiseToFuture<dynamic>'
-          promiseType = 'Future'
-        elif promiseFound['type'] == 'dictionary':
+          if paramType == 'dictionary':
+            promiseCall = 'promiseToFuture<dynamic>'
+            promiseType = 'Future'
+          else:
+            promiseCall = 'promiseToFuture<%s>' % paramType
+            promiseType = 'Future<%s>' % paramType
+        elif paramType == 'dictionary':
           # It's a dictionary so return as a Map.
           promiseCall = 'promiseToFutureAsMap'
           promiseType = 'Future<Map<String, dynamic>>'
         else:
-          paramType = promiseFound['type']
           promiseCall = 'promiseToFuture<%s>' % paramType
           promiseType = 'Future<%s>' % paramType
 
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index 2b6bdf6..1b0f7a7 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -58,7 +58,6 @@
   ElementList<T> querySelectorAll<T extends Element>(String selectors) =>
     new _FrozenElementList<T>._wrap(_querySelectorAll(selectors));
 
-
   String get innerHtml {
     final e = new DivElement();
     e.append(this.clone(true));
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index f8f956e..0b740f3 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -263,7 +263,10 @@
     implements ElementList<E>, NodeListWrapper {
   final List<Node> _nodeList;
 
-  _FrozenElementList._wrap(this._nodeList);
+  _FrozenElementList._wrap(this._nodeList) {
+     assert(this._nodeList.every((element) => element is E),
+         "Query expects only HTML elements of type $E but found ${this._nodeList.firstWhere((e) => e is! E)}");
+  }
 
   int get length => _nodeList.length;
 
diff --git a/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate b/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
index 20e19cf..98b15e5 100644
--- a/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
@@ -6,8 +6,6 @@
 
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS
 {
-  @DomName('SpeechSynthesis.getVoices')
-  @DocsEditable()
   List<SpeechSynthesisVoice> getVoices() {
     List<SpeechSynthesisVoice> voices = _getVoices();
     if (voices.length > 0)
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
index 28be29b..42028b7 100755
--- a/tools/observatory_tool.py
+++ b/tools/observatory_tool.py
@@ -179,6 +179,7 @@
     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
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index 445af50..e12fb60 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-2abdfae6bf237e3d10e7d6e7680e62653c59f167
\ No newline at end of file
+cb26a440fbe1a3cef64c580ee9055a746278ea82
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index 355c7c2..03cf63f 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-e2d609d355ce8e8a0de9dc107818055fead5c6c1
\ No newline at end of file
+c66ec04f2b2e00c30b307eb2275a2bd91fa97287
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 9cd92de..361bfca 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-c5cca53d8fa715c6409eca288cd5560d55d50bdc
\ No newline at end of file
+26a6441397eea6cf00c7b3e565de4aa40c43a9c6
\ No newline at end of file
diff --git a/tools/test.py b/tools/test.py
index 3b45606..48df925 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -16,8 +16,7 @@
   tools_dir = os.path.dirname(os.path.realpath(__file__))
   dart_test_script = string.join(
       [tools_dir, 'testing', 'dart', 'main.dart'], os.sep)
-  command = [utils.CheckedInSdkExecutable(),
-             '--checked', dart_test_script] + args
+  command = [utils.CheckedInSdkExecutable(), dart_test_script] + args
 
   # The testing script potentially needs the android platform tools in PATH so
   # we do that in ./tools/test.py (a similar logic exists in ./tools/build.py).
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 5493852..5296bd1 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -465,7 +465,8 @@
       }
     }
 
-    if (configuration['no_preview_dart_2'] && configuration['preview_dart_2']) {
+    if (configuration['no_preview_dart_2'] == true &&
+        configuration['preview_dart_2'] == true) {
       _fail('"--no-preview-dart-2" and "--preview-dart-2" specified,');
     }
 
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 84594c8..3da5f0d 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1468,7 +1468,7 @@
     for (var match in matches) {
       result.add(wordSplit(match[1]));
     }
-    if (result.isEmpty) result.add([]);
+    if (result.isEmpty) result.add(<String>[]);
 
     dartOptions = singleListOfOptions('DartOptions');
     sharedOptions = singleListOfOptions('SharedOptions');
@@ -1660,7 +1660,7 @@
     bool isMultitest = multiTestRegExp.hasMatch(contents);
 
     return {
-      "vmOptions": <List>[[]],
+      "vmOptions": <List<String>>[[]],
       "sharedOptions": <String>[],
       "dart2jsOptions": <String>[],
       "dartOptions": null,
diff --git a/utils/bazel/BUILD.gn b/utils/bazel/BUILD.gn
index 6f6d3da..eb754ab 100644
--- a/utils/bazel/BUILD.gn
+++ b/utils/bazel/BUILD.gn
@@ -7,4 +7,5 @@
 application_snapshot("kernel_worker") {
   main_dart = "kernel_worker.dart"
   training_args = [ "--help" ]
+  dart_version = 2
 }
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index 27bfd22..f069fcb 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -128,7 +128,7 @@
   if (multiRoots.isEmpty) multiRoots.add(Uri.base);
   var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
       multiRoots, fe.StandardFileSystem.instance);
-  var sources = parsedArgs['source'].map(Uri.parse).toList();
+  var sources = (parsedArgs['source'] as List<String>).map(Uri.parse).toList();
   Target target;
   var summaryOnly = parsedArgs['summary-only'] as bool;
   var excludeNonSources = parsedArgs['exclude-non-sources'] as bool;
@@ -143,8 +143,12 @@
       null,
       Uri.base.resolve(parsedArgs['dart-sdk-summary']),
       Uri.base.resolve(parsedArgs['packages-file']),
-      parsedArgs['input-summary'].map(Uri.base.resolve).toList(),
-      parsedArgs['input-linked'].map(Uri.base.resolve).toList(),
+      (parsedArgs['input-summary'] as List<String>)
+          .map(Uri.base.resolve)
+          .toList(),
+      (parsedArgs['input-linked'] as List<String>)
+          .map(Uri.base.resolve)
+          .toList(),
       target,
       fileSystem);
 
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index c94d732..53197d5 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -29,6 +29,11 @@
     ":runtime_lib_files_stamp",
   ]
 
+  # dart_action() needs kernel service snapshot to run in Dart 2 mode.
+  # This can't be added as a dependency to dart_action() itself as it will
+  # create a circular dependency.
+  deps += [ "../../utils/kernel-service:copy_kernel_service_snapshot" ]
+
   output_dir = rebase_path(target_gen_dir)
 
   script = "create_snapshot_entry.dart"
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index d3e0c7b..ab80bcc 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -89,6 +89,12 @@
       "../compiler:compile_dart2js_platform",
       "../compiler:compile_dart2js_platform_strong",
     ]
+
+    # dart_action() needs kernel service snapshot to run in Dart 2 mode.
+    # This can't be added as a dependency to dart_action() itself as it will
+    # create a circular dependency.
+    deps += [ "../../utils/kernel-service:copy_kernel_service_snapshot" ]
+
     inputs = sdk_lib_files + compiler_files + dev_compiler_files + [
                "$root_out_dir/dart2js_platform.dill",
                "$root_out_dir/dart2js_outline.dill",
@@ -124,8 +130,6 @@
 # Apply dev_compiler's patch files to create the Dart version of the dartdevc
 # SDK.
 prebuilt_dart_action("dartdevc_patch_sdk") {
-  vm_args = ["--preview-dart-2"]
-
   # TODO(rnystrom): Unfork DDC's patch_sdk.dart script with the
   # tools/patch_sdk.dart and then change this to use generate_patch_sdk().
   deps = [
@@ -167,8 +171,6 @@
 # Compiles the Dart core libraries and DDC runtime to an analyzer summary and
 # JS.
 prebuilt_dart_action("dartdevc_sdk") {
-  vm_args = ["--preview-dart-2"]
-
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_patch_sdk",
@@ -265,8 +267,6 @@
 # Compiles the packages used by the tests to JS with dartdevc so that they are
 # available for loading by the tests.
 prebuilt_dart_action("dartdevc_test_pkg") {
-  vm_args = ["--preview-dart-2"]
-
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_sdk",
@@ -328,8 +328,6 @@
 
 # Compiles the DDC SDK's kernel summary and JS code.
 prebuilt_dart_action("dartdevk_sdk") {
-  vm_args = ["--preview-dart-2"]
-
   deps = [
     "../../pkg:pkg_files_stamp",
     ":dartdevc_files_stamp",
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index 0adf27a..a87616b 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -5,11 +5,6 @@
 import("../application_snapshot.gni")
 
 application_snapshot("pub") {
-  main_dart = "../../third_party/pkg/pub/bin/pub.dart"
-  training_args = [ "--help" ]
-}
-
-application_snapshot("pub2") {
   dart_version = 2
   main_dart = "../../third_party/pkg/pub/bin/pub.dart"
   training_args = [ "--help" ]
