Version 2.0.0-dev.65.0

Merge commit '12971f37a982f42c3e65e51dde4bfb9bc866f7aa' into dev
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" ]