Re-enable the old analyzer/FE integration logic.

This gets the tests running again.  I'll follow this up with CLs that
reshape the ResolutionStorer API to match the Factory API we're
building, and then after that we can transition the code over to
calling the Factory API directly.

Fixes #33504
Fixes #32258

Change-Id: I105841ed5b2ed1198ec5e3e7387f694c61d36ca7
Reviewed-on: https://dart-review.googlesource.com/61101
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 165760f..355a0e9 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -48,7 +48,7 @@
       });
 
       // TODO(scheglov): Restore similar test coverage when the front-end API
-      // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
+      // allows it.  See https://github.com/dart-lang/sdk/issues/33520.
       // test('$benchmarkId-use-cfe', () {
       //   ProcessResult r = Process.runSync(
       //     Platform.resolvedExecutable,
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index a69de4a..f7974b4 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisErrorIntegrationTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
+    defineReflectiveTests(AnalysisErrorIntegrationTest_UseCFE);
   });
 }
 
@@ -109,14 +107,20 @@
 
   @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() {
-    // This does pass with the new FE.
     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 b106bf0..981e904 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetErrorsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetErrorsTest_UseCFE);
+    defineReflectiveTests(GetErrorsTest_UseCFE);
   });
 }
 
@@ -42,4 +40,10 @@
 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 08f8e52..7a10b8a 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
@@ -15,9 +15,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
+    defineReflectiveTests(AnalysisGetImportedElementsIntegrationTest_UseCFE);
   });
 }
 
@@ -147,4 +145,16 @@
     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 a9d7bb7..96995ae 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -75,4 +75,10 @@
   @override
   @failingTest
   test_navigation() => super.test_navigation();
+
+  @override
+  @failingTest
+  test_navigation_no_result() {
+    fail('This test crashes 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 d217042..ae9649d 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -87,4 +87,22 @@
 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 7054ac4..eeda63a 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OccurrencesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OccurrencesTest_UseCFE);
+    defineReflectiveTests(OccurrencesTest_UseCFE);
   });
 }
 
@@ -73,4 +71,10 @@
 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 0952955..6192813 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OutlineTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OutlineTest_UseCFE);
+    defineReflectiveTests(OutlineTest_UseCFE);
   });
 }
 
@@ -77,4 +75,10 @@
 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 39c4bb4..2cfb696 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -126,4 +126,10 @@
 class OverridesTest_UseCFE extends OverridesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_overrides() {
+    return 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 4411cc6..5cca2f0 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetAnalysisRootsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
+    defineReflectiveTests(SetAnalysisRootsTest_UseCFE);
   });
 }
 
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 2ee347d..0cb0424 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -55,4 +55,10 @@
 class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_reanalyze_concurrent() {
+    fail('This test crashes under the CFE');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 319a4a4..27a4c81 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -44,4 +44,10 @@
 class ReanalyzeTest_UseCFE extends ReanalyzeTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_reanalyze() {
+    fail('This test crashes under the 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 f9ebcb0..dfbbe69 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,4 +36,10 @@
 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 c75655b..bbd07a0 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
@@ -46,4 +46,10 @@
 class SetGeneralSubscriptionsTest_UseCFE extends SetGeneralSubscriptionsTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    fail('This test crashes under the 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 7d86706..64aeb6d 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
@@ -34,4 +34,10 @@
 class SetPriorityFilesTest_UseCFE extends SetPriorityFilesTest {
   @override
   bool get useCFE => true;
+
+  @failingTest
+  @override
+  test_options() {
+    fail('This test crashes under the 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 02dcd05..c1fcead 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -36,4 +36,10 @@
 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_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index 55e1e84..2c084a5 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UpdateContentTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(UpdateContentTest_UseCFE);
+    defineReflectiveTests(UpdateContentTest_UseCFE);
   });
 }
 
@@ -112,4 +110,16 @@
 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 dbdc7fa..b5087a9 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetSuggestionsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetSuggestionsTest_UseCFE);
+    defineReflectiveTests(GetSuggestionsTest_UseCFE);
   });
 }
 
@@ -123,4 +121,22 @@
 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 0d359f6..260ab07 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,4 +41,10 @@
 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 c0e52b7..6fd7413 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -70,4 +70,10 @@
   @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 842e443..7d7faba 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
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(GetPostfixCompletionTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
+    defineReflectiveTests(GetPostfixCompletionTest_UseCFE);
   });
 }
 
@@ -58,4 +56,10 @@
 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 da142fc..e565a1e 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -144,4 +144,22 @@
     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 02025b9..4dbf569 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
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IsPostfixCompletionApplicableTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
+    defineReflectiveTests(IsPostfixCompletionApplicableTest_UseCFE);
   });
 }
 
@@ -48,4 +46,10 @@
     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 6bb94c5..a9009c7 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
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListPostfixCompletionTemplatesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
+    defineReflectiveTests(ListPostfixCompletionTemplatesTest_UseCFE);
   });
 }
 
@@ -48,4 +46,10 @@
     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 3a9f686..a30d913 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -12,9 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(OrganizeDirectivesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
+    defineReflectiveTests(OrganizeDirectivesTest_UseCFE);
   });
 }
 
@@ -82,4 +80,22 @@
 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 3cf0e19..07904fd 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -47,4 +47,10 @@
 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 9990a23..d0c886c 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -44,4 +44,10 @@
 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 823ac4d..234fd49 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,4 +43,10 @@
 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 3b7e1a0..4f1cdd7 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
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindElementReferencesTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(FindElementReferencesTest_UseCFE);
+    defineReflectiveTests(FindElementReferencesTest_UseCFE);
   });
 }
 
@@ -81,6 +79,12 @@
 
   @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');
 }
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 28a8828..bdab78a 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
@@ -11,9 +11,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FindMemberDeclarationsTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
+    defineReflectiveTests(FindMemberDeclarationsTest_UseCFE);
   });
 }
 
@@ -57,4 +55,10 @@
 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 de8e9b7..231aa4f 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -13,9 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(StatusTest);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StatusTest_UseCFE);
+    defineReflectiveTests(StatusTest_UseCFE);
   });
 }
 
@@ -56,4 +54,10 @@
 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/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 8cfdda3..ff4bb12 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -4,6 +4,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/kernel_metadata.dart';
+import 'package:analyzer/src/fasta/resolution_storer.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -26,6 +27,7 @@
 import 'package:front_end/src/fasta/source/stack_listener.dart';
 import 'package:front_end/src/fasta/target_implementation.dart';
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:front_end/src/fasta/uri_translator_impl.dart';
 import 'package:kernel/class_hierarchy.dart';
@@ -39,31 +41,7 @@
 
 /// Resolution information in a single function body.
 class CollectedResolution {
-  /// The list of local declarations stored by body builders while
-  /// compiling the library.
-  final List<TreeNode> kernelDeclarations = [];
-
-  /// The list of references to local or external stored by body builders
-  /// while compiling the library.
-  final List<Node> kernelReferences = [];
-
-  /// The list of types stored by body builders while compiling the library.
-  final List<DartType> kernelTypes = [];
-
-  /// File offsets corresponding to the declarations in [kernelDeclarations].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> declarationOffsets = [];
-
-  /// File offsets corresponding to the objects in [kernelReferences].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> referenceOffsets = [];
-
-  /// File offsets corresponding to the types in [kernelTypes].
-  ///
-  /// These are used strictly for validation purposes.
-  final List<int> typeOffsets = [];
+  final Map<int, ResolutionData<DartType, int, Node, int>> kernelData = {};
 }
 
 /// The compilation result for a single file.
@@ -399,7 +377,9 @@
 
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope]) {
+      [Scope formalParameterScope,
+      TypeInferenceListener<int, int, Node, int> listener]) {
+    ResolutionStorer<int, int, Node, int> storer;
     var fileResolutions = _resolutions[builder.fileUri];
     if (fileResolutions == null) {
       fileResolutions = <CollectedResolution>[];
@@ -407,8 +387,9 @@
     }
     var resolution = new CollectedResolution();
     fileResolutions.add(resolution);
+    storer = new ResolutionStorer<int, int, Node, int>(resolution.kernelData);
     return super.createListener(
-        builder, memberScope, isInstanceMember, formalParameterScope);
+        builder, memberScope, isInstanceMember, formalParameterScope, storer);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index a9090d2..c58b12b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -21,7 +20,6 @@
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/fasta/error_converter.dart';
@@ -32,7 +30,6 @@
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/kernel/resynthesize.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
@@ -452,10 +449,10 @@
   /// Create a new [ResolutionApplier] for the given front-end [resolution].
   /// The [context] element is used to associate synthetic elements and access
   /// type parameters from the enclosing scopes.
-  ResolutionApplier _createResolutionApplier(
-      ElementImpl context, CollectedResolution resolution) {
-    return new _ResolutionApplierContext(
-            _resynthesizer, _typeProvider, _libraryElement, resolution, context)
+  ResolutionApplier _createResolutionApplier(ElementImpl context,
+      CollectedResolution resolution, Map<int, AstNode> localDeclarations) {
+    return new _ResolutionApplierContext(_resynthesizer, _typeProvider,
+            _libraryElement, resolution, context, localDeclarations)
         .applier;
   }
 
@@ -738,24 +735,26 @@
     }
   }
 
-  void _resolveFile2(
-      FileState file, CompilationUnit unit, _ResolutionProvider resolutions) {
+  void _resolveFile2(FileState file, CompilationUnitImpl unit,
+      _ResolutionProvider resolutions) {
     CompilationUnitElement unitElement = unit.element;
     new DeclarationResolver(enableKernelDriver: true, applyKernelTypes: true)
         .resolve(unit, unitElement);
 
-    if (_libraryElement.context.analysisOptions.previewDart2) {
-      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
-          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
-    }
+    // TODO(paulberry): need to find a better way to do this.
+    // See dartbug.com/33506.
+//    if (_libraryElement.context.analysisOptions.previewDart2) {
+//      unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
+//          file.source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
+//    }
 
     for (var declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
         if (declaration.metadata.isNotEmpty) {
           var resolution = resolutions.next();
-          var applier = _createResolutionApplier(null, resolution);
+          var applier = _createResolutionApplier(
+              null, resolution, unit.localDeclarations);
           applier.applyToAnnotations(declaration);
-          applier.checkDone();
         }
         for (var member in declaration.members) {
           if (member is ConstructorDeclaration) {
@@ -774,31 +773,31 @@
               // TODO(scheglov) Add support for type parameterized redirects.
             } else {
               var resolution = resolutions.next();
-              var applier = _createResolutionApplier(context, resolution);
+              var applier = _createResolutionApplier(
+                  context, resolution, unit.localDeclarations);
               member.initializers.accept(applier);
               member.parameters.accept(applier);
               member.body.accept(applier);
               applier.applyToAnnotations(member);
-              applier.checkDone();
             }
           } else if (member is FieldDeclaration) {
             List<VariableDeclaration> fields = member.fields.variables;
             var context = fields[0].element as ElementImpl;
             var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
+            var applier = _createResolutionApplier(
+                context, resolution, unit.localDeclarations);
             for (var field in fields.reversed) {
               field.initializer?.accept(applier);
             }
             applier.applyToAnnotations(member);
-            applier.checkDone();
           } else if (member is MethodDeclaration) {
             ExecutableElementImpl context = member.element;
             var resolution = resolutions.next();
-            var applier = _createResolutionApplier(context, resolution);
+            var applier = _createResolutionApplier(
+                context, resolution, unit.localDeclarations);
             member.parameters?.accept(applier);
             member.body.accept(applier);
             applier.applyToAnnotations(member);
-            applier.checkDone();
           } else {
             throw new StateError('(${declaration.runtimeType}) $declaration');
           }
@@ -810,11 +809,11 @@
       } else if (declaration is FunctionDeclaration) {
         var context = declaration.element as ExecutableElementImpl;
         var resolution = resolutions.next();
-        var applier = _createResolutionApplier(context, resolution);
+        var applier = _createResolutionApplier(
+            context, resolution, unit.localDeclarations);
         declaration.functionExpression.parameters?.accept(applier);
         declaration.functionExpression.body.accept(applier);
         applier.applyToAnnotations(declaration);
-        applier.checkDone();
       } else if (declaration is FunctionTypeAlias) {
         // No bodies to resolve.
       } else if (declaration is GenericTypeAlias) {
@@ -823,12 +822,12 @@
         List<VariableDeclaration> variables = declaration.variables.variables;
         var context = variables[0].element as ElementImpl;
         var resolution = resolutions.next();
-        var applier = _createResolutionApplier(context, resolution);
+        var applier = _createResolutionApplier(
+            context, resolution, unit.localDeclarations);
         for (var variable in variables.reversed) {
           variable.initializer?.accept(applier);
         }
         applier.applyToAnnotations(declaration);
-        applier.checkDone();
       } else {
         throw new StateError('(${declaration.runtimeType}) $declaration');
       }
@@ -1039,6 +1038,7 @@
   final TypeProvider typeProvider;
   final LibraryElement libraryElement;
   final CollectedResolution resolution;
+  final Map<int, AstNode> localDeclarations;
 
   @override
   ClassElement enclosingClassElement;
@@ -1046,17 +1046,15 @@
   List<ElementImpl> contextStack = [];
   ElementImpl context;
 
-  List<Element> declaredElements = [];
-  Map<kernel.TreeNode, Element> declarationToElement = new HashMap.identity();
-  Map<FunctionElementImpl, kernel.TreeNode> functionElementToDeclaration =
-      new HashMap.identity();
-  Map<ParameterElementImpl, kernel.VariableDeclaration>
-      parameterElementToDeclaration = new HashMap.identity();
-
   ResolutionApplier applier;
 
-  _ResolutionApplierContext(this.resynthesizer, this.typeProvider,
-      this.libraryElement, this.resolution, this.context) {
+  _ResolutionApplierContext(
+      this.resynthesizer,
+      this.typeProvider,
+      this.libraryElement,
+      this.resolution,
+      this.context,
+      this.localDeclarations) {
     for (Element element = context;
         element != null;
         element = element.enclosingElement) {
@@ -1066,108 +1064,30 @@
       }
     }
 
-    // Convert local declarations into elements.
-    for (var declaredNode in resolution.kernelDeclarations) {
-      translateKernelDeclaration(declaredNode);
-    }
-
     // Convert referenced nodes into elements.
-    List<Element> referencedElements = [];
-    for (var referencedNode in resolution.kernelReferences) {
-      Element element;
-      if (referencedNode is kernel.VariableDeclaration) {
-        kernel.TreeNode parent = referencedNode.parent;
-        if (parent is kernel.Statement) {
-          element = declarationToElement[referencedNode];
-        } else {
-          assert(parent is kernel.FunctionNode || parent is kernel.Catch);
-          // Might be a parameter of a local function.
-          element = declarationToElement[referencedNode];
-          // If no element, then it is a parameter of the context executable.
-          if (element == null) {
-            ExecutableElementImpl contextExecutable = context;
-            for (var parameter in contextExecutable.parameters) {
-              if (parameter.name == referencedNode.name) {
-                element = parameter;
-                break;
-              }
-            }
-          }
-        }
-        assert(element != null);
-      } else if (referencedNode is kernel.NamedNode) {
-        element = resynthesizer
-            .getElementFromCanonicalName(referencedNode.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.DynamicType) {
-        element = DynamicElementImpl.instance;
-      } else if (referencedNode is kernel.FunctionType) {
-        element = resynthesizer
-            .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.InterfaceType) {
-        element = resynthesizer.getElementFromCanonicalName(
-            referencedNode.classNode.canonicalName);
-        assert(element != null);
-      } else if (referencedNode is kernel.MemberGetterNode) {
-        if (referencedNode.member == null) {
-          element = null;
-        } else {
-          var memberElement = resynthesizer
-              .getElementFromCanonicalName(referencedNode.member.canonicalName);
-          assert(memberElement != null);
-          if (memberElement is PropertyInducingElementImpl) {
-            element = memberElement.getter;
-            assert(element != null);
-          } else {
-            element = memberElement;
-          }
-        }
-      } else if (referencedNode is kernel.MemberSetterNode) {
-        if (referencedNode.member == null) {
-          element = null;
-        } else {
-          var memberElement = resynthesizer
-              .getElementFromCanonicalName(referencedNode.member.canonicalName);
-          assert(memberElement != null);
-          if (memberElement is PropertyInducingElementImpl) {
-            element = memberElement.setter;
-            assert(element != null);
-          } else {
-            element = memberElement;
-          }
-        }
-      } else if (referencedNode is kernel.ImportPrefixNode) {
-        assert(referencedNode.name != null);
-        for (var import in libraryElement.imports) {
-          if (import.prefix?.name == referencedNode.name) {
-            element = import.prefix;
-            break;
-          }
-        }
-        assert(element != null);
-      } else if (referencedNode is kernel.NullNode) {
-        element = null;
-      } else if (referencedNode == null) {
-        // This will occur if an identifier could not be resolved, such as a
-        // reference to a member when the target has type `dynamic`.
-        element = null;
-      } else {
-        throw new UnimplementedError(
-            'Declaration: (${referencedNode.runtimeType}) $referencedNode');
-      }
-      referencedElements.add(element);
+    Map<int, kernel.ResolutionData<DartType, Element, Element, PrefixElement>>
+        convertedData = {};
+    for (var location in resolution.kernelData.keys) {
+      var data = resolution.kernelData[location];
+      convertedData[location] = new kernel.ResolutionData(
+          argumentTypes: data.argumentTypes == null
+              ? null
+              : data.argumentTypes.map(translateType).toList(),
+          combiner: _translateReference(data.combiner),
+          declaration: _translateDeclaration(data.declaration),
+          inferredType: translateType(data.inferredType),
+          invokeType: translateType(data.invokeType),
+          isExplicitCall: data.isExplicitCall,
+          isImplicitCall: data.isImplicitCall,
+          isWriteReference: data.isWriteReference,
+          literalType: translateType(data.literalType),
+          prefixInfo: _translatePrefixInfo(data.prefixInfo),
+          reference: _translateReference(data.reference,
+              isWriteReference: data.isWriteReference),
+          writeContext: translateType(data.writeContext));
     }
 
-    applier = new ValidatingResolutionApplier(
-        libraryElement,
-        this,
-        declaredElements,
-        referencedElements,
-        resolution.kernelTypes,
-        resolution.declarationOffsets,
-        resolution.referenceOffsets,
-        resolution.typeOffsets);
+    applier = new ResolutionApplier(libraryElement, this, convertedData);
   }
 
   @override
@@ -1188,28 +1108,6 @@
     // The function is the new resolution context.
     contextStack.add(context);
     context = element;
-
-    var declaration = functionElementToDeclaration[element];
-
-    // Get the declaration kernel type.
-    kernel.FunctionType kernelType;
-    if (declaration is kernel.VariableDeclaration) {
-      kernelType = declaration.type;
-    } else if (declaration is kernel.FunctionExpression) {
-      kernelType = declaration.function.functionType;
-    } else {
-      throw new StateError('(${declaration.runtimeType}) $declaration');
-    }
-
-    element.returnType = resynthesizer.getType(context, kernelType.returnType);
-
-    for (var parameter in element.parameters) {
-      ParameterElementImpl parameterImpl = parameter;
-      var kernelParameter = parameterElementToDeclaration[parameter];
-      parameterImpl.type = resynthesizer.getType(context, kernelParameter.type);
-    }
-
-    element.type = new FunctionTypeImpl(element);
   }
 
   @override
@@ -1218,43 +1116,62 @@
     context = contextStack.removeLast();
   }
 
-  /// Translate the given [declaration].
-  void translateKernelDeclaration(kernel.TreeNode declaration) {
-    if (declaration is kernel.VariableDeclaration) {
-      kernel.TreeNode functionDeclaration = declaration.parent;
-      if (functionDeclaration is kernel.FunctionDeclaration) {
-        var element =
-            new FunctionElementImpl(declaration.name, declaration.fileOffset);
-        functionElementToDeclaration[element] = declaration;
-        _addFormalParameters(element, functionDeclaration.function);
-        declaredElements.add(element);
-        declarationToElement[declaration] = element;
-      } else {
-        // TODO(scheglov) Do we need ConstLocalVariableElementImpl?
-        var element = new LocalVariableElementImpl(
-            declaration.name, declaration.fileOffset);
-        declaredElements.add(element);
-        declarationToElement[declaration] = element;
-      }
-    } else if (declaration is kernel.FunctionExpression) {
-      var element = new FunctionElementImpl('', declaration.fileOffset);
-      functionElementToDeclaration[element] = declaration;
-      _addFormalParameters(element, declaration.function);
-      declaredElements.add(element);
-      declarationToElement[declaration] = element;
+  Element _translateDeclaration(int declarationOffset) {
+    if (declarationOffset == null) return null;
+    var declaration = localDeclarations[declarationOffset];
+    Element element;
+    if (declaration is VariableDeclaration) {
+      element = declaration.element;
+    } else if (declaration is FormalParameter) {
+      element = declaration.element;
+    } else if (declaration is DeclaredSimpleIdentifier) {
+      element = declaration.staticElement;
+    } else if (declaration is FunctionDeclaration) {
+      element = declaration.element;
+    } else {
+      throw new UnimplementedError('${declaration.runtimeType}');
+    }
+    assert(element != null);
+    return element;
+  }
+
+  PrefixElement _translatePrefixInfo(int importIndex) {
+    if (importIndex == null) return null;
+    return libraryElement.imports[importIndex].prefix;
+  }
+
+  Element _translateReference(kernel.Node referencedNode,
+      {bool isWriteReference = false}) {
+    if (referencedNode == null) return null;
+    Element element;
+    if (referencedNode is kernel.NamedNode) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.canonicalName);
+    } else if (referencedNode is kernel.FunctionType) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.typedef.canonicalName);
+      assert(element != null);
+    } else if (referencedNode is kernel.InterfaceType) {
+      element = resynthesizer
+          .getElementFromCanonicalName(referencedNode.classNode.canonicalName);
+      assert(element != null);
     } else {
       throw new UnimplementedError(
-          'Declaration: (${declaration.runtimeType}) $declaration');
+          'TODO(paulberry): ${referencedNode.runtimeType}');
+    }
+    if (element is PropertyInducingElement) {
+      return isWriteReference ? element.setter : element.getter;
+    } else {
+      return element;
     }
   }
 
   @override
   DartType translateType(kernel.DartType kernelType) {
-    if (kernelType is kernel.NullType) {
-      return null;
-    } else if (kernelType is kernel.IndexAssignNullFunctionType) {
+    if (kernelType == null) {
       return null;
     } else if (kernelType is kernel.TypeArgumentsDartType) {
+      // TODO(paulberry): get rid of this case
       List<kernel.DartType> kernelTypes = kernelType.types;
       var types = new List<DartType>(kernelTypes.length);
       for (var i = 0; i < kernelTypes.length; i++) {
@@ -1265,54 +1182,6 @@
       return resynthesizer.getType(context, kernelType);
     }
   }
-
-  /// Add formal parameters defined in the [kernelFunction] to the [element].
-  void _addFormalParameters(
-      FunctionElementImpl element, kernel.FunctionNode kernelFunction) {
-    // Set type parameters.
-    {
-      var astParameters = <TypeParameterElement>[];
-      for (var kernelParameter in kernelFunction.typeParameters) {
-        var astParameter = new TypeParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.type = new TypeParameterTypeImpl(astParameter);
-        // TODO(scheglov) remember mapping to set bounds later
-        astParameters.add(astParameter);
-      }
-      element.typeParameters = astParameters;
-    }
-
-    // Set formal parameters.
-    {
-      var astParameters = <ParameterElement>[];
-
-      // Add positional parameters
-      var kernelPositionalParameters = kernelFunction.positionalParameters;
-      for (var i = 0; i < kernelPositionalParameters.length; i++) {
-        var kernelParameter = kernelPositionalParameters[i];
-        var astParameter = new ParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.parameterKind = i < kernelFunction.requiredParameterCount
-            ? ParameterKind.REQUIRED
-            : ParameterKind.POSITIONAL;
-        astParameters.add(astParameter);
-        declarationToElement[kernelParameter] = astParameter;
-        parameterElementToDeclaration[astParameter] = kernelParameter;
-      }
-
-      // Add named parameters.
-      for (var kernelParameter in kernelFunction.namedParameters) {
-        var astParameter = new ParameterElementImpl(
-            kernelParameter.name, kernelParameter.fileOffset);
-        astParameter.parameterKind = ParameterKind.NAMED;
-        astParameters.add(astParameter);
-        declarationToElement[kernelParameter] = astParameter;
-        parameterElementToDeclaration[astParameter] = kernelParameter;
-      }
-
-      element.parameters = astParameters;
-    }
-  }
 }
 
 /// [Iterator] like object that provides [CollectedResolution]s.
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 265a55c..457bb8e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -2424,6 +2424,8 @@
   @override
   LineInfo lineInfo;
 
+  Map<int, AstNode> localDeclarations;
+
   /**
    * Initialize a newly created compilation unit to have the given directives
    * and declarations. The [scriptTag] can be `null` if there is no script tag
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index e0101c1..8fde0c3 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -1182,6 +1182,7 @@
     _visitChildren(holder, node);
 
     FunctionElementImpl element = new FunctionElementImpl.forNode(node.name);
+    element.type = new FunctionTypeImpl(element);
     _setCodeRange(element, node);
     setElementDocumentationComment(element, node);
     element.metadata = _createElementAnnotations(node.metadata);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 353da0b..b34a4c1 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -62,6 +62,7 @@
   ScriptTag scriptTag;
   final List<Directive> directives = <Directive>[];
   final List<CompilationUnitMember> declarations = <CompilationUnitMember>[];
+  final localDeclarations = <int, AstNode>{};
 
   @override
   final Uri uri;
@@ -626,7 +627,15 @@
     Expression initializer = pop();
     SimpleIdentifier identifier = pop();
     // TODO(ahe): Don't push initializers, instead install them.
-    push(ast.variableDeclaration(identifier, assignmentOperator, initializer));
+    push(_makeVariableDeclaration(identifier, assignmentOperator, initializer));
+  }
+
+  VariableDeclaration _makeVariableDeclaration(
+      SimpleIdentifier name, Token equals, Expression initializer) {
+    var variableDeclaration =
+        ast.variableDeclaration(name, equals, initializer);
+    localDeclarations[name.offset] = variableDeclaration;
+    return variableDeclaration;
   }
 
   @override
@@ -668,7 +677,7 @@
     if (node is VariableDeclaration) {
       variable = node;
     } else if (node is SimpleIdentifier) {
-      variable = ast.variableDeclaration(node, null, null);
+      variable = _makeVariableDeclaration(node, null, null);
     } else {
       unhandled("${node.runtimeType}", "identifier", nameToken.charOffset, uri);
     }
@@ -1206,6 +1215,7 @@
       parameter = ast.defaultFormalParameter(node, ParameterKind.NAMED,
           defaultValue.separator, defaultValue.value);
     }
+    localDeclarations[nameToken.offset] = parameter;
     push(parameter);
   }
 
@@ -1351,9 +1361,11 @@
       List<FormalParameter> catchParameters = catchParameterList.parameters;
       if (catchParameters.length > 0) {
         exception = catchParameters[0].identifier;
+        localDeclarations[exception.offset] = exception;
       }
       if (catchParameters.length > 1) {
         stackTrace = catchParameters[1].identifier;
+        localDeclarations[stackTrace.offset] = stackTrace;
       }
     }
     push(ast.catchClause(
@@ -2011,7 +2023,7 @@
     debugEvent("NoFieldInitializer");
 
     SimpleIdentifier name = pop();
-    push(ast.variableDeclaration(name, null, null));
+    push(_makeVariableDeclaration(name, null, null));
   }
 
   @override
@@ -2088,7 +2100,7 @@
 
     Expression initializer = pop();
     SimpleIdentifier name = pop();
-    push(ast.variableDeclaration(name, assignment, initializer));
+    push(_makeVariableDeclaration(name, assignment, initializer));
   }
 
   @override
@@ -2122,8 +2134,10 @@
     List<Annotation> metadata = pop(NullValue.Metadata);
     FunctionExpression functionExpression =
         ast.functionExpression(typeParameters, parameters, body);
-    push(ast.functionDeclarationStatement(ast.functionDeclaration(
-        null, metadata, null, returnType, null, name, functionExpression)));
+    var functionDeclaration = ast.functionDeclaration(
+        null, metadata, null, returnType, null, name, functionExpression);
+    localDeclarations[name.offset] = functionDeclaration;
+    push(ast.functionDeclarationStatement(functionDeclaration));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 4d2414f..5aa09cd 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -21,48 +21,18 @@
   final LibraryElement _enclosingLibraryElement;
   final TypeContext _typeContext;
 
-  final List<Element> _declaredElements;
-  int _declaredElementIndex = 0;
-
-  final List<Element> _referencedElements;
-  int _referencedElementIndex = 0;
-
-  final List<kernel.DartType> _types;
-  int _typeIndex = 0;
+  final Map<int, ResolutionData<DartType, Element, Element, PrefixElement>>
+      _data;
 
   /// The current label scope. Each [Block] adds a new one.
   _LabelScope _labelScope = new _LabelScope(null);
 
-  /// Indicates whether we are applying resolution to an annotation.
-  ///
-  /// When this field is `true`, [PropertyInducingElement]s should be replaced
-  /// with corresponding getters.
-  bool _inAnnotation = false;
-
-  ResolutionApplier(this._enclosingLibraryElement, this._typeContext,
-      this._declaredElements, this._referencedElements, this._types);
+  ResolutionApplier(
+      this._enclosingLibraryElement, this._typeContext, this._data);
 
   /// Apply resolution to annotations of the given [node].
   void applyToAnnotations(AnnotatedNode node) {
-    _inAnnotation = true;
     node.metadata.accept(this);
-    _inAnnotation = false;
-  }
-
-  /// Verifies that all types passed to the constructor have been applied.
-  void checkDone() {
-    if (_declaredElementIndex != _declaredElements.length) {
-      throw new StateError('Some declarations were not consumed, starting at '
-          '${_declaredElements[_declaredElementIndex]}');
-    }
-    if (_referencedElementIndex != _referencedElements.length) {
-      throw new StateError('Some references were not consumed, starting at '
-          '${_referencedElements[_referencedElementIndex]}');
-    }
-    if (_typeIndex != _types.length) {
-      throw new StateError(
-          'Some types were not consumed, starting at ${_types[_typeIndex]}');
-    }
   }
 
   @override
@@ -74,24 +44,33 @@
   @override
   void visitAnnotation(Annotation node) {
     SimpleIdentifier constructorName = node.constructorName;
+    SyntacticEntity entity;
+    if (constructorName != null) {
+      entity = constructorName;
+    } else {
+      var name = node.name;
+      if (name is PrefixedIdentifier) {
+        entity = name.identifier;
+      } else {
+        entity = name;
+      }
+    }
+    var data = _get(entity);
 
-    // Peek forward and check if the next element is a PrefixElement.
     SimpleIdentifier topEntity;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
+    if (data.prefixInfo != null) {
       PrefixedIdentifier prefixedIdentifier = node.name;
 
       SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      PrefixElement prefixElement = _getReferenceFor(prefix);
-      _getTypeFor(prefix); // prefix type
-      prefix.staticElement = prefixElement;
+      prefix.staticElement = data.prefixInfo;
 
       topEntity = prefixedIdentifier.identifier;
     } else {
       topEntity = node.name;
     }
 
-    Element element = _getReferenceFor(topEntity);
-    DartType type = _getTypeFor(topEntity);
+    Element element = data.reference;
+    DartType type = data.inferredType;
     node.element = element;
 
     if (element is ConstructorElement) {
@@ -117,12 +96,24 @@
     }
   }
 
+  ResolutionData<DartType, Element, Element, PrefixElement> _get(
+      SyntacticEntity entity,
+      {bool failIfAbsent: true}) {
+    int entityOffset = entity.offset;
+    var data = _data[entityOffset];
+    if (failIfAbsent && data == null) {
+      throw new StateError('No data for $entity at $entityOffset');
+    }
+    return data;
+  }
+
   @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
+    var data = _get(node.asOperator);
     applyToTypeAnnotation(
-        _enclosingLibraryElement, _getTypeFor(node.asOperator), node.type);
-    node.staticType = _getTypeFor(node.asOperator);
+        _enclosingLibraryElement, data.literalType, node.type);
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -131,33 +122,27 @@
     node.rightHandSide.accept(this);
 
     SyntacticEntity entity = _getAssignmentEntity(node.leftHandSide);
-    node.staticElement = _getReferenceFor(entity);
-    node.staticType = _getTypeFor(entity);
+    var data = _get(entity);
+    node.staticElement = data.combiner;
+    node.staticType = data.inferredType;
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
     node.leftOperand.accept(this);
 
+    var data = _get(node.operator);
     TokenType operatorType = node.operator.type;
     if (operatorType != TokenType.QUESTION_QUESTION &&
         operatorType != TokenType.AMPERSAND_AMPERSAND &&
         operatorType != TokenType.BAR_BAR) {
-      node.staticElement = _getReferenceFor(node.operator);
-      _getTypeFor(node.operator); // callee type
-      _getTypeFor(node.operator); // invocation type
-      _getTypeFor(node.operator); // type arguments
+      node.staticElement = data.reference;
     }
 
     // Record the return type of the expression.
-    node.staticType = _getTypeFor(node.operator);
+    node.staticType = data.inferredType;
 
     node.rightOperand.accept(this);
-
-    // Skip the synthetic Not for `!=`.
-    if (operatorType == TokenType.BANG_EQ) {
-      _getTypeFor(null, synthetic: true);
-    }
   }
 
   @override
@@ -184,7 +169,7 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    DartType guardType = _getTypeFor(node.onKeyword ?? node.catchKeyword);
+    DartType guardType = _get(node.onKeyword ?? node.catchKeyword).literalType;
     if (node.exceptionType != null) {
       applyToTypeAnnotation(
           _enclosingLibraryElement, guardType, node.exceptionType);
@@ -192,8 +177,8 @@
 
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
-      LocalVariableElementImpl element = _getDeclarationFor(exception);
-      DartType type = _getTypeFor(exception);
+      LocalVariableElementImpl element = exception.staticElement;
+      DartType type = _get(exception).literalType;
       element.type = type;
       exception.staticElement = element;
       exception.staticType = type;
@@ -201,8 +186,8 @@
 
     SimpleIdentifier stackTrace = node.stackTraceParameter;
     if (stackTrace != null) {
-      LocalVariableElementImpl element = _getDeclarationFor(stackTrace);
-      DartType type = _getTypeFor(stackTrace);
+      LocalVariableElementImpl element = stackTrace.staticElement;
+      DartType type = _get(stackTrace).literalType;
       element.type = type;
       stackTrace.staticElement = element;
       stackTrace.staticType = type;
@@ -216,12 +201,14 @@
     node.condition.accept(this);
     node.thenExpression.accept(this);
     node.elseExpression.accept(this);
-    node.staticType = _getTypeFor(node.question);
+    node.staticType = _get(node.question).inferredType;
   }
 
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    FieldElement fieldElement = _getReferenceFor(node.equals);
+    var element = _get(node.equals).reference;
+    FieldElement fieldElement =
+        element is PropertyAccessorElement ? element.variable : null;
     node.fieldName.staticElement = fieldElement;
     node.fieldName.staticType = fieldElement.type;
 
@@ -240,7 +227,7 @@
   @override
   void visitExpression(Expression node) {
     visitNode(node);
-    node.staticType = _getTypeFor(node);
+    node.staticType = _get(node).inferredType;
   }
 
   @override
@@ -249,7 +236,7 @@
     if (loopVariable != null) {
       SimpleIdentifier identifier = loopVariable.identifier;
 
-      DartType type = _getTypeFor(identifier);
+      DartType type = _get(identifier).inferredType;
       identifier.staticType = type;
 
       if (loopVariable.type != null) {
@@ -257,15 +244,14 @@
             _enclosingLibraryElement, type, loopVariable.type);
       }
 
-      VariableElementImpl element = _getDeclarationFor(identifier);
+      VariableElementImpl element = identifier.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
         identifier.staticElement = element;
         element.type = type;
       }
     } else {
-      node.identifier.staticElement = _getReferenceFor(node.identifier);
-      node.identifier.staticType = _getTypeFor(node.identifier);
+      node.identifier.accept(this);
     }
     node.iterable.accept(this);
     node.body.accept(this);
@@ -275,10 +261,7 @@
   void visitFormalParameterList(FormalParameterList parameterList) {
     for (var parameter in parameterList.parameters) {
       if (parameter is DefaultFormalParameter) {
-        if (parameter.defaultValue == null) {
-          // Consume the Null type, for the implicit default value.
-          _getTypeFor(null, synthetic: true);
-        } else {
+        if (parameter.defaultValue != null) {
           parameter.defaultValue.accept(this);
         }
       }
@@ -293,13 +276,11 @@
     // Apply resolution to default values.
     parameterList.accept(this);
 
-    FunctionElementImpl element = _getDeclarationFor(node);
+    FunctionElementImpl element = node.element;
     _typeContext.enterLocalFunction(element);
 
-    if (node.returnType != null && element != null) {
-      applyToTypeAnnotation(
-          _enclosingLibraryElement, element.returnType, node.returnType);
-    }
+    functionExpression.body?.accept(this);
+    _storeFunctionType(_get(node).inferredType, element);
 
     // Associate the elements with the nodes.
     if (element != null) {
@@ -319,11 +300,12 @@
         }
       }
 
+      applyToTypeAnnotation(
+          _enclosingLibraryElement, element.returnType, node.returnType);
       applyParameters(
           _enclosingLibraryElement, element.parameters, parameterList);
     }
 
-    functionExpression.body?.accept(this);
     _typeContext.exitLocalFunction(element);
   }
 
@@ -331,9 +313,15 @@
   void visitFunctionExpression(FunctionExpression node) {
     FormalParameterList parameterList = node.parameters;
 
-    FunctionElementImpl element = _getDeclarationFor(node);
+    FunctionElementImpl element = node.element;
     _typeContext.enterLocalFunction(element);
 
+    // Apply resolution to default values.
+    parameterList.accept(this);
+
+    node.body.accept(this);
+    _storeFunctionType(_get(node).inferredType, element);
+
     // Associate the elements with the nodes.
     if (element != null) {
       node.element = element;
@@ -342,28 +330,45 @@
           _enclosingLibraryElement, element.parameters, parameterList);
     }
 
-    // Apply resolution to default values.
-    parameterList.accept(this);
-
-    node.body.accept(this);
     _typeContext.exitLocalFunction(element);
   }
 
+  void _storeFunctionType(DartType type, FunctionElementImpl element) {
+    if (type is FunctionType && element != null) {
+      element.returnType = type.returnType;
+      int normalParameterIndex = 0;
+      int optionalParameterIndex = 0;
+      for (ParameterElementImpl parameter in element.parameters) {
+        if (parameter.isNamed) {
+          parameter.type = type.namedParameterTypes[parameter.name];
+        } else if (normalParameterIndex < type.normalParameterTypes.length) {
+          parameter.type = type.normalParameterTypes[normalParameterIndex++];
+        } else if (optionalParameterIndex <
+            type.optionalParameterTypes.length) {
+          parameter.type =
+              type.optionalParameterTypes[optionalParameterIndex++];
+        }
+      }
+    }
+  }
+
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function.accept(this);
 
-    DartType invokeType = _getTypeFor(node.argumentList);
+    var data = _get(node.argumentList);
+    DartType invokeType = data.invokeType;
     node.staticInvokeType = invokeType;
 
-    DartType typeArgumentsDartType = _getTypeFor(node.argumentList);
-    if (node.typeArguments != null &&
-        typeArgumentsDartType is TypeArgumentsDartType) {
-      _applyTypeArgumentsToList(_enclosingLibraryElement, typeArgumentsDartType,
+    List<DartType> typeArguments = data.argumentTypes;
+    if (node.typeArguments != null && typeArguments is TypeArgumentsDartType) {
+      _applyTypeArgumentsToList(
+          _enclosingLibraryElement,
+          new TypeArgumentsDartType(typeArguments),
           node.typeArguments.arguments);
     }
 
-    DartType resultType = _getTypeFor(node.argumentList);
+    DartType resultType = data.inferredType;
     node.staticType = resultType;
 
     node.argumentList.accept(this);
@@ -374,7 +379,8 @@
     node.target.accept(this);
 
     DartType targetType = node.target.staticType;
-    MethodElement element = _getReferenceFor(node.leftBracket);
+    var data = _get(node.leftBracket);
+    MethodElement element = data.reference;
 
     // Convert the raw element into a member.
     if (targetType is InterfaceType) {
@@ -382,11 +388,7 @@
       node.staticElement = member;
     }
 
-    _getTypeFor(node.leftBracket); // callee type
-    _getTypeFor(node.leftBracket); // invoke type
-    _getTypeFor(node.leftBracket); // type arguments
-
-    node.staticType = _getTypeFor(node.leftBracket);
+    node.staticType = data.inferredType;
 
     node.index.accept(this);
   }
@@ -394,19 +396,12 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
+    var data = _get(constructorName);
 
-    // Peek forward and check if the next element is a PrefixElement.
-    PrefixElement prefix;
-    AstNode constructorEntity = constructorName;
-    if (_referencedElements[_referencedElementIndex] is PrefixElement) {
-      PrefixedIdentifier typeIdentifier = constructorName.type.name;
-      prefix = _getReferenceFor(typeIdentifier.prefix);
-      _getTypeFor(typeIdentifier.prefix); // prefix type
-      constructorEntity = typeIdentifier.identifier;
-    }
+    PrefixElement prefix = data.prefixInfo;
 
-    ConstructorElement constructor = _getReferenceFor(constructorEntity);
-    DartType type = _getTypeFor(constructorEntity);
+    ConstructorElement constructor = data.reference;
+    DartType type = data.inferredType;
 
     applyConstructorElement(
         _enclosingLibraryElement, prefix, constructor, type, constructorName);
@@ -422,9 +417,10 @@
   @override
   void visitIsExpression(IsExpression node) {
     node.expression.accept(this);
+    var data = _get(node.isOperator);
     applyToTypeAnnotation(
-        _enclosingLibraryElement, _getTypeFor(node.isOperator), node.type);
-    node.staticType = _getTypeFor(node.isOperator);
+        _enclosingLibraryElement, data.literalType, node.type);
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -439,7 +435,7 @@
   @override
   void visitListLiteral(ListLiteral node) {
     node.elements.accept(this);
-    DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
+    DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
     if (node.typeArguments != null) {
       _applyTypeArgumentsToList(
@@ -450,7 +446,7 @@
   @override
   void visitMapLiteral(MapLiteral node) {
     node.entries.accept(this);
-    DartType type = _getTypeFor(node.constKeyword ?? node.leftBracket);
+    DartType type = _get(node.constKeyword ?? node.leftBracket).inferredType;
     node.staticType = type;
     if (node.typeArguments != null) {
       _applyTypeArgumentsToList(
@@ -464,11 +460,19 @@
 
     ArgumentList argumentList = node.argumentList;
 
-    Element invokeElement = _getReferenceFor(node.methodName);
-    _getTypeFor(node.methodName); // static element type
-    DartType invokeType = _getTypeFor(argumentList);
-    DartType typeArgumentsDartType = _getTypeFor(argumentList);
-    DartType resultType = _getTypeFor(argumentList);
+    var data = _get(argumentList);
+    Element invokeElement;
+    if (data.isImplicitCall) {
+      if (node.methodName != null) {
+        node.methodName.accept(this);
+        invokeElement = node.methodName.staticElement;
+      }
+    } else {
+      invokeElement = data.reference;
+    }
+    DartType invokeType = data.invokeType;
+    List<DartType> typeArguments = data.argumentTypes;
+    DartType resultType = data.inferredType;
 
     if (invokeElement is PropertyInducingElement) {
       PropertyInducingElement property = invokeElement;
@@ -480,16 +484,19 @@
 
     if (node.methodName.name == 'call' && invokeElement == null) {
       // Don't resolve explicit call() invocation of function types.
+    } else if (_get(node.methodName, failIfAbsent: false) != null) {
+      node.methodName.accept(this);
     } else {
       node.methodName.staticElement = invokeElement;
       node.methodName.staticType = invokeType;
     }
 
     if (invokeType is FunctionType) {
-      if (node.typeArguments != null &&
-          typeArgumentsDartType is TypeArgumentsDartType) {
-        _applyTypeArgumentsToList(_enclosingLibraryElement,
-            typeArgumentsDartType, node.typeArguments.arguments);
+      if (node.typeArguments != null && typeArguments != null) {
+        _applyTypeArgumentsToList(
+            _enclosingLibraryElement,
+            new TypeArgumentsDartType(typeArguments),
+            node.typeArguments.arguments);
       }
     }
 
@@ -523,8 +530,9 @@
   void visitPostfixExpression(PostfixExpression node) {
     node.operand.accept(this);
     SyntacticEntity entity = _getAssignmentEntity(node.operand);
-    node.staticElement = _getReferenceFor(entity);
-    node.staticType = _getTypeFor(entity);
+    var data = _get(entity);
+    node.staticElement = data.combiner;
+    node.staticType = data.inferredType;
   }
 
   @override
@@ -542,20 +550,19 @@
       // ++v;
       // This is an assignment, it is associated with the operand.
       SyntacticEntity entity = _getAssignmentEntity(node.operand);
-      node.staticElement = _getReferenceFor(entity);
-      node.staticType = _getTypeFor(entity);
+      var data = _get(entity);
+      node.staticElement = data.combiner;
+      node.staticType = data.inferredType;
     } else if (tokenType == TokenType.BANG) {
       // !boolExpression;
-      node.staticType = _getTypeFor(node);
+      node.staticType = _get(node).inferredType;
     } else {
       // ~v;
       // This is a method invocation, it is associated with the operator.
       SyntacticEntity entity = node.operator;
-      node.staticElement = _getReferenceFor(entity);
-      _getTypeFor(entity); // The static function type of the operator.
-      _getTypeFor(entity); // The invoke function type of the operator.
-      _getTypeFor(entity); // The type arguments (empty).
-      node.staticType = _getTypeFor(entity);
+      var data = _get(entity);
+      node.staticElement = data.reference;
+      node.staticType = data.inferredType;
     }
   }
 
@@ -571,7 +578,7 @@
       RedirectingConstructorInvocation node) {
     SimpleIdentifier constructorName = node.constructorName;
 
-    ConstructorElement element = _getReferenceFor(constructorName ?? node);
+    ConstructorElement element = _get(constructorName ?? node).reference;
     node.staticElement = element;
     constructorName?.staticElement = element;
 
@@ -582,18 +589,24 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    node.staticElement = _getReferenceFor(node);
-    super.visitSimpleIdentifier(node);
+    var data = _get(node);
+    if (data.prefixInfo != null) {
+      node.staticElement = data.prefixInfo;
+    } else if (data.declaration != null) {
+      node.staticElement = data.declaration;
+    } else if (data.reference != null) {
+      node.staticElement = data.reference;
+    } else {
+      node.staticElement = null;
+    }
+    node.staticType =
+        data.isWriteReference ? data.writeContext : data.inferredType;
   }
 
   @override
   void visitStringInterpolation(StringInterpolation node) {
     for (var element in node.elements) {
-      if (element is InterpolationString) {
-        if (element.value.isNotEmpty) {
-          _getTypeFor(element);
-        }
-      } else if (element is InterpolationExpression) {
+      if (element is InterpolationExpression) {
         element.expression.accept(this);
       }
     }
@@ -630,11 +643,6 @@
   }
 
   @override
-  void visitTypeAnnotation(TypeAnnotation node) {
-    applyToTypeAnnotation(_enclosingLibraryElement, _getTypeFor(node), node);
-  }
-
-  @override
   void visitVariableDeclaration(VariableDeclaration node) {
     AstNode parent = node.parent;
     if (parent is VariableDeclarationList &&
@@ -642,10 +650,10 @@
             parent.parent is FieldDeclaration)) {
       // Don't visit the name; resolution for it will come from the outline.
     } else {
-      DartType type = _getTypeFor(node.name);
+      DartType type = _get(node.name).inferredType;
       node.name.staticType = type;
 
-      VariableElementImpl element = _getDeclarationFor(node.name);
+      VariableElementImpl element = node.name.staticElement;
       if (element != null) {
         _typeContext.encloseVariable(element);
         node.name.staticElement = element;
@@ -703,33 +711,6 @@
     }
   }
 
-  /// Return the element associated with the declaration represented by the
-  /// given [node].
-  Element _getDeclarationFor(AstNode node) {
-    return _declaredElements[_declaredElementIndex++];
-  }
-
-  /// Return the element associated with the reference represented by the
-  /// given [entity].
-  Element _getReferenceFor(SyntacticEntity entity) {
-    Element element = _referencedElements[_referencedElementIndex++];
-    if (_inAnnotation && element is PropertyInducingElement) {
-      return element.getter;
-    }
-    return element;
-  }
-
-  /// Return the type associated with the given [entity].
-  ///
-  /// If [synthetic] is `true`, the [entity] must be `null` and the type is
-  /// an implicit type, e.g. the type of the absent default values of an
-  /// optional parameter (i.e. [Null]).
-  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
-    assert(!synthetic || entity == null);
-    kernel.DartType kernelType = _types[_typeIndex++];
-    return _typeContext.translateType(kernelType);
-  }
-
   /// Apply resolution to named arguments of the [argumentList].
   void _resolveNamedArguments(
       ArgumentList argumentList, List<ParameterElement> parameters) {
@@ -973,107 +954,6 @@
   DartType translateType(kernel.DartType kernelType);
 }
 
-/// Visitor that applies resolution data from the front end (obtained via
-/// [ResolutionStorer]) to an analyzer AST, and also checks file offsets to
-/// verify that the types are applied to the correct subexpressions.
-class ValidatingResolutionApplier extends ResolutionApplier {
-  /// The offset that is used when the actual offset is not know.
-  /// The applier should not validate this offset.
-  static const UNKNOWN_OFFSET = -2;
-
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
-  final List<int> _declaredElementOffsets;
-  final List<int> _referencedElementOffsets;
-  final List<int> _typeOffsets;
-
-  ValidatingResolutionApplier(
-      LibraryElement enclosingLibraryElement,
-      TypeContext typeContext,
-      List<Element> declaredElements,
-      List<Element> referencedElements,
-      List<kernel.DartType> types,
-      this._declaredElementOffsets,
-      this._referencedElementOffsets,
-      this._typeOffsets)
-      : super(enclosingLibraryElement, typeContext, declaredElements,
-            referencedElements, types);
-
-  @override
-  void checkDone() {
-    if (_declaredElementIndex != _declaredElements.length) {
-      throw new StateError('Some declarations were not consumed, starting at '
-          'offset ${_declaredElementOffsets[_declaredElementIndex]}');
-    }
-    if (_referencedElementIndex != _referencedElements.length) {
-      throw new StateError('Some references were not consumed, starting at '
-          'offset ${_referencedElementOffsets[_referencedElementIndex]}');
-    }
-    if (_typeIndex != _types.length) {
-      throw new StateError('Some types were not consumed, starting at offset '
-          '${_typeOffsets[_typeIndex]}');
-    }
-  }
-
-  @override
-  Element _getDeclarationFor(AstNode node) {
-    int nodeOffset = node.offset;
-    if (_debug) {
-      print('Getting declaration element for $node at $nodeOffset');
-    }
-    if (_declaredElementIndex >= _declaredElements.length) {
-      throw new StateError(
-          'No declaration information for $node at $nodeOffset');
-    }
-    int elementOffset = _declaredElementOffsets[_declaredElementIndex];
-    if (nodeOffset != elementOffset) {
-      throw new StateError(
-          'Expected element declaration for analyzer offset $nodeOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-    return super._getDeclarationFor(node);
-  }
-
-  @override
-  Element _getReferenceFor(SyntacticEntity entity) {
-    int entityOffset = entity.offset;
-    if (_debug) {
-      print('Getting reference element for $entity at $entityOffset');
-    }
-    if (_referencedElementIndex >= _referencedElements.length) {
-      throw new StateError(
-          'No reference information for $entity at $entityOffset');
-    }
-    int elementOffset = _referencedElementOffsets[_referencedElementIndex];
-    if (elementOffset != UNKNOWN_OFFSET && entityOffset != elementOffset) {
-      throw new StateError(
-          'Expected element reference for analyzer offset $entityOffset; '
-          'got one for kernel offset $elementOffset');
-    }
-    return super._getReferenceFor(entity);
-  }
-
-  @override
-  DartType _getTypeFor(SyntacticEntity entity, {bool synthetic: false}) {
-    var entityOffset = synthetic ? -1 : entity.offset;
-    if (_debug) {
-      print('Getting type for $entity at $entityOffset');
-    }
-    if (_typeIndex >= _types.length) {
-      throw new StateError('No type information for $entity at $entityOffset');
-    }
-    int typeOffset = _typeOffsets[_typeIndex];
-    if (typeOffset != UNKNOWN_OFFSET &&
-        entity != null &&
-        entityOffset != typeOffset) {
-      throw new StateError('Expected a type for $entity at $entityOffset; '
-          'got one for kernel offset $typeOffset');
-    }
-    return super._getTypeFor(entity);
-  }
-}
-
 /// The hierarchical scope for labels.
 class _LabelScope {
   final _LabelScope parent;
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 454fc62..ebdd2cc 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -3,679 +3,421 @@
 // 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/kernel_shadow_ast.dart';
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
-/// The reference to the import prefix with the [name].
-class ImportPrefixNode implements TreeNode {
-  final String name;
+class ResolutionData<Type, Declaration, Reference, PrefixInfo> {
+  final List<Type> argumentTypes;
+  final Reference combiner;
+  final Declaration declaration;
+  final Type inferredType;
+  final Type invokeType;
+  final bool isExplicitCall;
+  final bool isImplicitCall;
+  final bool isWriteReference;
+  final Type literalType;
+  final PrefixInfo prefixInfo;
+  final Reference reference;
+  final Type writeContext;
 
-  ImportPrefixNode(this.name);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(prefix-$name)';
-  }
-}
-
-/// The type of [DartType] node that is used as a marker for using `null`
-/// as the [FunctionType] for index assignment.
-class IndexAssignNullFunctionType implements DartType {
-  const IndexAssignNullFunctionType();
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return 'IndexAssignNullFunctionType';
-  }
-}
-
-/// Type inference listener that records inferred types and file offsets for
-/// later use by [ValidatingResolutionApplier].
-class InstrumentedResolutionStorer extends ResolutionStorer {
-  /// Indicates whether debug messages should be printed.
-  static const bool _debug = false;
-
-  final List<int> _declarationOffsets;
-  final List<int> _referenceOffsets;
-  final List<int> _typeOffsets;
-
-  final List<int> _deferredReferenceOffsets = [];
-  final List<int> _deferredTypeOffsets = [];
-
-  InstrumentedResolutionStorer(
-      List<TreeNode> declarations,
-      List<Node> references,
-      List<DartType> types,
-      this._declarationOffsets,
-      this._referenceOffsets,
-      this._typeOffsets)
-      : super(declarations, references, types);
-
-  @override
-  void _deferReference(int offset) {
-    super._deferReference(offset);
-    if (_debug) {
-      _deferredReferenceOffsets.add(offset);
-    }
-  }
-
-  @override
-  void _deferType(int offset) {
-    super._deferType(offset);
-    if (_debug) {
-      _deferredTypeOffsets.add(offset);
-    }
-  }
-
-  @override
-  void _recordDeclaration(TreeNode declaration, int offset) {
-    if (_debug) {
-      print('Recording declaration of $declaration for offset $offset');
-    }
-    _declarationOffsets.add(offset);
-    super._recordDeclaration(declaration, offset);
-  }
-
-  @override
-  int _recordReference(Node target, int offset) {
-    if (_debug) {
-      print('Recording reference to $target for offset $offset');
-    }
-    _referenceOffsets.add(offset);
-    return super._recordReference(target, offset);
-  }
-
-  @override
-  int _recordType(DartType type, int offset) {
-    if (_debug) {
-      print('Recording type $type for offset $offset');
-    }
-    assert(_types.length == _typeOffsets.length);
-    _typeOffsets.add(offset);
-    return super._recordType(type, offset);
-  }
-
-  @override
-  void _replaceReference(Node reference) {
-    if (_debug) {
-      int offset = _deferredReferenceOffsets.removeLast();
-      print('Replacing reference $reference for offset $offset');
-    }
-    super._replaceReference(reference);
-  }
-
-  @override
-  void _replaceType(DartType type, [int newOffset = -1]) {
-    if (newOffset != -1) {
-      _typeOffsets[_deferredTypeSlots.last] = newOffset;
-    }
-    if (_debug) {
-      if (newOffset != -1) {
-        _deferredTypeOffsets.removeLast();
-        _deferredTypeOffsets.add(newOffset);
-      }
-      int offset = _deferredTypeOffsets.removeLast();
-      print('Replacing type $type for offset $offset');
-    }
-    super._replaceType(type, newOffset);
-  }
-}
-
-/// A reference to the getter represented by the [member].
-/// The [member] might be either a getter itself, or a field.
-class MemberGetterNode implements TreeNode {
-  /// The member representing the getter, or `null` if the getter could not be
-  /// resolved.
-  final Member member;
-
-  MemberGetterNode(this.member);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '$member.getter';
-  }
-}
-
-/// A reference to the setter represented by the [member].
-/// The [member] might be either a setter itself, or a field.
-class MemberSetterNode implements TreeNode {
-  /// The member representing the setter, or `null` if the setter could not be
-  /// resolved.
-  final Member member;
-
-  MemberSetterNode(this.member);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '$member.setter';
-  }
-}
-
-/// The type of [TreeNode] node that is used as a marker for `null`.
-class NullNode implements TreeNode {
-  final String kind;
-
-  const NullNode(this.kind);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(null-$kind)';
-  }
-}
-
-/// The type of [DartType] node that is used as a marker for `null`.
-///
-/// It is used for import prefix identifiers, which are resolved to elements,
-/// but don't have any types.
-class NullType implements DartType {
-  const NullType();
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  String toString() {
-    return '(null-type)';
-  }
+  ResolutionData(
+      {this.argumentTypes,
+      this.combiner,
+      this.declaration,
+      this.inferredType,
+      this.invokeType,
+      this.isExplicitCall = false,
+      this.isImplicitCall = false,
+      this.isWriteReference = false,
+      this.literalType,
+      this.prefixInfo,
+      this.reference,
+      this.writeContext});
 }
 
 /// Type inference listener that records inferred types for later use by
 /// [ResolutionApplier].
-class ResolutionStorer {
-  /// The offset that is used when the actual offset is not know.
-  /// The consumer of information should not validate this offset.
-  static const UNKNOWN_OFFSET = -2;
+class ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
+    extends TypeInferenceListener<Location, Declaration, Reference,
+        PrefixInfo> {
+  final Map<Location,
+      ResolutionData<DartType, Declaration, Reference, PrefixInfo>> _data;
 
-  final List<TreeNode> _declarations;
-  final List<Node> _references;
-  final List<DartType> _types;
+  final _stack = <Function>[];
 
-  /// Indices into [_references] which need to be filled in later.
-  final _deferredReferenceSlots = <int>[];
+  ResolutionStorer(this._data);
 
-  /// Indices into [_types] which need to be filled in later.
-  final _deferredTypeSlots = <int>[];
-
-  ResolutionStorer(this._declarations, this._references, this._types);
-
-  void asExpressionExit(AsExpression expression, DartType inferredType) {
-    _recordType(expression.type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+  void _store(Location location,
+      {List<DartType> argumentTypes,
+      Reference combiner,
+      Declaration declaration,
+      DartType inferredType,
+      DartType invokeType,
+      bool isExplicitCall = false,
+      bool isImplicitCall = false,
+      bool isWriteReference = false,
+      DartType literalType,
+      PrefixInfo prefixInfo,
+      Reference reference,
+      bool replace = false,
+      DartType writeContext}) {
+    if (!replace && _data.containsKey(location)) {
+      throw new StateError('Data already stored for offset $location');
+    }
+    _data[location] = new ResolutionData(
+        argumentTypes: argumentTypes,
+        combiner: combiner,
+        declaration: declaration,
+        inferredType: inferredType,
+        invokeType: invokeType,
+        isExplicitCall: isExplicitCall,
+        isImplicitCall: isImplicitCall,
+        isWriteReference: isWriteReference,
+        literalType: literalType,
+        prefixInfo: prefixInfo,
+        reference: reference,
+        writeContext: writeContext);
   }
 
-  void cascadeExpressionExit(Let expression, DartType inferredType) {
+  void _unstore(Location location) {
+    _data.remove(location) == null;
+  }
+
+  @override
+  void asExpressionExit(Location location, DartType inferredType) {
+    _store(location, literalType: inferredType, inferredType: inferredType);
+  }
+
+  @override
+  void cascadeExpressionExit(Location location, DartType inferredType) {
     // Overridden so that the type of the expression will not be recorded. We
     // don't need to record the type because the type is always the same as the
     // type of the target, and we don't have the appropriate offset so we can't
     // correctly apply the type even if we recorded it.
   }
 
-  void catchStatementEnter(Catch node) {
-    _recordType(node.guard, node.fileOffset);
+  @override
+  void catchStatementEnter(
+      Location location,
+      DartType guardType,
+      Location exceptionLocation,
+      DartType exceptionType,
+      Location stackTraceLocation,
+      DartType stackTraceType) {
+    _store(location, literalType: guardType);
 
-    VariableDeclaration exception = node.exception;
-    if (exception != null) {
-      _recordDeclaration(exception, exception.fileOffset);
-      _recordType(exception.type, exception.fileOffset);
+    if (exceptionLocation != null) {
+      _store(exceptionLocation, literalType: exceptionType);
     }
 
-    VariableDeclaration stackTrace = node.stackTrace;
-    if (stackTrace != null) {
-      _recordDeclaration(stackTrace, stackTrace.fileOffset);
-      _recordType(stackTrace.type, stackTrace.fileOffset);
+    if (stackTraceLocation != null) {
+      _store(stackTraceLocation, literalType: stackTraceType);
     }
   }
 
-  void constructorInvocationEnter(InvocationExpression expression,
-      String prefixName, DartType typeContext) {
-    _recordImportPrefix(prefixName);
-    _deferReference(expression.fileOffset);
-    _deferType(expression.fileOffset);
+  @override
+  void constructorInvocationEnter(Location location, DartType typeContext) {
+    _push((Reference expressionTarget, DartType inferredType) {
+      // A class reference may have already been stored at this location by
+      // storeClassReference.  We want to replace it with a constructor
+      // reference.
+      _unstore(location);
+      _store(location, inferredType: inferredType, reference: expressionTarget);
+    });
   }
 
+  @override
   void constructorInvocationExit(
-      InvocationExpression expression, DartType inferredType) {
-    _replaceType(inferredType);
-    if (expression is ConstructorInvocation) {
-      _replaceReference(expression.target);
-    } else if (expression is StaticInvocation) {
-      _replaceReference(expression.target);
-    } else {
-      throw new UnimplementedError('${expression.runtimeType}');
-    }
+      Location location, Reference expressionTarget, DartType inferredType) {
+    _pop()(expressionTarget, inferredType);
   }
 
-  void fieldInitializerEnter(FieldInitializer initializer) {
-    _recordReference(initializer.field, initializer.fileOffset);
+  @override
+  void fieldInitializerEnter(Location location, Reference initializerField) {
+    _store(location, reference: initializerField);
   }
 
-  /// Verifies that all deferred work has been completed.
   void finished() {
-    assert(_deferredTypeSlots.isEmpty);
+    assert(_stack.isEmpty);
   }
 
-  void forInStatementEnter(ForInStatement statement,
-      VariableDeclaration variable, Expression write) {
-    if (variable != null) {
-      _deferType(variable.fileOffset);
-      _recordDeclaration(variable, variable.fileOffset);
-    } else {
-      if (write is VariableSet) {
-        _recordReference(write.variable, write.fileOffset);
-        _recordType(write.variable.type, write.fileOffset);
-      } else if (write is PropertySet) {
-        Field field = write.interfaceTarget;
-        _recordReference(new MemberSetterNode(field), write.fileOffset);
-        _recordType(field.type, write.fileOffset);
-      } else if (write is StaticSet) {
-        Field field = write.target;
-        _recordReference(new MemberSetterNode(field), write.fileOffset);
-        _recordType(field.type, write.fileOffset);
+  @override
+  void forInStatementEnter(
+      Location location,
+      Location variableLocation,
+      Location writeLocation,
+      DartType writeType,
+      Declaration writeVariable,
+      Reference writeTarget) {
+    _push((DartType variableType) {
+      if (variableLocation != null) {
+        _store(variableLocation, inferredType: variableType);
       } else {
-        throw new UnimplementedError('(${write.runtimeType}) $write');
+        if (writeVariable != null) {
+          _store(writeLocation,
+              declaration: writeVariable, inferredType: writeType);
+        } else {
+          _store(writeLocation,
+              reference: writeTarget,
+              isWriteReference: true,
+              writeContext: writeType);
+        }
       }
-    }
+    });
   }
 
+  @override
   void forInStatementExit(
-      ForInStatement statement, VariableDeclaration variable) {
-    if (variable != null) {
-      _replaceType(variable.type);
-    }
+      Location location, bool variablePresent, DartType variableType) {
+    _pop()(variableType);
   }
 
-  void functionDeclarationEnter(FunctionDeclaration statement) {
-    _recordDeclaration(statement.variable, statement.fileOffset);
-  }
-
-  void functionExpressionEnter(
-      FunctionExpression expression, DartType typeContext) {
-    _recordDeclaration(expression, expression.fileOffset);
-  }
-
-  void functionExpressionExit(
-      FunctionExpression expression, DartType inferredType) {
-    // We don't need to record the inferred type.
-    // It is already set in the function declaration.
-  }
-
+  @override
   void genericExpressionEnter(
-      String expressionType, Expression expression, DartType typeContext) {}
+      String expressionType, Location location, DartType typeContext) {
+    super.genericExpressionEnter(expressionType, location, typeContext);
+  }
 
+  @override
   void genericExpressionExit(
-      String expressionType, Expression expression, DartType inferredType) {
-    _recordType(inferredType, expression.fileOffset);
+      String expressionType, Location location, DartType inferredType) {
+    _store(location, inferredType: inferredType);
+    super.genericExpressionExit(expressionType, location, inferredType);
   }
 
-  void ifNullBeforeRhs(Expression expression) {
-    _deferType(expression.fileOffset);
+  @override
+  void functionDeclarationExit(Location location, FunctionType inferredType) {
+    _store(location, inferredType: inferredType);
   }
 
-  void ifNullExit(Expression expression, DartType inferredType) {
-    _replaceType(inferredType);
+  @override
+  void nullLiteralExit(
+      Location location, bool isSynthetic, DartType inferredType) {
+    if (isSynthetic) return null;
+    super.nullLiteralExit(location, isSynthetic, inferredType);
   }
 
-  void indexAssignAfterReceiver(Expression write, DartType typeContext) {
-    _deferReference(write.fileOffset);
-    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
-    _recordType(const IndexAssignNullFunctionType(), write.fileOffset);
-    _recordType(new TypeArgumentsDartType(<DartType>[]), write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void indexAssignExit(Location location, Reference writeMember,
+      Reference combiner, DartType inferredType) {
+    _store(location,
+        reference: writeMember, inferredType: inferredType, combiner: combiner);
   }
 
-  void indexAssignExit(Expression expression, Expression write,
-      Member writeMember, Procedure combiner, DartType inferredType) {
-    _replaceReference(writeMember);
-    _replaceType(inferredType);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
-  void isExpressionExit(IsExpression expression, DartType inferredType) {
-    _recordType(expression.type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+  @override
+  void isExpressionExit(
+      Location location, DartType testedType, DartType inferredType) {
+    _store(location, literalType: testedType, inferredType: inferredType);
   }
 
   void isNotExpressionExit(
-      Not expression, DartType type, DartType inferredType) {
-    _recordType(type, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+      Location location, DartType type, DartType inferredType) {
+    _store(location, literalType: type, inferredType: inferredType);
   }
 
-  void logicalExpressionBeforeRhs(LogicalExpression expression) {
-    _deferType(expression.fileOffset);
-  }
-
-  void logicalExpressionExit(
-      LogicalExpression expression, DartType inferredType) {
-    _replaceType(inferredType);
-  }
-
-  void methodInvocationBeforeArgs(Expression expression, bool isImplicitCall) {
-    if (!isImplicitCall) {
-      // When the invocation target is `VariableGet`, we record the target
-      // before arguments. To ensure this order for method invocations, we
-      // first record `null`, and then replace it on exit.
-      _deferReference(expression.fileOffset);
-      _deferType(expression.fileOffset); // callee type
-    }
-    _deferType(expression.fileOffset); // invoke type
-    _deferType(expression.fileOffset); // type arguments
-    _deferType(expression.fileOffset); // result type
-  }
-
+  @override
   void methodInvocationExit(
-      Expression expression,
-      Arguments arguments,
+      Location resultOffset,
+      List<DartType> argumentsTypes,
       bool isImplicitCall,
-      Member interfaceMember,
+      Reference interfaceMember,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    int resultOffset = arguments.fileOffset != -1
-        ? arguments.fileOffset
-        : expression.fileOffset;
-    _replaceType(inferredType, resultOffset);
-    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
-
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType, resultOffset);
 
-    if (!isImplicitCall) {
-      interfaceMember = _getRealTarget(interfaceMember);
-      _replaceReference(interfaceMember);
-      _replaceType(const NullType()); // callee type
-    }
+    _store(resultOffset,
+        inferredType: inferredType,
+        argumentTypes: argumentsTypes,
+        invokeType: invokeType,
+        isImplicitCall: isImplicitCall,
+        reference: interfaceMember);
+
+    super.genericExpressionExit("methodInvocation", resultOffset, inferredType);
   }
 
+  @override
   void methodInvocationExitCall(
-      Expression expression,
-      Arguments arguments,
+      Location resultOffset,
+      List<DartType> argumentsTypes,
       bool isImplicitCall,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    int resultOffset = arguments.fileOffset != -1
-        ? arguments.fileOffset
-        : expression.fileOffset;
-    _replaceType(inferredType, resultOffset);
-    _replaceType(new TypeArgumentsDartType(arguments.types), resultOffset);
-
     FunctionType invokeType = substitution == null
         ? calleeType
         : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType, resultOffset);
 
-    if (!isImplicitCall) {
-      _replaceReference(const NullNode('explicit-call'));
-      _replaceType(const NullType()); // callee type
-    }
+    _store(resultOffset,
+        inferredType: inferredType,
+        argumentTypes: argumentsTypes,
+        invokeType: invokeType,
+        isImplicitCall: isImplicitCall);
+
+    super.genericExpressionExit("methodInvocation", resultOffset, inferredType);
   }
 
-  void propertyAssignEnter(
-      Expression expression, Expression write, DartType typeContext) {
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void propertyAssignExit(Location location, Reference writeMember,
+      DartType writeContext, Reference combiner, DartType inferredType) {
+    _store(location,
+        isWriteReference: true,
+        reference: writeMember,
+        writeContext: writeContext,
+        combiner: combiner,
+        inferredType: inferredType);
   }
 
-  void propertyAssignExit(
-      Expression expression,
-      Expression write,
-      Member writeMember,
-      DartType writeContext,
-      Procedure combiner,
-      DartType inferredType) {
-    writeMember = _getRealTarget(writeMember);
-    _replaceReference(new MemberSetterNode(writeMember));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
+  @override
   void propertyGetExit(
-      Expression expression, Member member, DartType inferredType) {
-    _recordReference(new MemberGetterNode(member), expression.fileOffset);
+      Location location, Reference member, DartType inferredType) {
+    _store(location, reference: member, inferredType: inferredType);
   }
 
-  void propertyGetExitCall(Expression expression, DartType inferredType) {
-    _recordReference(const NullNode('explicit-call'), expression.fileOffset);
-    _recordType(const NullType(), expression.fileOffset);
+  @override
+  void propertyGetExitCall(Location location, DartType inferredType) {
+    _store(location, isExplicitCall: true);
   }
 
-  void redirectingInitializerEnter(RedirectingInitializer initializer) {
-    _recordReference(initializer.target, initializer.fileOffset);
+  @override
+  void redirectingInitializerEnter(
+      Location location, Reference initializerTarget) {
+    _store(location, reference: initializerTarget);
   }
 
-  void staticAssignEnter(
-      Expression expression,
-      String prefixName,
-      int targetOffset,
-      Class targetClass,
-      Expression write,
-      DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
-
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void staticAssignEnter(Location location, DartType typeContext) {
+    _push((Reference writeMember, DartType writeContext, Reference combiner,
+        DartType inferredType) {
+      _store(location,
+          reference: writeMember,
+          isWriteReference: true,
+          writeContext: writeContext,
+          combiner: combiner,
+          inferredType: inferredType);
+    });
   }
 
-  void staticAssignExit(
-      Expression expression,
-      Expression write,
-      Member writeMember,
-      DartType writeContext,
-      Procedure combiner,
-      DartType inferredType) {
-    _replaceReference(new MemberSetterNode(writeMember));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
+  @override
+  void staticAssignExit(Location location, Reference writeMember,
+      DartType writeContext, Reference combiner, DartType inferredType) {
+    _pop()(writeMember, writeContext, combiner, inferredType);
   }
 
-  void staticGetEnter(StaticGet expression, String prefixName, int targetOffset,
-      Class targetClass, DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
+  @override
+  void staticGetEnter(Location location, DartType typeContext) {
+    _push(
+        (Location location, Reference expressionTarget, DartType inferredType) {
+      _store(location, reference: expressionTarget, inferredType: inferredType);
+    });
   }
 
-  void staticGetExit(StaticGet expression, DartType inferredType) {
-    _recordReference(
-        new MemberGetterNode(expression.target), expression.fileOffset);
+  @override
+  void staticGetExit(
+      Location location, Reference expressionTarget, DartType inferredType) {
+    _pop()(location, expressionTarget, inferredType);
   }
 
-  void staticInvocationEnter(StaticInvocation expression, String prefixName,
-      int targetOffset, Class targetClass, DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
-    // If the static target is explicit (and is a class), record it.
-    if (targetClass != null) {
-      _recordReference(targetClass, targetOffset);
-      _recordType(targetClass.rawType, targetOffset);
-    }
-    // When the invocation target is `VariableGet`, we record the target
-    // before arguments. To ensure this order for method invocations, we
-    // first record `null`, and then replace it on exit.
-    _deferReference(expression.fileOffset);
-    // We are visiting a static invocation like: f(args), and we haven't visited
-    // args yet.
-    //
-    // The analyzer AST will expect a type for f at this point.  (It can't wait
-    // until later, because for all it knows, f is a method on `this`, and
-    // methods need a type for f at this point--see comments in
-    // [methodInvocationBeforeArgs]).  But the type isn't known yet (because it
-    // may depend on type inference based on arguments).
-    //
-    // So we add a `null` to our list of types; we'll update it with the actual
-    // type later.
-    _deferType(expression.fileOffset); // callee type
-    _deferType(expression.arguments.fileOffset); // invoke type
-    _deferType(expression.arguments.fileOffset); // type arguments
-    _deferType(expression.arguments.fileOffset); // result type
+  @override
+  void staticInvocationEnter(Location location,
+      Location expressionArgumentsLocation, DartType typeContext) {
+    _push((Reference expressionTarget,
+        List<DartType> expressionArgumentsTypes,
+        FunctionType calleeType,
+        Substitution substitution,
+        DartType inferredType) {
+      FunctionType invokeType = substitution == null
+          ? calleeType
+          : substitution.substituteType(calleeType.withoutTypeParameters);
+      _store(expressionArgumentsLocation,
+          invokeType: invokeType,
+          argumentTypes: expressionArgumentsTypes,
+          reference: expressionTarget,
+          inferredType: inferredType);
+    });
   }
 
+  @override
   void staticInvocationExit(
-      StaticInvocation expression,
+      Location location,
+      Reference expressionTarget,
+      List<DartType> expressionArgumentsTypes,
       FunctionType calleeType,
       Substitution substitution,
       DartType inferredType) {
-    _replaceType(inferredType);
-    _replaceReference(expression.target);
-    _replaceType(new TypeArgumentsDartType(expression.arguments.types));
-    FunctionType invokeType = substitution == null
-        ? calleeType
-        : substitution.substituteType(calleeType.withoutTypeParameters);
-    _replaceType(invokeType);
-    _replaceType(const NullType()); // callee type
+    _pop()(expressionTarget, expressionArgumentsTypes, calleeType, substitution,
+        inferredType);
   }
 
-  void stringConcatenationExit(
-      StringConcatenation expression, DartType inferredType) {
+  @override
+  void stringConcatenationExit(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`.
   }
 
-  void thisExpressionExit(ThisExpression expression, DartType inferredType) {}
+  @override
+  void thisExpressionExit(Location location, DartType inferredType) {}
 
-  void typeLiteralEnter(@override TypeLiteral expression, String prefixName,
-      DartType typeContext) {
-    // if there was an import prefix, record it.
-    _recordImportPrefix(prefixName);
+  @override
+  void typeLiteralEnter(Location location, DartType typeContext) {
+    _push((Reference expressionType, DartType inferredType) {
+      _store(location, reference: expressionType, inferredType: inferredType);
+    });
   }
 
-  void typeLiteralExit(TypeLiteral expression, DartType inferredType) {
-    _recordReference(expression.type, expression.fileOffset);
+  void typeLiteralExit(
+      Location location, Reference expressionType, DartType inferredType) {
+    _pop()(expressionType, inferredType);
   }
 
-  void variableAssignEnter(
-      Expression expression, DartType typeContext, Expression write) {
-    _deferReference(write.fileOffset);
-    _deferType(write.fileOffset);
+  @override
+  void variableAssignExit(Location location, DartType writeContext,
+      Declaration writeVariable, Reference combiner, DartType inferredType) {
+    _store(location,
+        declaration: writeVariable,
+        isWriteReference: true,
+        writeContext: writeContext,
+        combiner: combiner,
+        inferredType: inferredType);
   }
 
-  void variableAssignExit(Expression expression, DartType writeContext,
-      Expression write, Procedure combiner, DartType inferredType) {
-    _replaceReference(write is VariableSet
-        ? write.variable
-        : const NullNode('writable-variable'));
-    _replaceType(writeContext);
-    _recordReference(
-        combiner ?? const NullNode('assign-combiner'), write.fileOffset);
-    _recordType(inferredType, write.fileOffset);
-  }
-
-  void variableDeclarationEnter(VariableDeclaration statement) {
-    _recordDeclaration(statement, statement.fileOffset);
-    _deferType(statement.fileOffset);
-  }
-
+  @override
   void variableDeclarationExit(
-      VariableDeclaration statement, DartType inferredType) {
-    _replaceType(statement.type);
+      Location location, DartType statementType, DartType inferredType) {
+    _store(location, literalType: statementType, inferredType: inferredType);
   }
 
-  void variableGetExit(VariableGet expression, DartType inferredType) {
-    /// Return `true` if the given [variable] declaration occurs in a let
-    /// expression that is, or is part of, a cascade expression.
-    bool isInCascade(VariableDeclaration variable) {
-      TreeNode ancestor = variable.parent;
-      while (ancestor is Let) {
-        if (ancestor is ShadowCascadeExpression) {
-          return true;
-        }
-        ancestor = ancestor.parent;
-      }
-      return false;
-    }
-
-    VariableDeclaration variable = expression.variable;
-    if (isInCascade(variable)) {
+  @override
+  void variableGetExit(Location location, bool isInCascade,
+      Declaration expressionVariable, DartType inferredType) {
+    if (isInCascade) {
       return;
     }
-    _recordReference(variable, expression.fileOffset);
-    _recordType(inferredType, expression.fileOffset);
+    _store(location,
+        declaration: expressionVariable, inferredType: inferredType);
   }
 
-  /// Record `null` as the reference at the given [offset], and put the current
-  /// slot into the [_deferredReferenceSlots] stack.
-  void _deferReference(int offset) {
-    int slot = _recordReference(null, offset);
-    _deferredReferenceSlots.add(slot);
+  void _push(Function f) {
+    _stack.add(f);
   }
 
-  /// Record `null` as the type at the given [offset], and put the current
-  /// slot into the [_deferredTypeSlots] stack.
-  void _deferType(int offset) {
-    int slot = _recordType(null, offset);
-    _deferredTypeSlots.add(slot);
+  Function _pop() {
+    return _stack.removeLast();
   }
 
-  void _recordDeclaration(TreeNode declaration, int offset) {
-    _declarations.add(declaration);
+  @override
+  void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
+    _store(location, prefixInfo: prefixInfo);
   }
 
-  /// If the [prefixName] is not `null` record the reference to it.
-  void _recordImportPrefix(String prefixName) {
-    if (prefixName != null) {
-      _recordReference(new ImportPrefixNode(prefixName), UNKNOWN_OFFSET);
-      _recordType(const NullType(), UNKNOWN_OFFSET);
-    }
-  }
-
-  int _recordReference(Node target, int offset) {
-    int slot = _references.length;
-    _references.add(target);
-    return slot;
-  }
-
-  int _recordType(DartType type, int offset) {
-    int slot = _types.length;
-    _types.add(type);
-    return slot;
-  }
-
-  void _replaceReference(Node reference) {
-    int slot = _deferredReferenceSlots.removeLast();
-    _references[slot] = reference;
-  }
-
-  void _replaceType(DartType type, [int newOffset = -1]) {
-    int slot = _deferredTypeSlots.removeLast();
-    _types[slot] = type;
-  }
-
-  /// If the [member] is a forwarding stub, return the target it forwards to.
-  /// Otherwise return the given [member].
-  static Member _getRealTarget(Member member) {
-    if (member is Procedure && member.isForwardingStub) {
-      return member.forwardingStubInterfaceTarget;
-    }
-    return member;
+  @override
+  void storeClassReference(
+      Location location, Reference reference, DartType rawType) {
+    // TODO(paulberry): would it be better to use literalType?
+    _store(location, reference: reference, inferredType: rawType);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 27e5169..ba1885e 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -91,10 +91,7 @@
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     if (_isBodyToCreateElementsFor(node)) {
       _walker.consumeLocalElements();
-      // With kernel local elements are created in resolution applier.
-      if (!_applyKernelTypes) {
-        node.accept(_walker.elementBuilder);
-      }
+      node.accept(_walker.elementBuilder);
       return null;
     } else {
       return super.visitBlockFunctionBody(node);
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index ba4fcf5..6f5e77a 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -130,7 +130,9 @@
   @override
   CompilationUnit parseCompilationUnit2() {
     currentToken = fastaParser.parseUnit(currentToken);
-    return astBuilder.pop();
+    CompilationUnitImpl compilationUnit = astBuilder.pop();
+    compilationUnit.localDeclarations = astBuilder.localDeclarations;
+    return compilationUnit;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 43cb699..876f47d 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -372,7 +372,8 @@
     }
 
     // Replace Analyzer type parameters with type arguments.
-    throw new UnimplementedError('TODO(paulberry)');
+    throw new UnimplementedError(
+        'TODO(paulberry): resynthesize generic typedef');
   }
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
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 629ddde..171376f 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
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Kernel);
+    defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Kernel);
   });
 }
 
@@ -172,6 +170,12 @@
   }
 
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_listLiteral_inferredElementType() async =>
+      super.test_listLiteral_inferredElementType();
+
+  @failingTest
   @override
   test_mapKeyTypeNotAssignable() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, found 0;
@@ -180,6 +184,18 @@
   }
 
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_mapLiteral_inferredKeyType() async =>
+      super.test_mapLiteral_inferredKeyType();
+
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/31936')
+  @override
+  test_mapLiteral_inferredValueType() async =>
+      super.test_mapLiteral_inferredValueType();
+
+  @failingTest
   @override
   test_mapValueTypeNotAssignable() async {
     // Expected 1 errors of type CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, found 0;
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 9832e8c..765ee32 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
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
+    defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
   });
 }
 
@@ -35,6 +33,11 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/12916')
+  test_ambiguousExport() async => super.test_ambiguousExport();
+
+  @override
+  @failingTest
   test_annotationWithNotClass() async {
     // Bad state: No reference information for property at 117
     await super.test_annotationWithNotClass();
@@ -70,6 +73,13 @@
 
   @override
   @failingTest
+  test_async_used_as_identifier_in_prefix() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super.test_async_used_as_identifier_in_prefix();
+  }
+
+  @override
+  @failingTest
   test_bug_23176() async {
     // This test fails because the kernel driver element model produces a
     // different element model result than the regular parser produces. Once these
@@ -438,22 +448,6 @@
 
   @override
   @failingTest
-  test_constInitializedWithNonConstValue_missingConstInListLiteral() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
-    await super
-        .test_constInitializedWithNonConstValue_missingConstInListLiteral();
-  }
-
-  @override
-  @failingTest
-  test_constInitializedWithNonConstValue_missingConstInMapLiteral() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
-    await super
-        .test_constInitializedWithNonConstValue_missingConstInMapLiteral();
-  }
-
-  @override
-  @failingTest
   test_constInitializedWithNonConstValueFromDeferredClass() async {
     // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
     await super.test_constInitializedWithNonConstValueFromDeferredClass();
@@ -965,21 +959,6 @@
 
   @override
   @failingTest
-  test_fieldInitializerOutsideConstructor_defaultParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
-    await super.test_fieldInitializerOutsideConstructor_defaultParameter();
-  }
-
-  @override
-  @failingTest
-  test_fieldInitializerOutsideConstructor_inFunctionTypeParameter() async {
-    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
-    await super
-        .test_fieldInitializerOutsideConstructor_inFunctionTypeParameter();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
   test_fieldInitializerRedirectingConstructor_afterRedirection() async {
     return super.test_fieldInitializerRedirectingConstructor_afterRedirection();
@@ -1025,20 +1004,6 @@
 
   @override
   @failingTest
-  test_finalNotInitialized_instanceField_const_static() async {
-    // Bad state: Some types were not consumed, starting at offset 26
-    await super.test_finalNotInitialized_instanceField_const_static();
-  }
-
-  @override
-  @failingTest
-  test_finalNotInitialized_library_const() async {
-    // Bad state: Some types were not consumed, starting at offset 7
-    await super.test_finalNotInitialized_library_const();
-  }
-
-  @override
-  @failingTest
   test_finalNotInitialized_local_const() async {
     // Expected 1 errors of type CompileTimeErrorCode.CONST_NOT_INITIALIZED, found 0
     await super.test_finalNotInitialized_local_const();
@@ -2724,13 +2689,6 @@
 
   @override
   @failingTest
-  test_referencedBeforeDeclaration_hideInBlock_function() async {
-    // Bad state: No declaration information for v() {} at 34
-    await super.test_referencedBeforeDeclaration_hideInBlock_function();
-  }
-
-  @override
-  @failingTest
   test_referencedBeforeDeclaration_hideInBlock_local() async {
     // Bad state: No type information for v at 38
     await super.test_referencedBeforeDeclaration_hideInBlock_local();
@@ -2759,13 +2717,6 @@
 
   @override
   @failingTest
-  test_referencedBeforeDeclaration_type_localFunction() async {
-    // Bad state: No declaration information for int String(int x) => x + 1; at 40
-    await super.test_referencedBeforeDeclaration_type_localFunction();
-  }
-
-  @override
-  @failingTest
   test_referencedBeforeDeclaration_type_localVariable() async {
     // Bad state: No type information for String at 44
     await super.test_referencedBeforeDeclaration_type_localVariable();
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 56e130d..5423d74 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -2220,17 +2220,32 @@
   test_extendsDisallowedClass_class_double() async {
     Source source = addSource("class A extends double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_extendsDisallowedClass_class_int() async {
     Source source = addSource("class A extends int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]);
     verify([source]);
   }
 
@@ -2247,17 +2262,32 @@
   test_extendsDisallowedClass_class_num() async {
     Source source = addSource("class A extends num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_extendsDisallowedClass_class_String() async {
     Source source = addSource("class A extends String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+              ]);
     verify([source]);
   }
 
@@ -2282,7 +2312,14 @@
 class M {}
 class C = double with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2296,7 +2333,8 @@
         useCFE
             ? [
                 CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
               ]
             : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -2316,7 +2354,14 @@
 class M {}
 class C = num with M;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2330,7 +2375,8 @@
         useCFE
             ? [
                 CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+                CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
               ]
             : [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -2755,22 +2801,28 @@
   test_implementsDisallowedClass_class_double() async {
     Source source = addSource("class A implements double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_int() async {
     Source source = addSource("class A implements int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2788,22 +2840,28 @@
   test_implementsDisallowedClass_class_num() async {
     Source source = addSource("class A implements num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_implementsDisallowedClass_class_String() async {
     Source source = addSource("class A implements String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2841,11 +2899,14 @@
 class M {}
 class C = A with M implements double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2855,11 +2916,14 @@
 class M {}
 class C = A with M implements int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2883,11 +2947,14 @@
 class M {}
 class C = A with M implements num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -2897,11 +2964,14 @@
 class M {}
 class C = A with M implements String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4387,22 +4457,28 @@
   test_mixinOfDisallowedClass_class_double() async {
     Source source = addSource("class A extends Object with double {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_int() async {
     Source source = addSource("class A extends Object with int {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4420,22 +4496,28 @@
   test_mixinOfDisallowedClass_class_num() async {
     Source source = addSource("class A extends Object with num {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   test_mixinOfDisallowedClass_class_String() async {
     Source source = addSource("class A extends Object with String {}");
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4457,11 +4539,14 @@
 class A {}
 class C = A with double;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4470,11 +4555,14 @@
 class A {}
 class C = A with int;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4496,11 +4584,14 @@
 class A {}
 class C = A with num;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
@@ -4509,11 +4600,14 @@
 class A {}
 class C = A with String;''');
     await computeAnalysisResult(source);
-    assertErrors(source, [
-      useCFE
-          ? CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS
-          : CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
-    ]);
+    assertErrors(
+        source,
+        useCFE
+            ? [
+                CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+                StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+              ]
+            : [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 34fc3ca..410dd7e 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ErrorSuppressionTest_Kernel);
+    defineReflectiveTests(ErrorSuppressionTest_Kernel);
   });
 }
 
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 6f6314d..ad843c2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(HintCodeTest_Kernel);
+    defineReflectiveTests(HintCodeTest_Kernel);
   });
 }
 
@@ -66,41 +64,6 @@
 
   @failingTest
   @override
-  test_canBeNullAfterNullAware_after_cascade() async {
-    // Expected 1 errors of type HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, found 0
-    return super.test_canBeNullAfterNullAware_after_cascade();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_else() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_else();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_else_nested() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_else_nested();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_if() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_if();
-  }
-
-  @failingTest
-  @override
-  test_deadCode_deadBlock_if_nested() async {
-    // Expected 1 errors of type HintCode.DEAD_CODE, found 0
-    return super.test_deadCode_deadBlock_if_nested();
-  }
-
-  @failingTest
-  @override
   test_deadCode_deadFinalStatementInCase() async {
     // Expected 1 errors of type StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, found 0
     return super.test_deadCode_deadFinalStatementInCase();
@@ -173,37 +136,16 @@
 
   @failingTest
   @override
-  test_divisionOptimization_propagatedType() async {
-    // Expected 1 errors of type HintCode.DIVISION_OPTIMIZATION, found 0
-    return super.test_divisionOptimization_propagatedType();
+  test_duplicateShownHiddenName_hidden() {
+    // Expected 1 errors of type HintCode.DUPLICATE_HIDDEN_NAME, found 0
+    return super.test_duplicateShownHiddenName_hidden();
   }
 
   @failingTest
   @override
-  test_invalidAssignment_instanceVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_instanceVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_localVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_localVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_staticVariable() async {
-    // Expected 1 errors of type HintCode.INVALID_ASSIGNMENT, found 0
-    return super.test_invalidAssignment_staticVariable();
-  }
-
-  @failingTest
-  @override
-  test_invalidAssignment_variableDeclaration() async {
-    // UnimplementedError: Multiple field
-    return super.test_invalidAssignment_variableDeclaration();
+  test_duplicateShownHiddenName_shown() {
+    // Expected 1 errors of type HintCode.DUPLICATE_SHOWN_NAME, found 0
+    return super.test_duplicateShownHiddenName_shown();
   }
 
   @override
@@ -237,6 +179,13 @@
     return super.test_invalidRequiredParam_valid();
   }
 
+  @override
+  @failingTest
+  test_isNotDouble() {
+    // Bad state: No data for is at 10
+    return super.test_isNotDouble();
+  }
+
   @failingTest
   @override
   test_js_lib_OK() async {
@@ -300,6 +249,13 @@
     return super.test_mustCallSuper_indirect();
   }
 
+  @failingTest
+  @override
+  test_nullAwareBeforeOperator_ok_is_not() {
+    // Bad state: No data for is at 14
+    return super.test_nullAwareBeforeOperator_ok_is_not();
+  }
+
   @override
   @failingTest
   test_required_constructor_param() async {
@@ -374,6 +330,14 @@
     return super.test_strongMode_downCastCompositeWarn();
   }
 
+  @failingTest
+  @override
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_field_call();
+  }
+
   @override
   @failingTest
   test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke() {
@@ -390,23 +354,41 @@
 
   @failingTest
   @override
-  test_undefinedGetter() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_GETTER, found 0
-    return super.test_undefinedGetter();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_invoke_not_generic();
   }
 
   @failingTest
   @override
-  test_undefinedMethod() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
-    return super.test_undefinedMethod();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_explicit_type_params_prefixed();
   }
 
   @failingTest
   @override
-  test_undefinedMethod_assignmentExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_METHOD, found 0
-    return super.test_undefinedMethod_assignmentExpression();
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_not_generic_prefixed();
+  }
+
+  @failingTest
+  @override
+  test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed() {
+    // NoSuchMethodError: The getter 'element' was called on null.
+    return super
+        .test_strongMode_topLevelInstanceGetter_implicitlyTyped_new_prefixed();
+  }
+
+  @failingTest
+  @override
+  test_typeCheck_type_not_Null() {
+    // Bad state: No data for is at 20
+    return super.test_typeCheck_type_not_Null();
   }
 
   @failingTest
@@ -439,23 +421,23 @@
 
   @failingTest
   @override
-  test_undefinedOperator_postfixExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
-    return super.test_undefinedOperator_postfixExpression();
+  test_unnecessaryTypeCheck_null_not_Null() {
+    // Bad state: No data for is at 14
+    return super.test_unnecessaryTypeCheck_null_not_Null();
   }
 
   @failingTest
   @override
-  test_undefinedOperator_prefixExpression() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_OPERATOR, found 0
-    return super.test_undefinedOperator_prefixExpression();
+  test_unnecessaryTypeCheck_type_not_dynamic() {
+    // Bad state: No data for is at 20
+    return super.test_unnecessaryTypeCheck_type_not_dynamic();
   }
 
   @failingTest
   @override
-  test_undefinedSetter() async {
-    // Expected 1 errors of type HintCode.UNDEFINED_SETTER, found 0
-    return super.test_undefinedSetter();
+  test_unnecessaryTypeCheck_type_not_object() {
+    // Bad state: No data for is at 20
+    return super.test_unnecessaryTypeCheck_type_not_object();
   }
 
   @failingTest
@@ -493,16 +475,4 @@
     // Expected 1 errors of type HintCode.UNUSED_SHOWN_NAME, found 0
     return super.test_unusedShownName_topLevelVariable();
   }
-
-  @failingTest
-  @override
-  test_importDeferredLibraryWithLoadFunction() async {
-    await super.test_importDeferredLibraryWithLoadFunction();
-  }
-
-  @failingTest
-  @override
-  test_no_missingReturn_async_futureOrVoid() async {
-    await super.test_no_missingReturn_async_futureOrVoid();
-  }
 }
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 7274ba5..2f7a8c9 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(NonErrorResolverTest_Kernel);
+    defineReflectiveTests(NonErrorResolverTest_Kernel);
   });
 }
 
@@ -45,6 +43,20 @@
 
   @override
   @failingTest
+  test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_argumentTypeNotAssignable_invocation_typedef_generic();
+  }
+
+  @override
+  @failingTest
+  test_argumentTypeNotAssignable_optionalNew() {
+    // Bad state: No data for (builder: () {return Widget();}) at 164
+    return super.test_argumentTypeNotAssignable_optionalNew();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
@@ -115,6 +127,13 @@
 
   @override
   @failingTest
+  test_const_dynamic() {
+    // UnimplementedError: TODO(paulberry): DynamicType
+    return super.test_const_dynamic();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_constConstructorWithNonConstSuper_unresolved() async {
     return super.test_constConstructorWithNonConstSuper_unresolved();
@@ -143,6 +162,34 @@
 
   @override
   @failingTest
+  test_duplicateDefinition_emptyName() {
+    // NoSuchMethodError: The setter 'enclosingElement=' was called on null.
+    return super.test_duplicateDefinition_emptyName();
+  }
+
+  @override
+  @failingTest
+  test_dynamicIdentifier() {
+    // UnimplementedError: TODO(paulberry): DynamicType
+    return super.test_dynamicIdentifier();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_genericFunctionTyped() {
+    // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (88)
+    return super.test_fieldFormalParameter_genericFunctionTyped();
+  }
+
+  @override
+  @failingTest
+  test_fieldFormalParameter_genericFunctionTyped_named() {
+    // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (89)
+    return super.test_fieldFormalParameter_genericFunctionTyped_named();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_finalNotInitialized_hasNativeClause_hasConstructor() async {
     return super.test_finalNotInitialized_hasNativeClause_hasConstructor();
@@ -157,13 +204,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_forEach_genericFunctionType() async {
-    return super.test_forEach_genericFunctionType();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_functionDeclaration_scope_signature() async {
     return super.test_functionDeclaration_scope_signature();
@@ -178,11 +218,62 @@
 
   @override
   @failingTest
+  test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_castsAndTypeChecks_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_castsAndTypeChecks_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_fieldAndReturnType_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_genericTypeAlias_invalidGenericFunctionType() async {
     return super.test_genericTypeAlias_invalidGenericFunctionType();
   }
 
+  @override
+  @failingTest
+  test_genericTypeAlias_noTypeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_noTypeParameters();
+  }
+
+  @override
+  @failingTest
+  test_genericTypeAlias_typeParameters() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericTypeAlias_typeParameters();
+  }
+
   @override // passes with kernel
   test_infer_mixin() => super.test_infer_mixin();
 
@@ -192,16 +283,6 @@
 
   @override
   @failingTest
-  test_infer_mixin_with_substitution() =>
-      super.test_infer_mixin_with_substitution();
-
-  @override
-  @failingTest
-  test_infer_mixin_with_substitution_functionType() =>
-      super.test_infer_mixin_with_substitution_functionType();
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_integerLiteralOutOfRange_negative_valid() async {
     return super.test_integerLiteralOutOfRange_negative_valid();
@@ -216,6 +297,47 @@
 
   @override
   @failingTest
+  test_invalidAnnotation_constantVariable_field_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super
+        .test_invalidAnnotation_constantVariable_field_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super
+        .test_invalidAnnotation_constantVariable_topLevel_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constConstructor_importWithPrefix() {
+    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
+    // of 'topEntity'
+    return super.test_invalidAnnotation_constConstructor_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invalidAnnotation_constConstructor_named_importWithPrefix() {
+    // Bad state: No data for named at 29
+    return super
+        .test_invalidAnnotation_constConstructor_named_importWithPrefix();
+  }
+
+  @override
+  @failingTest
+  test_invocationOfNonFunction_functionTypeTypeParameter() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_invocationOfNonFunction_functionTypeTypeParameter();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
   test_invocationOfNonFunction_Object() async {
     return super.test_invocationOfNonFunction_Object();
@@ -223,6 +345,13 @@
 
   @override
   @failingTest
+  test_issue_32394() {
+    // Failed assertion: line 1133 pos 12: 'element != null': is not true.
+    return super.test_issue_32394();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_loadLibraryDefined() async {
     return super.test_loadLibraryDefined();
@@ -230,6 +359,14 @@
 
   @override
   @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/30609')
+  test_metadata_enumConstantDeclaration() {
+    // Failed to resolve 2 nodes
+    return super.test_metadata_enumConstantDeclaration();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_methodDeclaration_scope_signature() async {
     return super.test_methodDeclaration_scope_signature();
@@ -237,6 +374,13 @@
 
   @override
   @failingTest
+  test_nativeConstConstructor() {
+    // Expected 0 errors of type ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, found 1 (35)
+    return super.test_nativeConstConstructor();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31628')
   test_nonConstCaseExpression_constField() async {
     return super.test_nonConstCaseExpression_constField();
@@ -265,16 +409,16 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_returnOfInvalidType_typeParameter_18468() async {
-    return super.test_returnOfInvalidType_typeParameter_18468();
+  test_optionalNew_rewrite_instantiatesToBounds() {
+    // Bad state: No data for named1 at 21
+    return super.test_optionalNew_rewrite_instantiatesToBounds();
   }
 
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_sharedDeferredPrefix() async {
-    return super.test_sharedDeferredPrefix();
+  test_returnOfInvalidType_typeParameter_18468() async {
+    return super.test_returnOfInvalidType_typeParameter_18468();
   }
 
   @override
@@ -293,9 +437,9 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_undefinedIdentifier_synthetic_whenExpression() async {
-    return super.test_undefinedIdentifier_synthetic_whenExpression();
+  test_undefinedGetter_static_conditionalAccess() {
+    // Bad state: No data for A at 36
+    return super.test_undefinedGetter_static_conditionalAccess();
   }
 
   @override
@@ -304,4 +448,18 @@
   test_undefinedIdentifier_synthetic_whenMethodName() async {
     return super.test_undefinedIdentifier_synthetic_whenMethodName();
   }
+
+  @override
+  @failingTest
+  test_undefinedMethod_static_conditionalAccess() {
+    // Bad state: No data for A at 39
+    return super.test_undefinedMethod_static_conditionalAccess();
+  }
+
+  @override
+  @failingTest
+  test_undefinedSetter_static_conditionalAccess() {
+    // Bad state: No data for A at 34
+    return super.test_undefinedSetter_static_conditionalAccess();
+  }
 }
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 082ef32..dc39f65 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -11,9 +11,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(NonHintCodeTest_Kernel);
+    defineReflectiveTests(NonHintCodeTest_Kernel);
   });
 }
 
@@ -39,6 +37,40 @@
   @override
   bool get useCFE => true;
 
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningFunction() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningFunction();
+  }
+
+  @override
+  @failingTest
+  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_inNestedLocalFunction();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningMethod() {
+    // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+    // node.parent is EnumConstantDeclaration': is not true.
+    return super.test_deprecatedAnnotationUse_namedParameter_inDefiningMethod();
+  }
+
+  @override
+  @failingTest
+  test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
+  }
+
   @failingTest
   @override
   @potentialAnalyzerProblem
@@ -51,20 +83,6 @@
   @override
   @failingTest
   @notForDart2
-  test_undefinedGetter_inSubtype() async {
-    await super.test_undefinedGetter_inSubtype();
-  }
-
-  @override
-  @failingTest
-  @notForDart2
-  test_undefinedMethod_inSubtype() async {
-    await super.test_undefinedMethod_inSubtype();
-  }
-
-  @override
-  @failingTest
-  @notForDart2
   test_undefinedOperator_binaryExpression_inSubtype() async {
     await super.test_undefinedOperator_binaryExpression_inSubtype();
   }
@@ -91,13 +109,6 @@
   }
 
   @override
-  @failingTest
-  @notForDart2
-  test_undefinedSetter_inSubtype() async {
-    await super.test_undefinedSetter_inSubtype();
-  }
-
-  @override
   test_unnecessaryCast_generics() async {
     // dartbug.com/18953
     // Overridden because type inference now produces more information and there
@@ -122,17 +133,26 @@
 //    await super.test_unusedImport_annotationOnDirective();
   }
 
-  @failingTest
   @override
-  @potentialAnalyzerProblem
-  test_unusedImport_metadata() async {
-    await super.test_unusedImport_metadata();
+  @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
-  test_importDeferredLibraryWithLoadFunction() async {
-    await super.test_importDeferredLibraryWithLoadFunction();
+  test_unusedImport_metadata() async {
+    await super.test_unusedImport_metadata();
   }
 }
diff --git a/pkg/analyzer/test/generated/resolver_kernel_test.dart b/pkg/analyzer/test/generated/resolver_kernel_test.dart
index a3537a4..bc11b8b 100644
--- a/pkg/analyzer/test/generated/resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/resolver_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StrictModeTest_Kernel);
+    defineReflectiveTests(StrictModeTest_Kernel);
   });
 }
 
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
index 07c4b89..bdee524 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticTypeAnalyzer2Test_Kernel);
+    defineReflectiveTests(StaticTypeAnalyzer2Test_Kernel);
   });
 }
 
@@ -24,20 +22,6 @@
 
   @override
   @failingTest
-  test_FunctionExpressionInvocation_block() async {
-    // Bad state: No reference information for (() {return 1;})() at 21
-    await super.test_FunctionExpressionInvocation_block();
-  }
-
-  @override
-  @failingTest
-  test_MethodInvocation_nameType_parameter_propagatedType() async {
-    // Expected: DynamicTypeImpl:<dynamic>
-    await super.test_MethodInvocation_nameType_parameter_propagatedType();
-  }
-
-  @override
-  @failingTest
   test_staticMethods_classTypeParameters_genericMethod() async {
     // Expected: '(dynamic) → void'
     await super.test_staticMethods_classTypeParameters_genericMethod();
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 f864c75..234c2ff 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
@@ -8,10 +8,8 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticTypeWarningCodeTest_Kernel);
-    // defineReflectiveTests(StrongModeStaticTypeWarningCodeTest_Kernel);
+    defineReflectiveTests(StaticTypeWarningCodeTest_Kernel);
+    defineReflectiveTests(StrongModeStaticTypeWarningCodeTest_Kernel);
   });
 }
 
@@ -66,6 +64,13 @@
 
   @override
   @failingTest
+  test_bug21912() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_bug21912();
+  }
+
+  @override
+  @failingTest
   test_expectedOneListTypeArgument() async {
     // Bad state: Found 1 argument types for 2 type arguments
     await super.test_expectedOneListTypeArgument();
@@ -431,6 +436,16 @@
 
   @override
   @failingTest
+  test_returnOfInvalidType_async_future_future_int_mismatches_future_int() {
+    // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+    // found 0; 0 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found
+    // 1 (54)
+    return super
+        .test_returnOfInvalidType_async_future_future_int_mismatches_future_int();
+  }
+
+  @override
+  @failingTest
   test_returnOfInvalidType_async_future_int_mismatches_future_string() async {
     // Expected 1 errors of type StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, found 0
     await super
diff --git a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
index da2d2e9..ff7880f 100644
--- a/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_kernel_test.dart
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StaticWarningCodeTest_Kernel);
+    defineReflectiveTests(StaticWarningCodeTest_Kernel);
   });
 }
 
@@ -150,6 +148,13 @@
 
   @override
   @failingTest
+  test_argumentTypeNotAssignable_call() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_argumentTypeNotAssignable_call();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_argumentTypeNotAssignable_cascadeSecond() async {
     return super.test_argumentTypeNotAssignable_cascadeSecond();
@@ -476,20 +481,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_concreteClassWithAbstractMember() async {
-    return super.test_concreteClassWithAbstractMember();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_concreteClassWithAbstractMember_noSuchMethod_interface() async {
-    return super.test_concreteClassWithAbstractMember_noSuchMethod_interface();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_conflictingDartImport() async {
     return super.test_conflictingDartImport();
   }
@@ -759,58 +750,188 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_direct() async {
-    return super.test_functionWithoutCall_direct();
+  test_generalizedVoid_invocationOfVoidFieldError() async {
+    return super.test_generalizedVoid_invocationOfVoidFieldError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_direct_typeAlias() async {
-    return super.test_functionWithoutCall_direct_typeAlias();
+  test_generalizedVoid_invocationOfVoidLocalError() async {
+    return super.test_generalizedVoid_invocationOfVoidLocalError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_extends() async {
-    return super.test_functionWithoutCall_indirect_extends();
+  test_generalizedVoid_invocationOfVoidResultError() async {
+    return super.test_generalizedVoid_invocationOfVoidResultError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_extends_typeAlias() async {
-    return super.test_functionWithoutCall_indirect_extends_typeAlias();
+  test_generalizedVoid_invocationOfVoidToplevelError() async {
+    return super.test_generalizedVoid_invocationOfVoidToplevelError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_implements() async {
-    return super.test_functionWithoutCall_indirect_implements();
+  test_generalizedVoid_throwVoidValueError() async {
+    return super.test_generalizedVoid_throwVoidValueError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_indirect_implements_typeAlias() async {
-    return super.test_functionWithoutCall_indirect_implements_typeAlias();
+  test_generalizedVoid_useOfInForeachIterableError() async {
+    return super.test_generalizedVoid_useOfInForeachIterableError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_mixin_implements() async {
-    return super.test_functionWithoutCall_mixin_implements();
+  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
+    return super.test_generalizedVoid_useOfVoidAsIndexAssignError();
   }
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_functionWithoutCall_mixin_implements_typeAlias() async {
-    return super.test_functionWithoutCall_mixin_implements_typeAlias();
+  test_generalizedVoid_useOfVoidAsIndexError() async {
+    return super.test_generalizedVoid_useOfVoidAsIndexError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
+    return super.test_generalizedVoid_useOfVoidAssignedToDynamicError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidByIndexingError() async {
+    return super.test_generalizedVoid_useOfVoidByIndexingError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallMethodError() async {
+    return super.test_generalizedVoid_useOfVoidCallMethodError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
+    return super.test_generalizedVoid_useOfVoidCallMethodWithNullError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCallSetterError() async {
+    return super.test_generalizedVoid_useOfVoidCallSetterError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidCascadeError() async {
+    return super.test_generalizedVoid_useOfVoidCascadeError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalLhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
+    return super.test_generalizedVoid_useOfVoidInConditionalRhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInDoWhileConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInForeachVariableError() async {
+    return super.test_generalizedVoid_useOfVoidInForeachVariableError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInIsTestError() async {
+    return super.test_generalizedVoid_useOfVoidInIsTestError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInListLiteralError() async {
+    return super.test_generalizedVoid_useOfVoidInListLiteralError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
+    return super.test_generalizedVoid_useOfVoidInMapLiteralKeyError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
+    return super.test_generalizedVoid_useOfVoidInMapLiteralValueError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
+    return super.test_generalizedVoid_useOfVoidInNullOperatorLhsError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
+    return super.test_generalizedVoid_useOfVoidInSpecialAssignmentError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
+    return super.test_generalizedVoid_useOfVoidInSwitchExpressionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidInWhileConditionError() async {
+    return super.test_generalizedVoid_useOfVoidInWhileConditionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
+    return super.test_generalizedVoid_useOfVoidNullPropertyAccessError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidPropertyAccessError() async {
+    return super.test_generalizedVoid_useOfVoidPropertyAccessError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
+    return super.test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError();
+  }
+
+  @override
+  @failingTest
+  test_generalizedVoid_useOfVoidWhenArgumentError() async {
+    return super.test_generalizedVoid_useOfVoidWhenArgumentError();
   }
 
   @override
@@ -973,34 +1094,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_invalidOverride_defaultOverridesNonDefault() async {
-    return super.test_invalidOverride_defaultOverridesNonDefault();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverride_defaultOverridesNonDefault_named() async {
-    return super.test_invalidOverride_defaultOverridesNonDefault_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverrideDifferentDefaultValues_named() async {
-    return super.test_invalidOverrideDifferentDefaultValues_named();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_invalidOverrideDifferentDefaultValues_positional() async {
-    return super.test_invalidOverrideDifferentDefaultValues_positional();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_invalidOverrideNamed_fewerNamedParameters() async {
     return super.test_invalidOverrideNamed_fewerNamedParameters();
   }
@@ -1520,6 +1613,13 @@
 
   @override
   @failingTest
+  test_returnWithoutValue_async_future_object_with_return() {
+    // Expected 1 errors of type StaticWarningCode.RETURN_WITHOUT_VALUE, found 0
+    return super.test_returnWithoutValue_async_future_object_with_return();
+  }
+
+  @override
+  @failingTest
   @potentialAnalyzerProblem
   test_returnWithoutValue_factoryConstructor() async {
     return super.test_returnWithoutValue_factoryConstructor();
@@ -1549,13 +1649,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_returnWithoutValue_Null() async {
-    return super.test_returnWithoutValue_Null();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_staticAccessToInstanceMember_method_invocation() async {
     return super.test_staticAccessToInstanceMember_method_invocation();
   }
@@ -1663,13 +1756,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_typePromotion_functionType_arg_InterToDyn() async {
-    return super.test_typePromotion_functionType_arg_InterToDyn();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_typeTestNonType() async {
     return super.test_typeTestNonType();
   }
@@ -1814,204 +1900,6 @@
     return super.test_undefinedStaticMethodOrGetter_setter_inSuperclass();
   }
 
-  @override
-  @failingTest
-  test_generalizedVoid_assignToVoid_notStrong_error() async {
-    return super.test_generalizedVoid_assignToVoid_notStrong_error();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInForPartsOk() async {
-    return super.test_generalizedVoid_useOfVoidInForPartsOk();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInIsTestError() async {
-    return super.test_generalizedVoid_useOfVoidInIsTestError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalLhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
-    return super.test_generalizedVoid_useOfVoidInConditionalRhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidWhenArgumentError() async {
-    return super.test_generalizedVoid_useOfVoidWhenArgumentError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
-    return super.test_generalizedVoid_useOfVoidAssignedToDynamicError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_throwVoidValueError() async {
-    return super.test_generalizedVoid_throwVoidValueError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInListLiteralError() async {
-    return super.test_generalizedVoid_useOfVoidInListLiteralError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
-    return super.test_generalizedVoid_useOfVoidInMapLiteralValueError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
-    return super.test_generalizedVoid_useOfVoidInMapLiteralKeyError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
-    return super.test_generalizedVoid_useOfVoidInNullOperatorLhsError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
-    return super.test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInWhileConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInWhileConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
-    return super.test_generalizedVoid_useOfVoidInDoWhileConditionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfInForeachIterableError() async {
-    return super.test_generalizedVoid_useOfInForeachIterableError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInForeachVariableError() async {
-    return super.test_generalizedVoid_useOfVoidInForeachVariableError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
-    return super.test_generalizedVoid_useOfVoidInSpecialAssignmentError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallMethodError() async {
-    return super.test_generalizedVoid_useOfVoidCallMethodError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
-    return super.test_generalizedVoid_useOfVoidCallMethodWithNullError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCascadeError() async {
-    return super.test_generalizedVoid_useOfVoidCascadeError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidToplevelError() async {
-    return super.test_generalizedVoid_invocationOfVoidToplevelError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidLocalError() async {
-    return super.test_generalizedVoid_invocationOfVoidLocalError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidFieldError() async {
-    return super.test_generalizedVoid_invocationOfVoidFieldError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_invocationOfVoidResultError() async {
-    return super.test_generalizedVoid_invocationOfVoidResultError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidByIndexingError() async {
-    return super.test_generalizedVoid_useOfVoidByIndexingError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAsIndexError() async {
-    return super.test_generalizedVoid_useOfVoidAsIndexError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
-    return super.test_generalizedVoid_useOfVoidAsIndexAssignError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
-    return super.test_generalizedVoid_useOfVoidInSwitchExpressionError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidPropertyAccessError() async {
-    return super.test_generalizedVoid_useOfVoidPropertyAccessError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidCallSetterError() async {
-    return super.test_generalizedVoid_useOfVoidCallSetterError();
-  }
-
-  @override
-  @failingTest
-  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
-    return super.test_generalizedVoid_useOfVoidNullPropertyAccessError();
-  }
-
   @failingTest
   @override
   test_useOfVoidResult_assignmentExpression_function() async {
@@ -2026,8 +1914,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_variableDeclaration_method2() async {
-    return super.test_useOfVoidResult_variableDeclaration_method2();
+  test_useOfVoidResult_inForLoop_error() async {
+    return super.test_useOfVoidResult_inForLoop_error();
   }
 
   @override
@@ -2037,8 +1925,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_inForLoop_error() async {
-    return super.test_useOfVoidResult_inForLoop_error();
+  test_useOfVoidResult_variableDeclaration_function_error() async {
+    return super.test_useOfVoidResult_variableDeclaration_function_error();
   }
 
   @override
@@ -2048,8 +1936,8 @@
 
   @failingTest
   @override
-  test_useOfVoidResult_variableDeclaration_function_error() async {
-    return super.test_useOfVoidResult_variableDeclaration_function_error();
+  test_useOfVoidResult_variableDeclaration_method2() async {
+    return super.test_useOfVoidResult_variableDeclaration_method2();
   }
 
   @failingTest
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 61abc60..9157b6d 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -9,11 +9,9 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(StrongModeLocalInferenceTest_Kernel);
-    // defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test_Kernel);
-    // defineReflectiveTests(StrongModeTypePropagationTest_Kernel);
+    defineReflectiveTests(StrongModeLocalInferenceTest_Kernel);
+    defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test_Kernel);
+    defineReflectiveTests(StrongModeTypePropagationTest_Kernel);
   });
 }
 
@@ -67,6 +65,13 @@
 
   @override
   @failingTest
+  test_constrainedByBounds4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_constrainedByBounds4();
+  }
+
+  @override
+  @failingTest
   test_constrainedByBounds5() async {
     // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
     await super.test_constrainedByBounds5();
@@ -102,6 +107,41 @@
 
   @override
   @failingTest
+  test_functionDeclaration_body_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionDeclaration_body_propagation();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_typedArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_assignment_typedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_assignment_unTypedArguments() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_assignment_unTypedArguments();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_body_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_body_propagation();
+  }
+
+  @override
+  @failingTest
+  test_functionLiteral_unTypedArgument_propagation() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_functionLiteral_unTypedArgument_propagation();
+  }
+
+  @override
+  @failingTest
   test_futureOr_downwards8() async {
     // type 'BottomTypeImpl' is not a subtype of type 'InterfaceType' in type cast where
     await super.test_futureOr_downwards8();
@@ -222,13 +262,6 @@
 
   @override
   @failingTest
-  test_inferredFieldDeclaration_propagation() async {
-    // Expected: InterfaceTypeImpl:<int>
-    await super.test_inferredFieldDeclaration_propagation();
-  }
-
-  @override
-  @failingTest
   test_instanceCreation() async {
     // AnalysisException: Element mismatch in /test.dart at class A<S, T>
     await super.test_instanceCreation();
@@ -240,6 +273,13 @@
 
   @override
   @failingTest
+  test_partialTypes1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_partialTypes1();
+  }
+
+  @override
+  @failingTest
   test_pinning_multipleConstraints1() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
     await super.test_pinning_multipleConstraints1();
@@ -254,12 +294,96 @@
 
   @override
   @failingTest
+  test_pinning_multipleConstraints_contravariant1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant1();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant2() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant2();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant3() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant3();
+  }
+
+  @override
+  @failingTest
+  test_pinning_multipleConstraints_contravariant4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_pinning_multipleConstraints_contravariant4();
+  }
+
+  @override
+  @failingTest
+  test_redirectedConstructor_named() {
+    // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
+    return super.test_redirectedConstructor_named();
+  }
+
+  @override
+  @failingTest
+  test_redirectedConstructor_unnamed() {
+    // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
+    return super.test_redirectedConstructor_unnamed();
+  }
+
+  @override
+  @failingTest
   test_redirectingConstructor_propagation() async {
     // AnalysisException: Element mismatch in /test.dart at class A
     await super.test_redirectingConstructor_propagation();
     // TODO(brianwilkerson) Figure out why this test is flaky.
     fail('Flaky test');
   }
+
+  @override
+  @failingTest
+  test_returnType_variance1() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance1();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance2() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance2();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance3() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance3();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance4() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance4();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance5() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance5();
+  }
+
+  @override
+  @failingTest
+  test_returnType_variance6() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_returnType_variance6();
+  }
 }
 
 @reflectiveTest
@@ -289,6 +413,13 @@
 
   @override
   @failingTest
+  test_genericFunction_typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_genericFunction_typedef();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_explicitTypeParams() async {
     // Bad state: Found 2 argument types for 1 type arguments
     await super.test_genericMethod_explicitTypeParams();
@@ -303,6 +434,22 @@
 
   @override
   @failingTest
+  test_genericMethod_functionExpressionInvocation_functionTypedParameter_explicit() {
+    // Failed to resolve 2 nodes
+    return super
+        .test_genericMethod_functionExpressionInvocation_functionTypedParameter_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionExpressionInvocation_functionTypedParameter_inferred() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionExpressionInvocation_functionTypedParameter_inferred();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_functionExpressionInvocation_inferred() async {
     // Bad state: Expected element declaration for analyzer offset 230; got one for kernel offset 233
     await super.test_genericMethod_functionExpressionInvocation_inferred();
@@ -317,6 +464,22 @@
 
   @override
   @failingTest
+  test_genericMethod_functionInvocation_functionTypedParameter_explicit() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionInvocation_functionTypedParameter_explicit();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_functionInvocation_functionTypedParameter_inferred() {
+    // Failed to resolve 1 nodes
+    return super
+        .test_genericMethod_functionInvocation_functionTypedParameter_inferred();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_functionInvocation_inferred() async {
     // Failed to resolve 1 nodes:
     await super.test_genericMethod_functionInvocation_inferred();
@@ -324,6 +487,13 @@
 
   @override
   @failingTest
+  test_genericMethod_functionTypedParameter_tearoff() {
+    // Failed to resolve 1 nodes
+    return super.test_genericMethod_functionTypedParameter_tearoff();
+  }
+
+  @override
+  @failingTest
   test_genericMethod_implicitDynamic() async {
     // Expected: '<T>((dynamic) → T) → T'
     await super.test_genericMethod_implicitDynamic();
@@ -338,9 +508,24 @@
 
   @override
   @failingTest
-  test_genericMethod_override_invalidReturnType() async {
+  test_genericMethod_nestedFunctions() {
+    // Expected: '<S>(S) → <S>(S) → S'; Actual: '<Sâ‚€>(S) → <S>(S) → S'
+    return super.test_genericMethod_nestedFunctions();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_differentContextsSameBounds() {
+    // UnimplementedError: TODO(paulberry): TypeParameterType
+    return super.test_genericMethod_override_differentContextsSameBounds();
+  }
+
+  @override
+  @failingTest
+  test_genericMethod_override_invalidContravariantTypeParamBounds() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    await super.test_genericMethod_override_invalidReturnType();
+    await super
+        .test_genericMethod_override_invalidContravariantTypeParamBounds();
   }
 
   @override
@@ -353,10 +538,9 @@
 
   @override
   @failingTest
-  test_genericMethod_override_invalidContravariantTypeParamBounds() async {
+  test_genericMethod_override_invalidReturnType() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
-    await super
-        .test_genericMethod_override_invalidContravariantTypeParamBounds();
+    await super.test_genericMethod_override_invalidReturnType();
   }
 
   @override
@@ -382,9 +566,109 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_instantiateToBounds_class_error_recursion() async {
-    return super.test_instantiateToBounds_class_error_recursion();
+  test_genericMethod_toplevel_field_staticTearoff() {
+    // Failed to resolve 1 nodes
+    return super.test_genericMethod_toplevel_field_staticTearoff();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_class_error_typedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super.test_instantiateToBounds_class_error_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_class_error_recursion_typedef() {
+    // Expected 2 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0; 1 errors of
+    // type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
+    return super.test_notInstantiatedBound_class_error_recursion_typedef();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_argument() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_argument();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_argument2() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_argument2();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_direct() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_direct();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_class_indirect() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_class_indirect();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_functionType() {
+    // Expected 2 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_functionType();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_argument() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_argument();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_argument2() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_argument2();
+  }
+
+  @override
+  @failingTest
+  test_notInstantiatedBound_error_typedef_direct() {
+    // Expected 1 errors of type
+    // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0
+    return super.test_notInstantiatedBound_error_typedef_direct();
+  }
+
+  @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();
+  }
+
+  @override
+  @failingTest
+  test_returnOfInvalidType_object_void() async {
+    await super.test_returnOfInvalidType_object_void();
   }
 
   @override
@@ -407,12 +691,6 @@
     // Expected 2 errors of type StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, found 0
     await super.test_setterWithOtherTypeIsError();
   }
-
-  @override
-  @failingTest
-  test_returnOfInvalidType_object_void() async {
-    await super.test_returnOfInvalidType_object_void();
-  }
 }
 
 @reflectiveTest
@@ -426,4 +704,12 @@
 
   @override
   bool get useCFE => true;
+
+  @override
+  @failingTest
+  test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef() {
+    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
+    return super
+        .test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef();
+  }
 }
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 19ca54e..830cd0f 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -9,9 +9,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisDriverTest_Kernel);
+    defineReflectiveTests(AnalysisDriverTest_Kernel);
   });
 }
 
@@ -59,13 +57,6 @@
   @failingTest
   @potentialAnalyzerProblem
   @override
-  test_const_annotation_notConstConstructor() async {
-    await super.test_const_annotation_notConstConstructor();
-  }
-
-  @failingTest
-  @potentialAnalyzerProblem
-  @override
   test_const_annotation_withArgs() async {
     await super.test_const_annotation_withArgs();
   }
@@ -77,6 +68,13 @@
     await super.test_const_externalConstFactory();
   }
 
+  @override
+  @failingTest
+  test_const_implicitCreation() {
+    // Bad state: No data for () at 69
+    return super.test_const_implicitCreation();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31555')
   @override
@@ -192,6 +190,23 @@
     await super.test_getResult_nameConflict_local_typeInference();
   }
 
+  @override
+  @failingTest
+  test_missingDartLibrary_async() {
+    // Crash when compiling package:test/test.dart, at character offset null:
+    // Class 'FutureOr' not found in library 'dart:async'
+    return super.test_missingDartLibrary_async();
+  }
+
+  @override
+  @failingTest
+  test_missingDartLibrary_core() {
+    // Crash when compiling package:test/test.dart, at character offset null:
+    // file:///sdk/lib/core/core.dart:1: Internal problem: Couldn't find
+    // 'Object' in 'file:///sdk/lib/core/core.dart'.
+    return super.test_missingDartLibrary_core();
+  }
+
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
   @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 66a1bb0..2422f69 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
@@ -8,9 +8,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(AnalysisDriverResolutionTest_Kernel);
+    defineReflectiveTests(AnalysisDriverResolutionTest_Kernel);
   });
 }
 
@@ -25,10 +23,84 @@
 
   @override
   @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classConstructor() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classConstructor();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classConstructorNamed() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classConstructorNamed();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_classField() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_classField();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_annotation_prefixed_topLevelVariable() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_annotation_prefixed_topLevelVariable();
+  }
+
+  @override
+  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31605')
   test_constructor_redirected_generic() async {
     await super.test_constructor_redirected_generic();
   }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_functionExpressionInvocation() {
+    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
+    return super.test_functionExpressionInvocation();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_instanceCreation_prefixed() {
+    // TODO(paulberry): broken because prefixes are not working properly
+    return super.test_instanceCreation_prefixed();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_isExpression_not() {
+    // TODO(paulberry): I suspect that the special case for is! has bit rotted
+    return super.test_isExpression_not();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_local_function_generic() {
+    // TODO(paulberry): I suspect this is broken due to the function type's
+    // generic parameters not being properly associated with the generic
+    // parameters from the kernel representation.
+    return super.test_local_function_generic();
+  }
+
+  @override
+  @failingTest
+  @potentialAnalyzerProblem
+  test_type_functionTypeAlias() {
+    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
+    return super.test_type_functionTypeAlias();
+  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
diff --git a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart b/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
deleted file mode 100644
index 1b1a23b..0000000
--- a/pkg/analyzer/test/src/fasta/resolution_applier_test.dart
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/fasta/resolution_applier.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:kernel/kernel.dart' as kernel;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../generated/parser_fasta_test.dart';
-import '../../generated/resolver_test_case.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ResolutionApplierTest);
-  });
-}
-
-@reflectiveTest
-class ResolutionApplierTest extends FastaParserTestCase {
-  /// The type provider used to access the types passed to the resolution
-  /// applier.
-  TestTypeProvider typeProvider;
-
-  /// 1. Generate an AST structure from the given [content]. The AST is expected
-  ///    to have a top-level function declaration as the first element.
-  /// 2. Use a [ResolutionApplier] to apply the [declaredElements],
-  ///    [referencedElements], and [types] to the body of the function.
-  /// 3. Verify that everything in the function body that should be resolved
-  ///    _is_ resolved.
-  void applyTypes(String content, List<Element> declaredElements,
-      List<Element> referencedElements, List<DartType> types) {
-    CompilationUnit unit = parseCompilationUnit(content);
-    expect(unit, isNotNull);
-    expect(unit.declarations, hasLength(1));
-    FunctionDeclaration function = unit.declarations[0];
-    FunctionBody body = function.functionExpression.body;
-    ResolutionApplier applier = new ResolutionApplier(
-        null,
-        new _TestTypeContext(),
-        declaredElements,
-        referencedElements,
-        types.map((type) => new _KernelWrapperOfType(type)).toList());
-
-    body.accept(applier);
-    applier.checkDone();
-
-    ResolutionVerifier verifier = new ResolutionVerifier();
-    // TODO(brianwilkerson) Uncomment the line below when the tests no longer
-    // fail.
-//    body.accept(verifier);
-    verifier.assertResolved();
-  }
-
-  void setUp() {
-    typeProvider = new TestTypeProvider();
-  }
-
-  void test_binaryExpression() {
-    applyTypes(r'''
-f(String s, int i) {
-  return s + i;
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('+', -1),
-      _createFunctionParameter('i', 16),
-    ], <DartType>[
-      typeProvider.stringType,
-      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
-      new FunctionTypeImpl(new FunctionElementImpl('+', -1)),
-      new TypeArgumentsDartType([]),
-      typeProvider.intType,
-      typeProvider.stringType,
-    ]);
-  }
-
-  void test_functionExpressionInvocation() {
-    applyTypes(r'''
-f(Object a) {
-  return a.b().c();
-}
-''', [], [
-      _createFunctionParameter('a', 9),
-      new MethodElementImpl('b', -1),
-      new MethodElementImpl('c', -1)
-    ], <DartType>[
-      typeProvider.objectType,
-      typeProvider.objectType,
-      typeProvider.objectType,
-      new TypeArgumentsDartType([]),
-      typeProvider.objectType,
-      typeProvider.objectType,
-      typeProvider.objectType,
-      new TypeArgumentsDartType([]),
-      typeProvider.objectType
-    ]);
-  }
-
-  void test_genericFunctionType() {
-    GenericFunctionTypeElementImpl element =
-        new GenericFunctionTypeElementImpl.forOffset(8);
-    element.enclosingElement = new FunctionElementImpl('f', 0);
-    element.typeParameters = <TypeParameterElement>[];
-    element.returnType = typeProvider.intType;
-    element.parameters = [
-      _createFunctionParameter('', -1, type: typeProvider.stringType),
-      _createFunctionParameter('x', 34, type: typeProvider.boolType),
-    ];
-    FunctionTypeImpl functionType = new FunctionTypeImpl(element);
-    element.type = functionType;
-    applyTypes(r'''
-f() {
-  int Function(String, bool x) foo;
-}
-''', [new LocalVariableElementImpl('foo', 37)], [], <DartType>[functionType]);
-  }
-
-  void test_listLiteral_const_noAnnotation() {
-    applyTypes(r'''
-get f => const ['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_const_typeAnnotation() {
-    applyTypes(r'''
-get f => const <String>['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_noAnnotation() {
-    applyTypes(r'''
-get f => ['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_listLiteral_typeAnnotation() {
-    applyTypes(r'''
-get f => <String>['a', 'b', 'c'];
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-  }
-
-  void test_localVariable() {
-    InterfaceType mapType = typeProvider.mapType.instantiate([
-      typeProvider.stringType,
-      typeProvider.listType.instantiate([typeProvider.stringType])
-    ]);
-    applyTypes(r'''
-f() {
-  Map<String, List<String>> m = {};
-}
-''', [new LocalVariableElementImpl('m', 34)], [], <DartType>[mapType, mapType]);
-  }
-
-  void test_mapLiteral_const_noAnnotation() {
-    applyTypes(r'''
-get f => const {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_const_typeAnnotation() {
-    applyTypes(r'''
-get f => const <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_noAnnotation() {
-    applyTypes(r'''
-get f => {'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_mapLiteral_typeAnnotation() {
-    applyTypes(r'''
-get f => <String, int>{'a' : 1, 'b' : 2, 'c' : 3};
-''', [], [], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.intType,
-      typeProvider.mapType
-          .instantiate([typeProvider.stringType, typeProvider.intType])
-    ]);
-  }
-
-  void test_methodInvocation_getter() {
-    applyTypes(r'''
-f(String s) {
-  return s.length;
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('length', -1)
-    ], <DartType>[
-      typeProvider.stringType,
-      typeProvider.intType,
-    ]);
-  }
-
-  void test_methodInvocation_method() {
-    var substringType =
-        new FunctionTypeImpl(new FunctionElementImpl('substring', -1));
-    applyTypes(r'''
-f(String s) {
-  return s.substring(3, 7);
-}
-''', [], [
-      _createFunctionParameter('s', 9),
-      new MethodElementImpl('length', -1)
-    ], <DartType>[
-      typeProvider.stringType,
-      substringType,
-      substringType,
-      new TypeArgumentsDartType([]),
-      typeProvider.intType,
-      typeProvider.stringType,
-      typeProvider.stringType
-    ]);
-  }
-
-  @failingTest
-  void test_typeAlias() {
-    TypeParameterElement B = _createTypeParameter('B', 42);
-    TypeParameterElement C = _createTypeParameter('C', 45);
-    GenericTypeAliasElementImpl element =
-        new GenericTypeAliasElementImpl('A', 40);
-    element.typeParameters = <TypeParameterElement>[B, C];
-    GenericFunctionTypeElementImpl functionElement =
-        element.function = new GenericFunctionTypeElementImpl.forOffset(-1);
-    functionElement.typeParameters = <TypeParameterElement>[];
-    functionElement.returnType = B.type;
-    functionElement.parameters = [
-      _createFunctionParameter('x', 48, type: C.type),
-    ];
-    FunctionTypeImpl functionType = new FunctionTypeImpl.forTypedef(element);
-    applyTypes(r'''
-f() {
-  A<int, String> foo;
-}
-//typedef B A<B, C>(C x);
-''', [new LocalVariableElementImpl('foo', 23)], [], <DartType>[functionType]);
-  }
-
-  /// Return a newly created parameter element with the given [name] and
-  /// [offset].
-  ParameterElement _createFunctionParameter(String name, int offset,
-      {DartType type}) {
-    ParameterElementImpl parameter = new ParameterElementImpl(name, offset);
-    parameter.type = type;
-    parameter.parameterKind = ParameterKind.REQUIRED;
-    return parameter;
-  }
-
-  /// Return a newly created type parameter element with the given [name] and
-  /// [offset].
-  TypeParameterElement _createTypeParameter(String name, int offset) {
-    TypeParameterElementImpl typeParameter =
-        new TypeParameterElementImpl(name, offset);
-    TypeParameterTypeImpl typeParameterType =
-        new TypeParameterTypeImpl(typeParameter);
-    typeParameter.type = typeParameterType;
-    return typeParameter;
-  }
-}
-
-/// Kernel wrapper around the Analyzer [type].
-class _KernelWrapperOfType implements kernel.DartType {
-  final DartType type;
-
-  _KernelWrapperOfType(this.type);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-/// Test implementation of [TypeContext].
-class _TestTypeContext implements TypeContext {
-  @override
-  ClassElement get enclosingClassElement => null;
-
-  @override
-  DartType get stringType => null;
-
-  @override
-  DartType get typeType => null;
-
-  @override
-  void encloseVariable(ElementImpl element) {}
-
-  @override
-  void enterLocalFunction(FunctionElementImpl element) {}
-
-  @override
-  void exitLocalFunction(FunctionElementImpl element) {}
-
-  @override
-  DartType translateType(kernel.DartType kernelType) {
-    return (kernelType as _KernelWrapperOfType).type;
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index 675b470..37ccad1 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -7,7 +7,6 @@
 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_applier_test.dart' as resolution_applier;
 import 'resolution_test.dart' as resolution;
 
 main() {
@@ -15,7 +14,6 @@
     ast_builder.main();
     message_coverage.main();
     recovery.main();
-    resolution_applier.main();
     resolution.main();
   }, name: 'fasta');
 }
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index d33adca..606e0c3 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -28,19 +28,14 @@
     defineReflectiveTests(BuildModeTest);
     defineReflectiveTests(ExitCodesTest);
     defineReflectiveTests(ExitCodesTest_PreviewDart2);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(ExitCodesTest_UseCFE);
+    defineReflectiveTests(ExitCodesTest_UseCFE);
     defineReflectiveTests(LinterTest);
     defineReflectiveTests(LinterTest_PreviewDart2);
-    // Disabled until integration with the CFE has been restarted.
-//    defineReflectiveTests(LinterTest_UseCFE);
+    defineReflectiveTests(LinterTest_UseCFE);
     defineReflectiveTests(NonDartFilesTest);
     defineReflectiveTests(OptionsTest);
     defineReflectiveTests(OptionsTest_PreviewDart2);
-    // TODO(scheglov): Restore similar test coverage when the front-end API
-    // allows it.  See https://github.com/dart-lang/sdk/issues/32258.
-    // defineReflectiveTests(OptionsTest_UseCFE);
+    defineReflectiveTests(OptionsTest_UseCFE);
   }, name: 'Driver');
 }
 
@@ -680,6 +675,12 @@
 
   @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');
@@ -687,11 +688,51 @@
 
   @override
   @failingTest
-  test_fatalWarnings() => super.test_fatalWarnings();
+  test_fatalHints() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_notFatalWarnings() => super.test_notFatalWarnings();
+  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');
+  }
 }
 
 @reflectiveTest
@@ -800,6 +841,48 @@
 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
@@ -1016,42 +1099,75 @@
 
   @override
   @failingTest
-  test_analysisOptions_excludes() => super.test_analysisOptions_excludes();
+  test_analysisOptions_excludes() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() =>
-      super.test_analysisOptions_excludesRelativeToAnalysisOptions_explicit();
+  test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() =>
-      super.test_analysisOptions_excludesRelativeToAnalysisOptions_inferred();
+  test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_filters() => super.test_basic_filters();
+  test_analyzeFilesInDifferentContexts() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_language() => super.test_basic_language();
+  test_basic_filters() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_basic_strongMode() => super.test_basic_strongMode();
+  test_basic_language() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_includeDirective() => super.test_includeDirective();
+  test_basic_strongMode() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_previewDart2() => super.test_previewDart2();
+  test_includeDirective() {
+    fail('Test times out');
+  }
 
   @override
   @failingTest
-  test_withFlags_overrideFatalWarning() =>
-      super.test_withFlags_overrideFatalWarning();
+  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');
+  }
 }
 
 class TestSource implements Source {
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 ea59771..21a6356 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1124,6 +1124,9 @@
     Object send = pop();
     if (send is IncompleteSendGenerator) {
       Object receiver = optional(".", token) ? pop() : popForValue();
+      if (receiver is TypeUseGenerator<dynamic, dynamic, dynamic>) {
+        _typeInferrer.storeTypeUse(receiver);
+      }
       push(send.withReceiver(receiver, token.charOffset));
     } else {
       pop();
@@ -1514,6 +1517,7 @@
             "You might try moving the constant to the deferred library, "
             "or removing 'deferred' from the import.");
       }
+      _typeInferrer.storePrefix(token, declaration);
       return declaration;
     } else if (declaration is LoadLibraryBuilder) {
       return new LoadLibraryGenerator<Expression, Statement, Arguments>(
@@ -2853,6 +2857,7 @@
 
     if (type is TypeUseGenerator<Expression, Statement, Arguments>) {
       TypeUseGenerator<Expression, Statement, Arguments> generator = type;
+      _typeInferrer.storeTypeUse(generator);
       if (generator.prefix != null) {
         nameToken = nameToken.next.next;
       }
@@ -3728,6 +3733,7 @@
     KernelTypeVariableBuilder variable;
     Object inScope = scopeLookup(scope, name.name, token);
     if (inScope is TypeUseGenerator<Expression, Statement, Arguments>) {
+      _typeInferrer.storeTypeUse(inScope);
       variable = inScope.declaration;
     } else {
       // Something went wrong when pre-parsing the type variables.
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 5b8bd85..24aedf5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -603,6 +603,10 @@
 
   TypeDeclarationBuilder get declaration;
 
+  /// The offset at which the [declaration] is referenced by this generator,
+  /// or `-1` if the reference is implicit.
+  int get declarationReferenceOffset;
+
   @override
   String get debugName => "TypeUseGenerator";
 
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 faf8d87..55627d5 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
@@ -1241,6 +1241,7 @@
 
   /// The offset at which the [declaration] is referenced by this generator,
   /// or `-1` if the reference is implicit.
+  @override
   final int declarationReferenceOffset;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index c74aa4b..519886d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -5,7 +5,7 @@
 library fasta.kernel_field_builder;
 
 import 'package:kernel/ast.dart'
-    show DartType, Expression, Field, Name, NullLiteral;
+    show DartType, Expression, Field, Name, Node, NullLiteral;
 
 import '../../base/instrumentation.dart'
     show Instrumentation, InstrumentationValueForType;
@@ -16,6 +16,9 @@
 
 import '../problems.dart' show internalProblem;
 
+import '../type_inference/type_inference_listener.dart'
+    show TypeInferenceListener;
+
 import 'kernel_body_builder.dart' show KernelBodyBuilder;
 
 import 'kernel_builder.dart'
@@ -87,8 +90,10 @@
   @override
   void prepareTopLevelInference() {
     if (!isEligibleForInference) return;
+    var listener = new TypeInferenceListener<int, int, Node, int>();
     var typeInferrer = library.loader.typeInferenceEngine
-        .createTopLevelTypeInferrer(field.enclosingClass?.thisType, field);
+        .createTopLevelTypeInferrer(
+            listener, field.enclosingClass?.thisType, field);
     if (hasInitializer) {
       initializer = new KernelBodyBuilder.forField(this, typeInferrer)
           .parseFieldInitializer(initializerTokenForInference);
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 de59e1c..52f89f1 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
@@ -61,6 +61,9 @@
 import '../type_inference/type_inferrer.dart'
     show TypeInferrer, TypeInferrerDisabled, TypeInferrerImpl;
 
+import '../type_inference/type_inference_listener.dart'
+    show TypeInferenceListener;
+
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromoterImpl, TypePromotionFact, TypePromotionScope;
 
@@ -165,8 +168,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.asExpressionEnter(fileOffset, typeContext);
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
     inferredType = type;
+    inferrer.listener.asExpressionExit(fileOffset, inferredType);
     return inferredType;
   }
 }
@@ -182,7 +187,9 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.assertInitializerEnter(fileOffset);
     inferrer.inferStatement(factory, judgment);
+    inferrer.listener.assertInitializerExit(fileOffset);
   }
 }
 
@@ -204,6 +211,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.assertStatementEnter(fileOffset);
     var conditionJudgment = this.conditionJudgment;
     var messageJudgment = this.messageJudgment;
     var expectedType = inferrer.coreTypes.boolClass.rawType;
@@ -215,6 +223,7 @@
       inferrer.inferExpression(
           factory, messageJudgment, const UnknownType(), false);
     }
+    inferrer.listener.assertStatementExit(fileOffset);
   }
 }
 
@@ -231,6 +240,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.awaitExpressionEnter(fileOffset, typeContext);
     if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
       typeContext = inferrer.wrapFutureOrType(typeContext);
     }
@@ -238,6 +248,7 @@
     inferrer.inferExpression(factory, judgment, typeContext, true);
     inferredType =
         inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
+    inferrer.listener.awaitExpressionExit(fileOffset, inferredType);
     return inferredType;
   }
 }
@@ -252,9 +263,11 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.blockEnter(fileOffset);
     for (var judgment in judgments) {
       inferrer.inferStatement(factory, judgment);
     }
+    inferrer.listener.blockExit(fileOffset);
   }
 }
 
@@ -269,7 +282,9 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.boolLiteralEnter(fileOffset, typeContext);
     inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferrer.listener.boolLiteralExit(fileOffset, inferredType);
     return inferredType;
   }
 }
@@ -294,7 +309,9 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.breakStatementEnter(fileOffset);
     // No inference needs to be done.
+    inferrer.listener.breakStatementExit(fileOffset);
   }
 }
 
@@ -358,6 +375,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.cascadeExpressionEnter(fileOffset, typeContext);
     var lhsType = inferrer.inferExpression(
         factory, variable.initializer, typeContext, true);
     if (inferrer.strongMode) {
@@ -370,6 +388,7 @@
       if (section.body is! Let) break;
       section = section.body;
     }
+    inferrer.listener.cascadeExpressionExit(fileOffset, lhsType);
     return lhsType;
   }
 }
@@ -647,6 +666,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.conditionalExpressionEnter(fileOffset, typeContext);
     var conditionJudgment = this.conditionJudgment;
     var thenJudgment = this.thenJudgment;
     var otherwiseJudgment = this.otherwiseJudgment;
@@ -665,6 +685,7 @@
     if (inferrer.strongMode) {
       staticType = inferredType;
     }
+    inferrer.listener.conditionalExpressionExit(fileOffset, inferredType);
     return inferredType;
   }
 }
@@ -702,6 +723,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.constructorInvocationEnter(fileOffset, typeContext);
     var library = inferrer.engine.beingInferred[target];
     if (library != null) {
       // There is a cyclic dependency where inferring the types of the
@@ -749,6 +771,8 @@
           fileOffset,
           noLength);
     }
+    inferrer.listener
+        .constructorInvocationExit(fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
@@ -797,7 +821,9 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.continueSwitchStatementEnter(fileOffset);
     // No inference needs to be done.
+    inferrer.listener.continueSwitchStatementExit(fileOffset);
   }
 }
 
@@ -813,9 +839,13 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.deferredCheckEnter(fileOffset, 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.
-    return inferrer.inferExpression(factory, body, typeContext, true);
+    var inferredType =
+        inferrer.inferExpression(factory, body, typeContext, true);
+    inferrer.listener.deferredCheckExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -831,6 +861,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.doStatementEnter(fileOffset);
     var conditionJudgment = this.conditionJudgment;
     inferrer.inferStatement(factory, bodyJudgment);
     var boolType = inferrer.coreTypes.boolClass.rawType;
@@ -838,6 +869,7 @@
         factory, conditionJudgment, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, conditionJudgment.inferredType,
         condition, condition.fileOffset);
+    inferrer.listener.doStatementExit(fileOffset);
   }
 }
 
@@ -852,7 +884,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType = inferrer.coreTypes.doubleClass.rawType;
+    inferrer.listener.doubleLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.doubleClass.rawType;
+    inferrer.listener.doubleLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -889,7 +924,9 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.expressionStatementEnter(fileOffset);
     inferrer.inferExpression(factory, expression, const UnknownType(), false);
+    inferrer.listener.expressionStatementExit(fileOffset);
   }
 }
 
@@ -927,6 +964,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.constructorInvocationEnter(fileOffset, typeContext);
     var inferredType = inferrer.inferInvocation(
         factory,
         typeContext,
@@ -934,6 +972,8 @@
         _initialTarget.function.functionType,
         computeConstructorReturnType(_initialTarget),
         arguments);
+    inferrer.listener
+        .constructorInvocationExit(fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
@@ -1010,9 +1050,11 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.fieldInitializerEnter(fileOffset, field);
     var initializerType =
         inferrer.inferExpression(factory, value, field.type, true);
     inferrer.ensureAssignable(field.type, initializerType, value, fileOffset);
+    inferrer.listener.fieldInitializerExit(fileOffset);
   }
 }
 
@@ -1039,6 +1081,7 @@
     bool typeChecksNeeded = !inferrer.isTopLevel;
     ShadowVariableDeclaration variable;
     var syntheticAssignment = _syntheticAssignment;
+    kernel.Expression syntheticWrite;
     DartType syntheticWriteType;
     if (_declaresVariable) {
       variable = this.variable;
@@ -1049,12 +1092,45 @@
         context = variable.type;
       }
     } else if (syntheticAssignment is ShadowComplexAssignment) {
+      syntheticWrite = syntheticAssignment.write;
       syntheticWriteType =
           context = syntheticAssignment._getWriteType(inferrer);
     } else {
       context = const UnknownType();
     }
     context = inferrer.wrapType(context, iterableClass);
+    if (syntheticWrite is VariableSet) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset,
+          variable?.fileOffset,
+          syntheticWrite.fileOffset,
+          syntheticWrite.variable.type,
+          syntheticWrite.variable.fileOffset,
+          null);
+    } else if (syntheticWrite is PropertySet) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset,
+          variable?.fileOffset,
+          syntheticWrite.fileOffset,
+          syntheticWrite.interfaceTarget?.setterType,
+          null,
+          syntheticWrite.interfaceTarget);
+    } else if (syntheticWrite is StaticSet) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset,
+          variable?.fileOffset,
+          syntheticWrite.fileOffset,
+          syntheticWrite.target.setterType,
+          null,
+          syntheticWrite.target);
+    } else if (syntheticWrite == null ||
+        syntheticWrite is ShadowSyntheticExpression) {
+      inferrer.listener.forInStatementEnter(
+          fileOffset, variable?.fileOffset, null, null, null, null);
+    } else {
+      throw new UnimplementedError(
+          '(${syntheticWrite.runtimeType}) $syntheticWrite');
+    }
     var inferredExpressionType = inferrer.resolveTypeParameter(
         inferrer.inferExpression(
             factory, iterable, context, typeNeeded || typeChecksNeeded));
@@ -1110,6 +1186,8 @@
       }
       syntheticAssignment._replaceWithDesugared();
     }
+    inferrer.listener
+        .forInStatementExit(fileOffset, variable != null, variable?.type);
   }
 }
 
@@ -1123,6 +1201,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.forStatementEnter(fileOffset);
     for (var variable in variables) {
       inferrer.inferStatement(factory, variable);
     }
@@ -1137,6 +1216,7 @@
       inferrer.inferExpression(factory, update, const UnknownType(), false);
     }
     inferrer.inferStatement(factory, body);
+    inferrer.listener.forStatementExit(fileOffset);
   }
 }
 
@@ -1153,6 +1233,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.functionDeclarationEnter(fileOffset);
     inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
     inferrer.inferLocalFunction(
         factory,
@@ -1162,7 +1243,8 @@
         _hasImplicitReturnType
             ? (inferrer.strongMode ? null : const DynamicType())
             : function.returnType);
-    variable.type = function.functionType;
+    var inferredType = variable.type = function.functionType;
+    inferrer.listener.functionDeclarationExit(fileOffset, inferredType);
   }
 
   static void setHasImplicitReturnType(
@@ -1183,8 +1265,11 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferrer.inferLocalFunction(
+    inferrer.listener.functionExpressionEnter(fileOffset, typeContext);
+    var inferredType = inferrer.inferLocalFunction(
         factory, function, typeContext, fileOffset, null);
+    inferrer.listener.functionExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1214,12 +1299,14 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.ifNullEnter(fileOffset, typeContext);
     // To infer `e0 ?? e1` in context K:
     // - Infer e0 in context K to get T0
     var lhsType = inferrer.inferExpression(factory, _lhs, typeContext, true);
     if (inferrer.strongMode) {
       variable.type = lhsType;
     }
+    inferrer.listener.ifNullBeforeRhs(fileOffset);
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
     bool useLub = _forceLub || typeContext is UnknownType;
@@ -1235,6 +1322,7 @@
     if (inferrer.strongMode) {
       body.staticType = inferredType;
     }
+    inferrer.listener.ifNullExit(fileOffset, inferredType);
     return inferredType;
   }
 }
@@ -1248,6 +1336,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.ifStatementEnter(fileOffset);
     var expectedType = inferrer.coreTypes.boolClass.rawType;
     var conditionType = inferrer.inferExpression(
         factory, condition, expectedType, !inferrer.isTopLevel);
@@ -1255,6 +1344,7 @@
         expectedType, conditionType, condition, condition.fileOffset);
     inferrer.inferStatement(factory, then);
     if (otherwise != null) inferrer.inferStatement(factory, otherwise);
+    inferrer.listener.ifStatementExit(fileOffset);
   }
 }
 
@@ -1315,7 +1405,9 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.indexAssignEnter(desugared.fileOffset, typeContext);
     var receiverType = _inferReceiver(inferrer, factory);
+    inferrer.listener.indexAssignAfterReceiver(write.fileOffset, typeContext);
     var writeMember = inferrer.findMethodInvocationMember(receiverType, write);
     // To replicate analyzer behavior, we base type inference on the write
     // member.  TODO(paulberry): would it be better to use the read member
@@ -1369,6 +1461,8 @@
       _storeLetType(inferrer, replacedRead, readType);
     }
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
+    inferrer.listener.indexAssignExit(write.fileOffset, writeMember,
+        inferredResult.combiner, inferredResult.type);
     _replaceWithDesugared();
     return inferredResult.type;
   }
@@ -1395,7 +1489,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType = inferrer.coreTypes.intClass.rawType;
+    inferrer.listener.intLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.intClass.rawType;
+    inferrer.listener.intLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1408,8 +1505,10 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.invalidInitializerEnter(fileOffset);
     inferrer.inferExpression(
         factory, variable.initializer, const UnknownType(), false);
+    inferrer.listener.invalidInitializerExit(fileOffset);
   }
 }
 
@@ -1426,8 +1525,11 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.isExpressionEnter(fileOffset, typeContext);
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
-    return inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferrer.listener.isExpressionExit(fileOffset, type, inferredType);
+    return inferredType;
   }
 }
 
@@ -1448,8 +1550,14 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    IsExpression isExpression = this.operand;
+
+    inferrer.listener.isNotExpressionEnter(fileOffset, typeContext);
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
-    return inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferredType = inferrer.coreTypes.boolClass.rawType;
+    inferrer.listener
+        .isNotExpressionExit(fileOffset, isExpression.type, inferredType);
+    return inferredType;
   }
 }
 
@@ -1464,7 +1572,9 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.labeledStatementEnter(fileOffset);
     inferrer.inferStatement(factory, judgment);
+    inferrer.listener.labeledStatementExit(fileOffset);
   }
 }
 
@@ -1486,6 +1596,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.listLiteralEnter(fileOffset, typeContext);
     var listClass = inferrer.coreTypes.listClass;
     var listType = listClass.thisType;
     List<DartType> inferredTypes;
@@ -1536,7 +1647,9 @@
             expressions[i].fileOffset);
       }
     }
-    return new InterfaceType(listClass, [inferredTypeArgument]);
+    var inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
+    inferrer.listener.listLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1553,14 +1666,18 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.logicalExpressionEnter(fileOffset, typeContext);
     var boolType = inferrer.coreTypes.boolClass.rawType;
     var leftType =
         inferrer.inferExpression(factory, left, boolType, !inferrer.isTopLevel);
+    inferrer.listener.logicalExpressionBeforeRhs(fileOffset);
     var rightType = inferrer.inferExpression(
         factory, right, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, leftType, left, left.fileOffset);
     inferrer.ensureAssignable(boolType, rightType, right, right.fileOffset);
-    return boolType;
+    var inferredType = boolType;
+    inferrer.listener.logicalExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1600,6 +1717,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.mapLiteralEnter(fileOffset, typeContext);
     var mapClass = inferrer.coreTypes.mapClass;
     var mapType = mapClass.thisType;
     List<DartType> inferredTypes;
@@ -1668,7 +1786,10 @@
             valueType, actualTypes[2 * i + 1], value, value.fileOffset);
       }
     }
-    return new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
+    var inferredType =
+        new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
+    inferrer.listener.mapLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1738,9 +1859,11 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.namedFunctionExpressionEnter(fileOffset, typeContext);
     var inferredType = inferrer.inferExpression(
         factory, variable.initializer, typeContext, true);
     if (inferrer.strongMode) variable.type = inferredType;
+    inferrer.listener.namedFunctionExpressionExit(fileOffset, inferredType);
     return inferredType;
   }
 }
@@ -1756,12 +1879,15 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.notEnter(fileOffset, typeContext);
     // 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);
-    return boolType;
+    DartType inferredType = boolType;
+    inferrer.listener.notExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -1842,7 +1968,11 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType = inferrer.coreTypes.nullClass.rawType;
+    inferrer.listener.nullLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.nullClass.rawType;
+    inferrer.listener
+        .nullLiteralExit(fileOffset, fileOffset == -1, inferredType);
+    return inferredType;
   }
 }
 
@@ -1914,6 +2044,7 @@
       DartType typeContext) {
     var receiverType = _inferReceiver(inferrer, factory);
 
+    inferrer.listener.propertyAssignEnter(write.fileOffset, typeContext);
     DartType readType;
     if (read != null) {
       var readMember =
@@ -1933,6 +2064,12 @@
     var writeContext = inferrer.getSetterType(writeMember, receiverType);
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
     if (inferrer.strongMode) nullAwareGuard?.staticType = inferredResult.type;
+    inferrer.listener.propertyAssignExit(
+        write.fileOffset,
+        inferrer.getRealTarget(writeMember),
+        writeContext,
+        inferredResult.combiner,
+        inferredResult.type);
     _replaceWithDesugared();
     return inferredResult.type;
   }
@@ -1973,6 +2110,7 @@
   @override
   infer<Expression, Statement, Initializer, Type>(ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.redirectingInitializerEnter(fileOffset, target);
     List<TypeParameter> classTypeParameters =
         target.enclosingClass.typeParameters;
     List<DartType> typeArguments =
@@ -1985,6 +2123,7 @@
         target.function.functionType, target.enclosingClass.thisType, arguments,
         skipTypeArgumentInference: true);
     ArgumentsJudgment.removeNonInferrableArgumentTypes(arguments);
+    inferrer.listener.redirectingInitializerExit(fileOffset);
   }
 }
 
@@ -1997,7 +2136,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return const BottomType();
+    inferrer.listener.rethrowEnter(fileOffset, typeContext);
+    var inferredType = const BottomType();
+    inferrer.listener.rethrowExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2011,6 +2153,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.returnStatementEnter(fileOffset);
     var judgment = this.judgment;
     var closureContext = inferrer.closureContext;
     var typeContext = !closureContext.isGenerator
@@ -2030,6 +2173,7 @@
       closureContext.handleReturn(
           inferrer, inferredType, expression, fileOffset);
     }
+    inferrer.listener.returnStatementExit(fileOffset);
   }
 }
 
@@ -2058,6 +2202,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.staticAssignEnter(this.write?.fileOffset, typeContext);
     DartType readType = const DynamicType(); // Only used in error recovery
     var read = this.read;
     if (read is StaticGet) {
@@ -2076,6 +2221,8 @@
       }
     }
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
+    inferrer.listener.staticAssignExit(write?.fileOffset, writeMember,
+        writeContext, inferredResult.combiner, inferredResult.type);
     _replaceWithDesugared();
     return inferredResult.type;
   }
@@ -2093,6 +2240,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.staticGetEnter(fileOffset, typeContext);
     var target = this.target;
     if (target is ShadowField && target.inferenceNode != null) {
       target.inferenceNode.resolve();
@@ -2102,7 +2250,9 @@
     if (target is Procedure && target.kind == ProcedureKind.Method) {
       type = inferrer.instantiateTearOff(type, typeContext, this);
     }
-    return inferredType = type;
+    inferredType = type;
+    inferrer.listener.staticGetExit(fileOffset, target, inferredType);
+    return inferredType;
   }
 }
 
@@ -2120,9 +2270,19 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.staticInvocationEnter(
+        this.fileOffset, arguments.fileOffset, typeContext);
     var calleeType = target.function.functionType;
-    return inferrer.inferInvocation(factory, typeContext, fileOffset,
-        calleeType, calleeType.returnType, arguments);
+    var inferredType = inferrer.inferInvocation(factory, typeContext,
+        fileOffset, calleeType, calleeType.returnType, arguments);
+    inferrer.listener.staticInvocationExit(
+        fileOffset,
+        target,
+        arguments.types,
+        inferrer.lastCalleeType,
+        inferrer.lastInferredSubstitution,
+        inferredType);
+    return inferredType;
   }
 }
 
@@ -2138,13 +2298,16 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.stringConcatenationEnter(fileOffset, typeContext);
     if (!inferrer.isTopLevel) {
       for (kernel.Expression expression in expressions) {
         inferrer.inferExpression(
             factory, expression, const UnknownType(), false);
       }
     }
-    return inferrer.coreTypes.stringClass.rawType;
+    var inferredType = inferrer.coreTypes.stringClass.rawType;
+    inferrer.listener.stringConcatenationExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2159,7 +2322,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferrer.coreTypes.stringClass.rawType;
+    inferrer.listener.stringLiteralEnter(fileOffset, typeContext);
+    var inferredType = inferrer.coreTypes.stringClass.rawType;
+    inferrer.listener.stringLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2173,6 +2339,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.superInitializerEnter(fileOffset);
     var substitution = Substitution.fromSupertype(inferrer.classHierarchy
         .getClassAsInstanceOf(
             inferrer.thisType.classNode, target.enclosingClass));
@@ -2185,6 +2352,7 @@
         inferrer.thisType,
         arguments,
         skipTypeArgumentInference: true);
+    inferrer.listener.superInitializerExit(fileOffset);
   }
 }
 
@@ -2247,6 +2415,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.switchStatementEnter(fileOffset);
     var expressionType = inferrer.inferExpression(
         factory, expression, const UnknownType(), true);
     for (var switchCase in cases) {
@@ -2256,6 +2425,7 @@
       }
       inferrer.inferStatement(factory, switchCase.body);
     }
+    inferrer.listener.switchStatementExit(fileOffset);
   }
 }
 
@@ -2270,7 +2440,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferrer.coreTypes.symbolClass.rawType;
+    inferrer.listener.symbolLiteralEnter(fileOffset, typeContext);
+    var inferredType = inferrer.coreTypes.symbolClass.rawType;
+    inferrer.listener.symbolLiteralExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2350,7 +2523,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType = inferrer.thisType ?? const DynamicType();
+    inferrer.listener.thisExpressionEnter(fileOffset, typeContext);
+    inferredType = inferrer.thisType ?? const DynamicType();
+    inferrer.listener.thisExpressionExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2366,8 +2542,11 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.throwEnter(fileOffset, typeContext);
     inferrer.inferExpression(factory, judgment, const UnknownType(), false);
-    return inferredType = const BottomType();
+    inferredType = const BottomType();
+    inferrer.listener.throwExit(fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2379,10 +2558,20 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.tryCatchEnter(fileOffset);
     inferrer.inferStatement(factory, body);
     for (var catch_ in catches) {
+      inferrer.listener.catchStatementEnter(
+          catch_.fileOffset,
+          catch_.guard,
+          catch_.exception?.fileOffset,
+          catch_.exception?.type,
+          catch_.stackTrace?.fileOffset,
+          catch_.stackTrace?.type);
       inferrer.inferStatement(factory, catch_.body);
+      inferrer.listener.catchStatementExit(catch_.fileOffset);
     }
+    inferrer.listener.tryCatchExit(fileOffset);
   }
 }
 
@@ -2395,8 +2584,10 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.tryFinallyEnter(fileOffset);
     inferrer.inferStatement(factory, body);
     inferrer.inferStatement(factory, finalizer);
+    inferrer.listener.tryFinallyExit(fileOffset);
   }
 }
 
@@ -2412,15 +2603,21 @@
 
   @override
   ShadowTypeInferrer createLocalTypeInferrer(
-      Uri uri, InterfaceType thisType, SourceLibraryBuilder library) {
-    return new ShadowTypeInferrer._(this, uri, false, thisType, library);
+      Uri uri,
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      SourceLibraryBuilder library) {
+    return new ShadowTypeInferrer._(
+        this, uri, listener, false, thisType, library);
   }
 
   @override
   ShadowTypeInferrer createTopLevelTypeInferrer(
-      InterfaceType thisType, ShadowField field) {
-    return field._typeInferrer =
-        new ShadowTypeInferrer._(this, field.fileUri, true, thisType, null);
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      ShadowField field) {
+    return field._typeInferrer = new ShadowTypeInferrer._(
+        this, field.fileUri, listener, true, thisType, null);
   }
 
   @override
@@ -2435,10 +2632,15 @@
   @override
   final typePromoter;
 
-  ShadowTypeInferrer._(ShadowTypeInferenceEngine engine, Uri uri, bool topLevel,
-      InterfaceType thisType, SourceLibraryBuilder library)
+  ShadowTypeInferrer._(
+      ShadowTypeInferenceEngine engine,
+      Uri uri,
+      TypeInferenceListener<int, int, Node, int> listener,
+      bool topLevel,
+      InterfaceType thisType,
+      SourceLibraryBuilder library)
       : typePromoter = new ShadowTypePromoter(engine.typeSchemaEnvironment),
-        super(engine, uri, topLevel, thisType, library);
+        super(engine, uri, listener, topLevel, thisType, library);
 
   @override
   Expression getFieldInitializer(ShadowField field) {
@@ -2547,7 +2749,10 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    return inferredType = inferrer.coreTypes.typeClass.rawType;
+    inferrer.listener.typeLiteralEnter(fileOffset, typeContext);
+    inferredType = inferrer.coreTypes.typeClass.rawType;
+    inferrer.listener.typeLiteralExit(fileOffset, type, inferredType);
+    return inferredType;
   }
 }
 
@@ -2634,6 +2839,7 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
+    inferrer.listener.variableAssignEnter(this.write.fileOffset, typeContext);
     DartType readType;
     var read = this.read;
     if (read is VariableGet) {
@@ -2648,6 +2854,12 @@
       }
     }
     var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
+    inferrer.listener.variableAssignExit(
+        write.fileOffset,
+        writeContext,
+        write is VariableSet ? write.variable.fileOffset : null,
+        inferredResult.combiner,
+        inferredResult.type);
     _replaceWithDesugared();
     return inferredType = inferredResult.type;
   }
@@ -2700,6 +2912,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.variableDeclarationEnter(fileOffset);
     if (annotations.isNotEmpty) {
       inferrer.inferMetadataKeepingHelper(factory, annotations);
 
@@ -2744,6 +2957,8 @@
         initializer = replacedInitializer;
       }
     }
+    inferrer.listener.variableDeclarationExit(
+        fileOffset, type, _implicitlyTyped ? inferredType : type);
   }
 
   /// Determine whether the given [ShadowVariableDeclaration] had an implicit
@@ -2774,6 +2989,19 @@
   VariableGetJudgment(VariableDeclaration variable, this._fact, this._scope)
       : super(variable);
 
+  /// Return `true` if the given [variable] declaration occurs in a let
+  /// expression that is, or is part of, a cascade expression.
+  bool _isInCascade() {
+    TreeNode ancestor = variable.parent;
+    while (ancestor is Let) {
+      if (ancestor is ShadowCascadeExpression) {
+        return true;
+      }
+      ancestor = ancestor.parent;
+    }
+    return false;
+  }
+
   @override
   DartType infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
@@ -2783,6 +3011,7 @@
     bool mutatedInClosure = variable._mutatedInClosure;
     DartType declaredOrInferredType = variable.type;
 
+    inferrer.listener.variableGetEnter(fileOffset, typeContext);
     DartType promotedType = inferrer.typePromoter
         .computePromotedType(_fact, _scope, mutatedInClosure);
     if (promotedType != null) {
@@ -2794,7 +3023,10 @@
     if (variable._isLocalFunction) {
       type = inferrer.instantiateTearOff(type, typeContext, this);
     }
-    return inferredType = type;
+    inferredType = type;
+    inferrer.listener.variableGetExit(
+        fileOffset, _isInCascade(), variable.fileOffset, inferredType);
+    return inferredType;
   }
 }
 
@@ -2807,12 +3039,14 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.whileStatementEnter(fileOffset);
     var expectedType = inferrer.coreTypes.boolClass.rawType;
     var actualType = inferrer.inferExpression(
         factory, condition, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
         expectedType, actualType, condition, condition.fileOffset);
     inferrer.inferStatement(factory, body);
+    inferrer.listener.whileStatementExit(fileOffset);
   }
 }
 
@@ -2825,6 +3059,7 @@
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    inferrer.listener.yieldStatementEnter(fileOffset);
     var closureContext = inferrer.closureContext;
     DartType inferredType;
     if (closureContext.isGenerator) {
@@ -2844,6 +3079,7 @@
     }
     closureContext.handleYield(
         inferrer, isYieldStar, inferredType, expression, fileOffset);
+    inferrer.listener.yieldStatementExit(fileOffset);
   }
 }
 
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 ee2947e..516a6b6 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -14,6 +14,7 @@
         Library,
         LibraryDependency,
         LibraryPart,
+        Node,
         Typedef;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -40,6 +41,9 @@
 
 import '../type_inference/type_inference_engine.dart' show TypeInferenceEngine;
 
+import '../type_inference/type_inference_listener.dart'
+    show TypeInferenceListener;
+
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'stack_listener.dart' show NullValue, StackListener;
@@ -528,13 +532,16 @@
 
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope]) {
+      [Scope formalParameterScope,
+      TypeInferenceListener<int, int, Node, int> listener]) {
+    listener ??= new TypeInferenceListener<int, int, Node, int>();
     // Note: we set thisType regardless of whether we are building a static
     // member, since that provides better error recovery.
     InterfaceType thisType = currentClass?.target?.thisType;
     var typeInferrer = library.disableTypeInference
         ? typeInferenceEngine.createDisabledTypeInferrer()
-        : typeInferenceEngine.createLocalTypeInferrer(uri, thisType, library);
+        : typeInferenceEngine.createLocalTypeInferrer(
+            uri, listener, thisType, library);
     ConstantContext constantContext = builder.isConstructor && builder.isConst
         ? ConstantContext.inferred
         : ConstantContext.none;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index ae76979..8338668 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -10,6 +10,7 @@
         DynamicType,
         FunctionType,
         InterfaceType,
+        Node,
         TypeParameter,
         TypeParameterType,
         TypedefType,
@@ -29,6 +30,8 @@
 
 import '../source/source_library_builder.dart';
 
+import 'type_inference_listener.dart' show TypeInferenceListener;
+
 import 'type_inferrer.dart';
 
 import 'type_schema_environment.dart';
@@ -238,12 +241,17 @@
   /// Creates a type inferrer for use inside of a method body declared in a file
   /// with the given [uri].
   TypeInferrer createLocalTypeInferrer(
-      Uri uri, InterfaceType thisType, SourceLibraryBuilder library);
+      Uri uri,
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      SourceLibraryBuilder library);
 
   /// Creates a [TypeInferrer] object which is ready to perform type inference
   /// on the given [field].
   TypeInferrer createTopLevelTypeInferrer(
-      InterfaceType thisType, ShadowField field);
+      TypeInferenceListener<int, int, Node, int> listener,
+      InterfaceType thisType,
+      ShadowField field);
 
   /// Retrieve the [TypeInferrer] for the given [field], which was created by
   /// a previous call to [createTopLevelTypeInferrer].
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
new file mode 100644
index 0000000..28ea849
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -0,0 +1,481 @@
+// 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.md file.
+
+import 'package:kernel/ast.dart' show DartType, FunctionType;
+
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+/// Base class for [TypeInferenceListener] that defines the API for debugging.
+///
+/// By default no debug info is printed.  To enable debug printing, mix in
+/// [TypeInferenceDebugging].
+class TypeInferenceBase<Location> {
+  void genericExpressionEnter(
+      String expressionType, Location location, DartType typeContext) {}
+
+  void genericExpressionExit(
+      String expressionType, Location location, DartType inferredType) {}
+
+  void genericInitializerEnter(String initializerType, Location location) {}
+
+  void genericInitializerExit(String initializerType, Location location) {}
+
+  void genericStatementEnter(String statementType, Location location) {}
+
+  void genericStatementExit(String statementType, Location location) {}
+}
+
+/// Callback interface used by [TypeInferrer] to report the results of type
+/// inference to a client.
+///
+/// The interface is structured as a set of enter/exit methods.  The enter
+/// methods are called as the inferrer recurses down through the AST, and the
+/// exit methods are called on the way back up.  The enter methods take a
+/// [DartType] argument representing the downwards inference context; the exit
+/// methods take [DartType] argument representing the final inferred type.
+///
+/// The default implementation (in this base class) does nothing, however it can
+/// be used to debug type inference by uncommenting the
+/// "with TypeInferenceDebugging" clause below.
+class TypeInferenceListener<Location, Declaration, Reference, PrefixInfo>
+    extends TypeInferenceBase<Location> {
+  void asExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("asExpression", location, typeContext);
+
+  void asExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("asExpression", location, inferredType);
+
+  void assertInitializerEnter(Location location) =>
+      genericInitializerEnter("assertInitializer", location);
+
+  void assertInitializerExit(Location location) =>
+      genericInitializerExit("assertInitializer", location);
+
+  void assertStatementEnter(Location location) =>
+      genericStatementEnter('assertStatement', location);
+
+  void assertStatementExit(Location location) =>
+      genericStatementExit('assertStatement', location);
+
+  void awaitExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("awaitExpression", location, typeContext);
+
+  void awaitExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("awaitExpression", location, inferredType);
+
+  void blockEnter(Location location) =>
+      genericStatementEnter('block', location);
+
+  void blockExit(Location location) => genericStatementExit('block', location);
+
+  void boolLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("boolLiteral", location, typeContext);
+
+  void boolLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("boolLiteral", location, inferredType);
+
+  void breakStatementEnter(Location location) =>
+      genericStatementEnter('breakStatement', location);
+
+  void breakStatementExit(Location location) =>
+      genericStatementExit('breakStatement', location);
+
+  void cascadeExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("cascade", location, typeContext);
+
+  void cascadeExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("cascade", location, inferredType);
+
+  void catchStatementEnter(
+      Location location,
+      DartType guardType,
+      Location exceptionLocation,
+      DartType exceptionType,
+      Location stackTraceLocation,
+      DartType stackTraceType) {}
+
+  void catchStatementExit(Location location) {}
+
+  void conditionalExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("conditionalExpression", location, typeContext);
+
+  void conditionalExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("conditionalExpression", location, inferredType);
+
+  void constructorInvocationEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("constructorInvocation", location, typeContext);
+
+  void constructorInvocationExit(Location location, Reference expressionTarget,
+          DartType inferredType) =>
+      genericExpressionExit("constructorInvocation", location, inferredType);
+
+  void continueSwitchStatementEnter(Location location) =>
+      genericStatementEnter('continueSwitchStatement', location);
+
+  void continueSwitchStatementExit(Location location) =>
+      genericStatementExit('continueSwitchStatement', location);
+
+  void deferredCheckEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("deferredCheck", location, typeContext);
+
+  void deferredCheckExit(Location location, DartType inferredType) =>
+      genericExpressionExit("deferredCheck", location, inferredType);
+
+  void doStatementEnter(Location location) =>
+      genericStatementEnter("doStatement", location);
+
+  void doStatementExit(Location location) =>
+      genericStatementExit("doStatement", location);
+
+  void doubleLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("doubleLiteral", location, typeContext);
+
+  void doubleLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("doubleLiteral", location, inferredType);
+
+  void dryRunEnter(Location location) =>
+      genericExpressionEnter("dryRun", location, null);
+
+  void dryRunExit(Location location) =>
+      genericExpressionExit("dryRun", location, null);
+
+  void expressionStatementEnter(Location location) =>
+      genericStatementEnter('expressionStatement', location);
+
+  void expressionStatementExit(Location location) =>
+      genericStatementExit('expressionStatement', location);
+
+  void fieldInitializerEnter(Location location, Reference initializerField) =>
+      genericInitializerEnter("fieldInitializer", location);
+
+  void fieldInitializerExit(Location location) =>
+      genericInitializerExit("fieldInitializer", location);
+
+  void forInStatementEnter(
+          Location location,
+          Location variableLocation,
+          Location writeLocation,
+          DartType writeVariableType,
+          Declaration writeVariable,
+          Reference writeTarget) =>
+      genericStatementEnter('forInStatement', location);
+
+  void forInStatementExit(
+          Location location, bool variablePresent, DartType variableType) =>
+      genericStatementExit('forInStatement', location);
+
+  void forStatementEnter(Location location) =>
+      genericStatementEnter('forStatement', location);
+
+  void forStatementExit(Location location) =>
+      genericStatementExit('forStatement', location);
+
+  void functionDeclarationEnter(Location location) =>
+      genericStatementEnter('functionDeclaration', location);
+
+  void functionDeclarationExit(Location location, FunctionType inferredType) =>
+      genericStatementExit('functionDeclaration', location);
+
+  void functionExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("functionExpression", location, typeContext);
+
+  void functionExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("functionExpression", location, inferredType);
+
+  void ifNullBeforeRhs(Location location) {}
+
+  void ifNullEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter('ifNull', location, typeContext);
+
+  void ifNullExit(Location location, DartType inferredType) =>
+      genericExpressionExit('ifNull', location, inferredType);
+
+  void ifStatementEnter(Location location) =>
+      genericStatementEnter('ifStatement', location);
+
+  void ifStatementExit(Location location) =>
+      genericStatementExit('ifStatement', location);
+
+  void indexAssignAfterReceiver(Location location, DartType typeContext) {}
+
+  void indexAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("indexAssign", location, typeContext);
+
+  void indexAssignExit(Location location, Reference writeMember,
+          Reference combiner, DartType inferredType) =>
+      genericExpressionExit("indexAssign", location, inferredType);
+
+  void intLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("intLiteral", location, typeContext);
+
+  void intLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("intLiteral", location, inferredType);
+
+  void invalidInitializerEnter(Location location) =>
+      genericInitializerEnter("invalidInitializer", location);
+
+  void invalidInitializerExit(Location location) =>
+      genericInitializerExit("invalidInitializer", location);
+
+  void isExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("isExpression", location, typeContext);
+
+  void isExpressionExit(
+          Location location, DartType testedType, DartType inferredType) =>
+      genericExpressionExit("isExpression", location, inferredType);
+
+  void isNotExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("isNotExpression", location, typeContext);
+
+  void isNotExpressionExit(
+          Location location, DartType type, DartType inferredType) =>
+      genericExpressionExit("isNotExpression", location, inferredType);
+
+  void labeledStatementEnter(Location location) =>
+      genericStatementEnter('labeledStatement', location);
+
+  void labeledStatementExit(Location location) =>
+      genericStatementExit('labeledStatement', location);
+
+  void listLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("listLiteral", location, typeContext);
+
+  void listLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("listLiteral", location, inferredType);
+
+  void logicalExpressionBeforeRhs(Location location) {}
+
+  void logicalExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("logicalExpression", location, typeContext);
+
+  void logicalExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("logicalExpression", location, inferredType);
+
+  void mapLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("mapLiteral", location, typeContext);
+
+  void mapLiteralExit(Location location, DartType typeContext) =>
+      genericExpressionExit("mapLiteral", location, typeContext);
+
+  void methodInvocationBeforeArgs(Location location, bool isImplicitCall) {}
+
+  void methodInvocationEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("methodInvocation", location, typeContext);
+
+  void methodInvocationExit(
+          Location resultOffset,
+          List<DartType> argumentsTypes,
+          bool isImplicitCall,
+          Reference interfaceMember,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
+      genericExpressionExit("methodInvocation", resultOffset, inferredType);
+
+  void methodInvocationExitCall(
+          Location resultOffset,
+          List<DartType> argumentsTypes,
+          bool isImplicitCall,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
+      genericExpressionExit("methodInvocation", resultOffset, inferredType);
+
+  void namedFunctionExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("namedFunctionExpression", location, typeContext);
+
+  void namedFunctionExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("namedFunctionExpression", location, inferredType);
+
+  void notEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("not", location, typeContext);
+
+  void notExit(Location location, DartType inferredType) =>
+      genericExpressionExit("not", location, inferredType);
+
+  void nullLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("nullLiteral", location, typeContext);
+
+  void nullLiteralExit(
+          Location location, bool isSynthetic, DartType inferredType) =>
+      genericExpressionExit("nullLiteral", location, inferredType);
+
+  void propertyAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("propertyAssign", location, typeContext);
+
+  void propertyAssignExit(Location location, Reference writeMember,
+          DartType writeContext, Reference combiner, DartType inferredType) =>
+      genericExpressionExit("propertyAssign", location, inferredType);
+
+  void propertyGetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("propertyGet", location, typeContext);
+
+  void propertyGetExit(
+          Location location, Reference member, DartType inferredType) =>
+      genericExpressionExit("propertyGet", location, inferredType);
+
+  void propertyGetExitCall(Location location, DartType inferredType) =>
+      genericExpressionExit("propertyGet", location, inferredType);
+
+  void propertySetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("propertySet", location, typeContext);
+
+  void propertySetExit(Location location, DartType inferredType) =>
+      genericExpressionExit("propertySet", location, inferredType);
+
+  void redirectingInitializerEnter(
+          Location location, Reference initializerTarget) =>
+      genericInitializerEnter("redirectingInitializer", location);
+
+  void redirectingInitializerExit(Location location) =>
+      genericInitializerExit("redirectingInitializer", location);
+
+  void rethrowEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter('rethrow', location, typeContext);
+
+  void rethrowExit(Location location, DartType inferredType) =>
+      genericExpressionExit('rethrow', location, inferredType);
+
+  void returnStatementEnter(Location location) =>
+      genericStatementEnter('returnStatement', location);
+
+  void returnStatementExit(Location location) =>
+      genericStatementExit('returnStatement', location);
+
+  void staticAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("staticAssign", location, typeContext);
+
+  void staticAssignExit(Location location, Reference writeMember,
+          DartType writeContext, Reference combiner, DartType inferredType) =>
+      genericExpressionExit("staticAssign", location, inferredType);
+
+  void staticGetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("staticGet", location, typeContext);
+
+  void staticGetExit(Location location, Reference expressionTarget,
+          DartType inferredType) =>
+      genericExpressionExit("staticGet", location, inferredType);
+
+  void staticInvocationEnter(Location location,
+          Location expressionArgumentsLocation, DartType typeContext) =>
+      genericExpressionEnter("staticInvocation", location, typeContext);
+
+  void staticInvocationExit(
+          Location location,
+          Reference expressionTarget,
+          List<DartType> expressionArgumentsTypes,
+          FunctionType calleeType,
+          Substitution substitution,
+          DartType inferredType) =>
+      genericExpressionExit("staticInvocation", location, inferredType);
+
+  void stringConcatenationEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("stringConcatenation", location, typeContext);
+
+  void stringConcatenationExit(Location location, DartType inferredType) =>
+      genericExpressionExit("stringConcatenation", location, inferredType);
+
+  void stringLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("StringLiteral", location, typeContext);
+
+  void stringLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("StringLiteral", location, inferredType);
+
+  void superInitializerEnter(Location location) =>
+      genericInitializerEnter("superInitializer", location);
+
+  void superInitializerExit(Location location) =>
+      genericInitializerExit("superInitializer", location);
+
+  void switchStatementEnter(Location location) =>
+      genericStatementEnter('switchStatement', location);
+
+  void switchStatementExit(Location location) =>
+      genericStatementExit('switchStatement', location);
+
+  void symbolLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("symbolLiteral", location, typeContext);
+
+  void symbolLiteralExit(Location location, DartType inferredType) =>
+      genericExpressionExit("symbolLiteral", location, inferredType);
+
+  void thisExpressionEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("thisExpression", location, typeContext);
+
+  void thisExpressionExit(Location location, DartType inferredType) =>
+      genericExpressionExit("thisExpression", location, inferredType);
+
+  void throwEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter('throw', location, typeContext);
+
+  void throwExit(Location location, DartType inferredType) =>
+      genericExpressionExit('throw', location, inferredType);
+
+  void tryCatchEnter(Location location) =>
+      genericStatementEnter('tryCatch', location);
+
+  void tryCatchExit(Location location) =>
+      genericStatementExit('tryCatch', location);
+
+  void tryFinallyEnter(Location location) =>
+      genericStatementEnter('tryFinally', location);
+
+  void tryFinallyExit(Location location) =>
+      genericStatementExit('tryFinally', location);
+
+  void typeLiteralEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("typeLiteral", location, typeContext);
+
+  void typeLiteralExit(
+          Location location, Reference expressionType, DartType inferredType) =>
+      genericExpressionExit("typeLiteral", location, inferredType);
+
+  void variableAssignEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("variableAssign", location, typeContext);
+
+  void variableAssignExit(
+          Location location,
+          DartType writeContext,
+          Declaration writeVariable,
+          Reference combiner,
+          DartType inferredType) =>
+      genericExpressionExit("variableAssign", location, inferredType);
+
+  void variableDeclarationEnter(Location location) =>
+      genericStatementEnter('variableDeclaration', location);
+
+  void variableDeclarationExit(
+          Location location, DartType statementType, DartType inferredType) =>
+      genericStatementExit('variableDeclaration', location);
+
+  void variableGetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("variableGet", location, typeContext);
+
+  void variableGetExit(Location location, bool isInCascade,
+          Declaration expressionVariable, DartType inferredType) =>
+      genericExpressionExit("variableGet", location, inferredType);
+
+  void variableSetEnter(Location location, DartType typeContext) =>
+      genericExpressionEnter("variableSet", location, typeContext);
+
+  void variableSetExit(Location location, DartType inferredType) =>
+      genericExpressionExit("variableSet", location, inferredType);
+
+  void whileStatementEnter(Location location) =>
+      genericStatementEnter("whileStatement", location);
+
+  void whileStatementExit(Location location) =>
+      genericStatementExit("whileStatement", location);
+
+  void yieldStatementEnter(Location location) =>
+      genericStatementEnter('yieldStatement', location);
+
+  void yieldStatementExit(Location location) =>
+      genericStatementExit('yieldStatement', location);
+
+  void storePrefixInfo(Location location, PrefixInfo prefixInfo) {}
+
+  void storeClassReference(
+      Location location, Reference reference, DartType rawType) {}
+}
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 7ddef73..bd7a4ac 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
@@ -29,6 +29,7 @@
         Member,
         MethodInvocation,
         Name,
+        Node,
         NullLiteral,
         Procedure,
         ProcedureKind,
@@ -60,8 +61,25 @@
         InstrumentationValueForType,
         InstrumentationValueForTypeArgs;
 
+import '../../scanner/token.dart' show Token;
+
+import '../builder/class_builder.dart' show ClassBuilder;
+
+import '../builder/function_type_alias_builder.dart'
+    show FunctionTypeAliasBuilder;
+
+import '../builder/invalid_type_builder.dart' show InvalidTypeBuilder;
+
+import '../builder/prefix_builder.dart' show PrefixBuilder;
+
+import '../builder/type_builder.dart' show TypeBuilder;
+
+import '../builder/type_variable_builder.dart' show TypeVariableBuilder;
+
 import '../fasta_codes.dart';
 
+import '../kernel/expression_generator.dart' show TypeUseGenerator;
+
 import '../kernel/factory.dart' show Factory;
 
 import '../kernel/kernel_expression_generator.dart' show buildIsNull;
@@ -94,6 +112,8 @@
 import 'type_inference_engine.dart'
     show IncludesTypeParametersCovariantly, TypeInferenceEngine;
 
+import 'type_inference_listener.dart' show TypeInferenceListener;
+
 import 'type_promotion.dart' show TypePromoter, TypePromoterDisabled;
 
 import 'type_schema.dart' show isKnown, UnknownType;
@@ -365,6 +385,10 @@
       Factory<Expression, Statement, Initializer, Type> factory,
       kernel.Expression initializer,
       DartType declaredType);
+
+  void storePrefix(Token token, PrefixBuilder prefix);
+
+  void storeTypeUse(TypeUseGenerator generator);
 }
 
 /// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -421,6 +445,12 @@
       Factory<Expression, Statement, Initializer, Type> factory,
       kernel.Expression initializer,
       DartType declaredType) {}
+
+  @override
+  void storePrefix(Token token, PrefixBuilder prefix) {}
+
+  @override
+  void storeTypeUse(TypeUseGenerator generator) {}
 }
 
 /// Derived class containing generic implementations of [TypeInferrer].
@@ -454,6 +484,8 @@
 
   final TypeSchemaEnvironment typeSchemaEnvironment;
 
+  final TypeInferenceListener<int, int, Node, int> listener;
+
   final InterfaceType thisType;
 
   final SourceLibraryBuilder library;
@@ -472,8 +504,8 @@
   /// if the last invocation didn't require any inference.
   FunctionType lastCalleeType;
 
-  TypeInferrerImpl(
-      this.engine, this.uri, bool topLevel, this.thisType, this.library)
+  TypeInferrerImpl(this.engine, this.uri, this.listener, bool topLevel,
+      this.thisType, this.library)
       : coreTypes = engine.coreTypes,
         strongMode = engine.strongMode,
         classHierarchy = engine.classHierarchy,
@@ -838,6 +870,15 @@
   /// initializer.
   Expression getFieldInitializer(ShadowField field);
 
+  /// If the [member] is a forwarding stub, return the target it forwards to.
+  /// Otherwise return the given [member].
+  Member getRealTarget(Member member) {
+    if (member is Procedure && member.isForwardingStub) {
+      return member.forwardingStubInterfaceTarget;
+    }
+    return member;
+  }
+
   DartType getSetterType(Object interfaceMember, DartType receiverType) {
     if (interfaceMember is FunctionType) {
       return interfaceMember;
@@ -1384,10 +1425,12 @@
       Object interfaceMember,
       Name methodName,
       Arguments arguments}) {
+    listener.methodInvocationEnter(expression.fileOffset, typeContext);
     // First infer the receiver so we can look up the method that was invoked.
     var receiverType = receiver == null
         ? thisType
         : inferExpression(factory, receiver, const UnknownType(), true);
+    listener.methodInvocationBeforeArgs(expression.fileOffset, isImplicitCall);
     if (strongMode) {
       receiverVariable?.type = receiverType;
     }
@@ -1415,18 +1458,38 @@
     }
     handleInvocationContravariance(checkKind, desugaredInvocation, arguments,
         expression, inferredType, calleeType, fileOffset);
-    if (!identical(interfaceMember, 'call') &&
-        strongMode &&
-        isImplicitCall &&
-        interfaceMember != null &&
-        !(interfaceMember is Procedure &&
-            interfaceMember.kind == ProcedureKind.Method) &&
-        receiverType is! DynamicType &&
-        receiverType != typeSchemaEnvironment.rawFunctionType) {
-      var parent = expression.parent;
-      var errorNode = helper.wrapInCompileTimeError(expression,
-          templateImplicitCallOfNonMethod.withArguments(receiverType));
-      parent?.replaceChild(expression, errorNode);
+    int resultOffset = arguments.fileOffset != -1
+        ? arguments.fileOffset
+        : expression.fileOffset;
+    if (identical(interfaceMember, 'call')) {
+      listener.methodInvocationExitCall(
+          resultOffset,
+          arguments.types,
+          isImplicitCall,
+          lastCalleeType,
+          lastInferredSubstitution,
+          inferredType);
+    } else {
+      if (strongMode &&
+          isImplicitCall &&
+          interfaceMember != null &&
+          !(interfaceMember is Procedure &&
+              interfaceMember.kind == ProcedureKind.Method) &&
+          receiverType is! DynamicType &&
+          receiverType != typeSchemaEnvironment.rawFunctionType) {
+        var parent = expression.parent;
+        var errorNode = helper.wrapInCompileTimeError(expression,
+            templateImplicitCallOfNonMethod.withArguments(receiverType));
+        parent?.replaceChild(expression, errorNode);
+      }
+      listener.methodInvocationExit(
+          resultOffset,
+          arguments.types,
+          isImplicitCall,
+          getRealTarget(interfaceMember),
+          lastCalleeType,
+          lastInferredSubstitution,
+          inferredType);
     }
     return inferredType;
   }
@@ -1458,6 +1521,7 @@
       PropertyGet desugaredGet,
       Object interfaceMember,
       Name propertyName}) {
+    listener.propertyGetEnter(expression.fileOffset, typeContext);
     // First infer the receiver so we can look up the getter that was invoked.
     DartType receiverType;
     if (receiver == null) {
@@ -1492,6 +1556,12 @@
       inferredType =
           instantiateTearOff(inferredType, typeContext, replacedExpression);
     }
+    if (identical(interfaceMember, 'call')) {
+      listener.propertyGetExitCall(expression.fileOffset, inferredType);
+    } else {
+      listener.propertyGetExit(
+          expression.fileOffset, interfaceMember, inferredType);
+    }
     expression.inferredType = inferredType;
   }
 
@@ -1628,6 +1698,30 @@
     }
   }
 
+  @override
+  void storePrefix(Token token, PrefixBuilder prefix) {
+    listener.storePrefixInfo(token.offset, prefix.importIndex);
+  }
+
+  @override
+  void storeTypeUse(TypeUseGenerator generator) {
+    var declaration = generator.declaration;
+    if (declaration is ClassBuilder<TypeBuilder, InterfaceType>) {
+      Class class_ = declaration.target;
+      listener.storeClassReference(
+          generator.declarationReferenceOffset, class_, class_.rawType);
+    } else if (declaration is TypeVariableBuilder<TypeBuilder, DartType>) {
+      // TODO(paulberry): handle this case.
+    } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, DartType>) {
+      // TODO(paulberry): handle this case.
+    } else if (declaration is InvalidTypeBuilder<TypeBuilder, DartType>) {
+      // TODO(paulberry): handle this case.
+    } else {
+      throw new UnimplementedError(
+          'TODO(paulberry): ${declaration.runtimeType}');
+    }
+  }
+
   DartType wrapFutureOrType(DartType type) {
     if (type is InterfaceType &&
         identical(type.classNode, coreTypes.futureOrClass)) {