Version 2.0.0-dev.56.0

Merge commit '2a7188523e6ff00c068136200e32e65f4200fdc9' into dev
diff --git a/.packages b/.packages
index 68a0766..5e2e043 100644
--- a/.packages
+++ b/.packages
@@ -17,6 +17,7 @@
 barback:third_party/pkg/barback/lib
 bazel_worker:third_party/pkg/bazel_worker/lib
 boolean_selector:third_party/pkg/boolean_selector/lib
+build_integration:pkg/build_integration/lib
 charcode:third_party/pkg/charcode/lib
 charted:third_party/observatory_pub_packages/packages/charted/lib
 cli_util:third_party/pkg/cli_util/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 563a2fb..e02675e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 2.0.0-dev.57.0
+
+* Support Javascript Promise APIs as a Dart Future.  In Javascript a Promise has two
+  callbacks one for success and one for failure.  For success the Future returns the
+  value e.g.,
+
+BackgroundFetchManager.get is exposed as:
+
+```dart
+  Future<BackgroundFetchRegistration> get(String id)
+```
+
+usage could be:
+
+   BackgroundFetchRegistration result = await fetchMgr.get('abc');
+
+  The underlying JS Promise to Future mechanism will be exposed as a public API in a future checkin.
+
 ## 2.0.0-dev.56.0
 
 ### Language
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index e949c17..db27347 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -1130,7 +1130,7 @@
         .toList();
     processOptionsForDriver(info, options, optionMap);
     ContextRoot contextRoot =
-        new ContextRoot(folder.path, containedExcludedPaths);
+        new ContextRoot(pathContext, folder.path, containedExcludedPaths);
     if (optionsFile != null) {
       contextRoot.optionsFilePath = optionsFile.path;
     }
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 77fd41b..1af301c 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -65,6 +65,11 @@
   SearchEngine searchEngine;
 
   /**
+   * The workspace for rename refactorings.
+   */
+  RefactoringWorkspace refactoringWorkspace;
+
+  /**
    * The object used to manage uncompleted refactorings.
    */
   _RefactoringManager refactoringManager;
@@ -74,6 +79,8 @@
    */
   EditDomainHandler(AnalysisServer server) : super(server) {
     searchEngine = server.searchEngine;
+    refactoringWorkspace =
+        new RefactoringWorkspace(server.driverMap.values, searchEngine);
     _newRefactoringManager();
   }
 
@@ -589,7 +596,7 @@
         // try RENAME
         {
           RenameRefactoring renameRefactoring = new RenameRefactoring(
-              searchEngine, server.getAstProvider(file), element);
+              refactoringWorkspace, server.getAstProvider(file), element);
           if (renameRefactoring != null) {
             kinds.add(RefactoringKind.RENAME);
           }
@@ -614,7 +621,7 @@
    * Initializes [refactoringManager] with a new instance.
    */
   void _newRefactoringManager() {
-    refactoringManager = new _RefactoringManager(server, searchEngine);
+    refactoringManager = new _RefactoringManager(server, refactoringWorkspace);
   }
 
   static int _getNumberOfScanParseErrors(List<engine.AnalysisError> errors) {
@@ -695,6 +702,7 @@
       const <RefactoringProblem>[];
 
   final AnalysisServer server;
+  final RefactoringWorkspace refactoringWorkspace;
   final SearchEngine searchEngine;
   StreamSubscription subscriptionToReset;
 
@@ -711,7 +719,8 @@
   Request request;
   EditGetRefactoringResult result;
 
-  _RefactoringManager(this.server, this.searchEngine) {
+  _RefactoringManager(this.server, this.refactoringWorkspace)
+      : searchEngine = refactoringWorkspace.searchEngine {
     _reset();
   }
 
@@ -978,7 +987,7 @@
 
         // do create the refactoring
         refactoring = new RenameRefactoring(
-            searchEngine, server.getAstProvider(file), element);
+            refactoringWorkspace, server.getAstProvider(file), element);
         feedback = new RenameFeedback(
             feedbackOffset, feedbackLength, 'kind', 'oldName');
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 19c6a82..8497b25 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -560,10 +560,8 @@
     }
     // Use the returned expression as the field initializer.
     if (expression != null) {
-      AstNode beginNodeToReplace = getter.name;
       String code = 'final';
       if (getter.returnType != null) {
-        beginNodeToReplace = getter.returnType;
         code += ' ' + _getNodeText(getter.returnType);
       }
       code += ' ' + _getNodeText(getter.name);
@@ -571,7 +569,8 @@
         code += ' = ' + _getNodeText(expression);
       }
       code += ';';
-      SourceRange replacementRange = range.startEnd(beginNodeToReplace, getter);
+      SourceRange replacementRange =
+          range.startEnd(getter.returnType ?? getter.propertyKeyword, getter);
       DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(replacementRange, code);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 96243dd..74f5d98 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show RefactoringMethodParameter, SourceChange;
@@ -378,6 +379,25 @@
 }
 
 /**
+ * Information about the workspace refactorings operate it.
+ */
+class RefactoringWorkspace {
+  final Iterable<AnalysisDriver> drivers;
+  final SearchEngine searchEngine;
+
+  RefactoringWorkspace(this.drivers, this.searchEngine);
+
+  /**
+   * Whether the file with the given [path] is in a context root.
+   */
+  bool containsFile(String path) {
+    return drivers.any((driver) {
+      return driver.contextRoot.containsFile(path);
+    });
+  }
+}
+
+/**
  * Abstract [Refactoring] for renaming some [Element].
  */
 abstract class RenameRefactoring implements Refactoring {
@@ -386,8 +406,8 @@
    * maybe `null` if there is no support for renaming [Element]s of the given
    * type.
    */
-  factory RenameRefactoring(
-      SearchEngine searchEngine, AstProvider astProvider, Element element) {
+  factory RenameRefactoring(RefactoringWorkspace workspace,
+      AstProvider astProvider, Element element) {
     if (element == null) {
       return null;
     }
@@ -395,28 +415,27 @@
       element = (element as PropertyAccessorElement).variable;
     }
     if (element.enclosingElement is CompilationUnitElement) {
-      return new RenameUnitMemberRefactoringImpl(searchEngine, element);
+      return new RenameUnitMemberRefactoringImpl(workspace, element);
     }
     if (element is ConstructorElement) {
       return new RenameConstructorRefactoringImpl(
-          searchEngine, astProvider, element);
+          workspace, astProvider, element);
     }
     if (element is ImportElement) {
-      return new RenameImportRefactoringImpl(
-          searchEngine, astProvider, element);
+      return new RenameImportRefactoringImpl(workspace, astProvider, element);
     }
     if (element is LabelElement) {
-      return new RenameLabelRefactoringImpl(searchEngine, element);
+      return new RenameLabelRefactoringImpl(workspace, element);
     }
     if (element is LibraryElement) {
-      return new RenameLibraryRefactoringImpl(searchEngine, element);
+      return new RenameLibraryRefactoringImpl(workspace, element);
     }
     if (element is LocalElement) {
-      return new RenameLocalRefactoringImpl(searchEngine, astProvider, element);
+      return new RenameLocalRefactoringImpl(workspace, astProvider, element);
     }
     if (element.enclosingElement is ClassElement) {
       return new RenameClassMemberRefactoringImpl(
-          searchEngine, astProvider, element);
+          workspace, astProvider, element);
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index db79f49..716b2de13 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -12,44 +12,14 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:path/path.dart' as pathos;
-
-bool isElementInPubCache(Element element) {
-  Source source = element.source;
-  String path = source.fullName;
-  return isPathInPubCache(path);
-}
-
-bool isElementInSdkOrPubCache(Element element) {
-  Source source = element.source;
-  String path = source.fullName;
-  return source.isInSystemLibrary || isPathInPubCache(path);
-}
-
-bool isPathInPubCache(String path) {
-  List<String> parts = pathos.split(path);
-  if (parts.contains('.pub-cache')) {
-    return true;
-  }
-  for (int i = 0; i < parts.length - 1; i++) {
-    if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
-      return true;
-    }
-    if (parts[i] == 'third_party' &&
-        (parts[i + 1] == 'pkg' || parts[i + 1] == 'pkg_tested')) {
-      return true;
-    }
-  }
-  return false;
-}
 
 /**
  * An abstract implementation of [RenameRefactoring].
  */
 abstract class RenameRefactoringImpl extends RefactoringImpl
     implements RenameRefactoring {
+  final RefactoringWorkspace workspace;
   final SearchEngine searchEngine;
   final Element _element;
   final String elementKindName;
@@ -58,8 +28,8 @@
 
   String newName;
 
-  RenameRefactoringImpl(SearchEngine searchEngine, Element element)
-      : searchEngine = searchEngine,
+  RenameRefactoringImpl(this.workspace, Element element)
+      : searchEngine = workspace.searchEngine,
         _element = element,
         elementKindName = element.kind.displayName,
         oldName = _getDisplayName(element);
@@ -97,9 +67,9 @@
           getElementQualifiedName(element));
       result.addFatalError(message);
     }
-    if (isElementInPubCache(element)) {
+    if (!workspace.containsFile(element.source.fullName)) {
       String message = format(
-          "The {0} '{1}' is defined in a pub package, so cannot be renamed.",
+          "The {0} '{1}' is defined outside of the project, so cannot be renamed.",
           getElementKindName(element),
           getElementQualifiedName(element));
       result.addFatalError(message);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 9c10cdb..7c58a69 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -41,8 +41,8 @@
   _ClassMemberValidator _validator;
 
   RenameClassMemberRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, Element element)
-      : super(searchEngine, element);
+      RefactoringWorkspace workspace, this.astProvider, Element element)
+      : super(workspace, element);
 
   @override
   String get refactoringName {
@@ -102,7 +102,7 @@
     List<SourceReference> nameRefs = getSourceReferences(nameMatches);
     for (SourceReference reference in nameRefs) {
       // ignore references from SDK and pub cache
-      if (isElementInSdkOrPubCache(reference.element)) {
+      if (!workspace.containsFile(reference.element.source.fullName)) {
         continue;
       }
       // check the element being renamed is accessible
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index e079875..ccdb578 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -27,9 +27,9 @@
 class RenameConstructorRefactoringImpl extends RenameRefactoringImpl {
   final AstProvider astProvider;
 
-  RenameConstructorRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, ConstructorElement element)
-      : super(searchEngine, element);
+  RenameConstructorRefactoringImpl(RefactoringWorkspace workspace,
+      this.astProvider, ConstructorElement element)
+      : super(workspace, element);
 
   @override
   ConstructorElement get element => super.element as ConstructorElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 2adca4d..826fcf0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -27,8 +27,8 @@
   final AstProvider astProvider;
 
   RenameImportRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, ImportElement element)
-      : super(searchEngine, element);
+      RefactoringWorkspace workspace, this.astProvider, ImportElement element)
+      : super(workspace, element);
 
   @override
   ImportElement get element => super.element as ImportElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index 651fc7ac..e8a62c9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -8,15 +8,15 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 
 /**
  * A [Refactoring] for renaming [LabelElement]s.
  */
 class RenameLabelRefactoringImpl extends RenameRefactoringImpl {
-  RenameLabelRefactoringImpl(SearchEngine searchEngine, LabelElement element)
-      : super(searchEngine, element);
+  RenameLabelRefactoringImpl(
+      RefactoringWorkspace workspace, LabelElement element)
+      : super(workspace, element);
 
   @override
   LabelElement get element => super.element as LabelElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index 1c72c89..ac8326b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -8,7 +8,6 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
 
 /**
@@ -16,8 +15,8 @@
  */
 class RenameLibraryRefactoringImpl extends RenameRefactoringImpl {
   RenameLibraryRefactoringImpl(
-      SearchEngine searchEngine, LibraryElement element)
-      : super(searchEngine, element);
+      RefactoringWorkspace workspace, LibraryElement element)
+      : super(workspace, element);
 
   @override
   LibraryElement get element => super.element as LibraryElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index eca6220..d452e7d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -12,7 +12,6 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -29,9 +28,9 @@
   List<LocalElement> elements = [];
 
   RenameLocalRefactoringImpl(
-      SearchEngine searchEngine, this.astProvider, LocalElement element)
+      RefactoringWorkspace workspace, this.astProvider, LocalElement element)
       : unitCache = new ResolvedUnitCache(astProvider),
-        super(searchEngine, element);
+        super(workspace, element);
 
   @override
   LocalElement get element => super.element as LocalElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index fea2831..5f483a9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -42,8 +42,9 @@
  * A [Refactoring] for renaming compilation unit member [Element]s.
  */
 class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
-  RenameUnitMemberRefactoringImpl(SearchEngine searchEngine, Element element)
-      : super(searchEngine, element);
+  RenameUnitMemberRefactoringImpl(
+      RefactoringWorkspace workspace, Element element)
+      : super(workspace, element);
 
   @override
   String get refactoringName {
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 8cf628e..8060d58 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -137,7 +137,8 @@
         resourceProvider,
         new MemoryByteStore(),
         fileContentOverlay,
-        new ContextRoot(resourceProvider.convertPath('/project'), []),
+        new ContextRoot(resourceProvider.pathContext,
+            resourceProvider.convertPath('/project'), []),
         sourceFactory,
         new AnalysisOptionsImpl()..strongMode = true);
     scheduler.start();
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 1ea09b0..1e9c3ef 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -31,7 +31,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = resourceProvider.convertPath('/test.dart');
+    testFile = resourceProvider.convertPath('/project/test.dart');
   }
 
   void addTestSource(String code, [Uri uri]) {
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 752c8af..986c6ae 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -104,7 +104,7 @@
   }
 
   test_addTypeAnnotation_BAD_privateType_closureParameter() async {
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -120,7 +120,7 @@
   }
 
   test_addTypeAnnotation_BAD_privateType_declaredIdentifier() async {
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -141,7 +141,7 @@
   test_addTypeAnnotation_BAD_privateType_list() async {
     // This is now failing because we're suggesting "List" rather than nothing.
     // Is it really better to produce nothing?
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -162,7 +162,7 @@
   }
 
   test_addTypeAnnotation_BAD_privateType_variable() async {
-    addSource('/my_lib.dart', '''
+    addSource('/project/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -279,7 +279,7 @@
   }
 
   test_addTypeAnnotation_declaredIdentifier_OK_addImport_dartUri() async {
-    addSource('/my_lib.dart', r'''
+    addSource('/project/my_lib.dart', r'''
 import 'dart:async';
 List<Future<int>> getFutures() => null;
 ''');
@@ -416,7 +416,7 @@
   }
 
   test_addTypeAnnotation_local_OK_addImport_dartUri() async {
-    addSource('/my_lib.dart', r'''
+    addSource('/project/my_lib.dart', r'''
 import 'dart:async';
 Future<int> getFutureInt() => null;
 ''');
@@ -438,7 +438,7 @@
 
   test_addTypeAnnotation_local_OK_addImport_notLibraryUnit() async {
     // prepare library
-    addSource('/my_lib.dart', r'''
+    addSource('/project/my_lib.dart', r'''
 import 'dart:async';
 Future<int> getFutureInt() => null;
 ''');
@@ -455,8 +455,8 @@
 }
 ''';
     // add sources
-    addSource('/app.dart', appCode);
-    testSource = addSource('/test.dart', testCode);
+    addSource('/project/app.dart', appCode);
+    testSource = addSource('/project/test.dart', testCode);
     // resolve
     await resolveTestUnit(testCode);
     // prepare the assist
@@ -465,7 +465,7 @@
     change = assist.change;
     // verify
     {
-      var testFileEdit = change.getFileEdit(convertPath('/app.dart'));
+      var testFileEdit = change.getFileEdit(convertPath('/project/app.dart'));
       var resultCode = SourceEdit.applySequence(appCode, testFileEdit.edits);
       expect(resultCode, '''
 library my_app;
@@ -476,7 +476,7 @@
 ''');
     }
     {
-      var testFileEdit = change.getFileEdit(convertPath('/test.dart'));
+      var testFileEdit = change.getFileEdit(convertPath('/project/test.dart'));
       var resultCode = SourceEdit.applySequence(testCode, testFileEdit.edits);
       expect(resultCode, '''
 part of my_app;
@@ -488,10 +488,10 @@
   }
 
   test_addTypeAnnotation_local_OK_addImport_relUri() async {
-    addSource('/aa/bbb/lib_a.dart', r'''
+    addSource('/project/aa/bbb/lib_a.dart', r'''
 class MyClass {}
 ''');
-    addSource('/ccc/lib_b.dart', r'''
+    addSource('/project/ccc/lib_b.dart', r'''
 import '../aa/bbb/lib_a.dart';
 MyClass newMyClass() => null;
 ''');
@@ -1680,6 +1680,34 @@
 ''');
   }
 
+  test_convertToFinalField_OK_noReturnType() async {
+    await resolveTestUnit('''
+class A {
+  get foo => 42;
+}
+''');
+    await assertHasAssistAt(
+        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
+class A {
+  final foo = 42;
+}
+''');
+  }
+
+  test_convertToFinalField_OK_noReturnType_static() async {
+    await resolveTestUnit('''
+class A {
+  static get foo => 42;
+}
+''');
+    await assertHasAssistAt(
+        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
+class A {
+  static final foo = 42;
+}
+''');
+  }
+
   test_convertToFinalField_OK_notNull() async {
     await resolveTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index cde73fd..62b0d84 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -1100,7 +1100,7 @@
 
   test_addMissingRequiredArg_cons_single() async {
     _addMetaPackageSource();
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1128,7 +1128,7 @@
   test_addMissingRequiredArg_cons_single_closure() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1158,7 +1158,7 @@
   test_addMissingRequiredArg_cons_single_closure_2() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1188,7 +1188,7 @@
   test_addMissingRequiredArg_cons_single_closure_3() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1218,7 +1218,7 @@
   test_addMissingRequiredArg_cons_single_closure_4() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1248,7 +1248,7 @@
   test_addMissingRequiredArg_cons_single_list() async {
     _addMetaPackageSource();
 
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 import 'package:meta/meta.dart';
 
@@ -1495,13 +1495,13 @@
   }
 
   test_changeToStaticAccess_method_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {
   static foo() {}
 }
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 class B extends A {}
@@ -1556,13 +1556,13 @@
   }
 
   test_changeToStaticAccess_property_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {
   static get foo => null;
 }
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 class B extends A {}
@@ -1748,7 +1748,7 @@
 
 class A {}
 ''';
-    addSource('/lib.dart', libCode);
+    addSource('/project/lib.dart', libCode);
     await resolveTestUnit('''
 import 'lib.dart' as lib;
 
@@ -1764,7 +1764,7 @@
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/lib.dart'));
+    expect(fileEdit.file, convertPath('/project/lib.dart'));
     expect(SourceEdit.applySequence(libCode, fileEdit.edits), r'''
 library my.lib;
 
@@ -2165,11 +2165,11 @@
   }
 
   test_createConstructorSuperImplicit_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {}
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 class B {
@@ -2314,7 +2314,7 @@
   }
 
   test_createField_getter_qualified_instance_differentLibrary() async {
-    addSource('/other.dart', '''
+    addSource('/project/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -2343,7 +2343,7 @@
   int test;
 }
 ''',
-        target: '/other.dart');
+        target: '/project/other.dart');
   }
 
   test_createField_getter_qualified_instance_dynamicType() async {
@@ -2493,11 +2493,11 @@
   }
 
   test_createField_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {}
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 A getA() => null;
@@ -2938,7 +2938,7 @@
   }
 
   test_createGetter_qualified_instance_differentLibrary() async {
-    addSource('/other.dart', '''
+    addSource('/project/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -2967,7 +2967,7 @@
   int get test => null;
 }
 ''',
-        target: '/other.dart');
+        target: '/project/other.dart');
   }
 
   test_createGetter_qualified_instance_dynamicType() async {
@@ -3879,11 +3879,11 @@
   }
 
   test_creationFunction_forFunctionType_importType() async {
-    addSource('/libA.dart', r'''
+    addSource('/project/libA.dart', r'''
 library libA;
 class A {}
 ''');
-    addSource('/libB.dart', r'''
+    addSource('/project/libB.dart', r'''
 library libB;
 import 'libA.dart';
 useFunction(int g(A a)) {}
@@ -5370,7 +5370,7 @@
   }
 
   test_undefinedFunction_create_importType() async {
-    addSource('/lib.dart', r'''
+    addSource('/project/lib.dart', r'''
 library lib;
 import 'dart:async';
 Future getFuture() => null;
@@ -6082,8 +6082,8 @@
 class D {
 }
 ''';
-    addSource('/test2.dart', code2);
-    addSource('/test3.dart', r'''
+    addSource('/project/test2.dart', code2);
+    addSource('/project/test3.dart', r'''
 library test3;
 class E {}
 ''');
@@ -6101,7 +6101,7 @@
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/test2.dart'));
+    expect(fileEdit.file, convertPath('/project/test2.dart'));
     expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
 library test2;
 import 'test3.dart' as bbb;
@@ -6119,7 +6119,7 @@
 }
 class E {}
 ''';
-    addSource('/test2.dart', code2);
+    addSource('/project/test2.dart', code2);
     await resolveTestUnit('''
 library test;
 import 'test2.dart' as test2;
@@ -6134,7 +6134,7 @@
     List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/test2.dart'));
+    expect(fileEdit.file, convertPath('/project/test2.dart'));
     expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
 library test2;
 class D {
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 459b78c..9576897 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -96,8 +96,8 @@
   }
 
   test_remove_unresolvedDirectives() async {
-    addSource('/existing_part1.dart', 'part of lib;');
-    addSource('/existing_part2.dart', 'part of lib;');
+    addSource('/project/existing_part1.dart', 'part of lib;');
+    addSource('/project/existing_part2.dart', 'part of lib;');
     await _computeUnitAndErrors(r'''
 library lib;
 
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index 776fa14..cce27cd 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -29,7 +29,7 @@
     Element element = findElement('MyClass');
     // check
     Location location = newLocation_fromElement(element);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, 6);
     expect(location.length, 7);
     expect(location.startLine, 1);
@@ -52,7 +52,7 @@
         sourceRange);
     // check
     Location location = newLocation_fromMatch(match);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, sourceRange.offset);
     expect(location.length, sourceRange.length);
   }
@@ -65,7 +65,7 @@
     AstNode node = findNodeAtString('main');
     // check
     Location location = newLocation_fromNode(node);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, node.offset);
     expect(location.length, node.length);
   }
@@ -75,7 +75,7 @@
     SourceRange sourceRange = new SourceRange(10, 20);
     // check
     Location location = newLocation_fromUnit(testUnit, sourceRange);
-    expect(location.file, convertPath('/test.dart'));
+    expect(location.file, convertPath('/project/test.dart'));
     expect(location.offset, sourceRange.offset);
     expect(location.length, sourceRange.length);
   }
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 3d8633c..3bb9141 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -55,7 +55,8 @@
    * Fails if no [RenameRefactoring] can be created.
    */
   void createRenameRefactoringForElement(Element element) {
-    refactoring = new RenameRefactoring(searchEngine, astProvider, element);
+    var workspace = new RefactoringWorkspace([driver], searchEngine);
+    refactoring = new RenameRefactoring(workspace, astProvider, element);
     expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index 7712c7d..6702055 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -87,7 +87,7 @@
   }
 
   test_change_multipleFiles() async {
-    await indexUnit('/other.dart', r'''
+    await indexUnit('/project/other.dart', r'''
 class A {
   int get test => 1;
 }
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index e9cb4d8..60f38f8 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -89,7 +89,7 @@
   }
 
   test_change_multipleFiles() async {
-    await indexUnit('/other.dart', r'''
+    await indexUnit('/project/other.dart', r'''
 class A {
   int test() => 1;
 }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index bcdb836..59f1a21 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2837,7 +2837,7 @@
   }
 
   void _addLibraryReturningAsync() {
-    addSource('/asyncLib.dart', r'''
+    addSource('/project/asyncLib.dart', r'''
 library asyncLib;
 import 'dart:async';
 Future<int> newFuture() => null;
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index f248500..00006c5 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -157,7 +157,7 @@
   test() {}
 }
 ''');
-    await indexUnit('/lib.dart', '''
+    await indexUnit('/project/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -356,7 +356,7 @@
   newName() {} // marker
 }
 ''';
-    await indexUnit('/lib.dart', libCode);
+    await indexUnit('/project/lib.dart', libCode);
     await indexTestUnit('''
 import 'lib.dart';
 class B extends A {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index 1434a05..2f0f4a3 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -230,8 +230,8 @@
   }
 
   test_newInstance_nullElement() async {
-    RenameRefactoring refactoring =
-        new RenameRefactoring(searchEngine, null, null);
+    var workspace = new RefactoringWorkspace([driver], searchEngine);
+    var refactoring = new RenameRefactoring(workspace, null, null);
     expect(refactoring, isNull);
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index 1acca7d..19d2a4d 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -40,7 +40,7 @@
   }
 
   test_createChange() async {
-    addSource('/part.dart', '''
+    addSource('/project/part.dart', '''
 part of my.app;
 ''');
     await indexTestUnit('''
@@ -57,13 +57,13 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/part.dart', '''
+    assertFileChangeResult('/project/part.dart', '''
 part of the.new.name;
 ''');
   }
 
   test_createChange_hasWhitespaces() async {
-    addSource('/part.dart', '''
+    addSource('/project/part.dart', '''
 part of my .  app;
 ''');
     await indexTestUnit('''
@@ -80,7 +80,7 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/part.dart', '''
+    assertFileChangeResult('/project/part.dart', '''
 part of the.new.name;
 ''');
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 505843c..6b8c273 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -447,7 +447,7 @@
   A({test});
 }
 ''');
-    await indexUnit('/test2.dart', '''
+    await indexUnit('/project/test2.dart', '''
 import 'test.dart';
 main() {
   new A(test: 2);
@@ -463,7 +463,7 @@
   A({newName});
 }
 ''');
-    assertFileChangeResult('/test2.dart', '''
+    assertFileChangeResult('/project/test2.dart', '''
 import 'test.dart';
 main() {
   new A(newName: 2);
@@ -472,7 +472,7 @@
   }
 
   test_createChange_parameter_named_updateHierarchy() async {
-    await indexUnit('/test2.dart', '''
+    await indexUnit('/project/test2.dart', '''
 library test2;
 class A {
   void foo({int test: 1}) {
@@ -516,7 +516,7 @@
   }
 }
 ''');
-    assertFileChangeResult('/test2.dart', '''
+    assertFileChangeResult('/project/test2.dart', '''
 library test2;
 class A {
   void foo({int newName: 1}) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 6285bbd..e5c22bf 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -69,7 +69,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit(convertPath('/lib.dart'), '''
+    await indexUnit(convertPath('/project/lib.dart'), '''
 library my.lib;
 import 'test.dart';
 
@@ -109,7 +109,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit(convertPath('/lib.dart'), '''
+    await indexUnit(convertPath('/project/lib.dart'), '''
 library my.lib;
 import 'test.dart';
 class A {
@@ -214,44 +214,6 @@
     assertRefactoringStatusOK(status);
   }
 
-  test_checkInitialConditions_inPubCache_posix() async {
-    addSource('/.pub-cache/lib.dart', r'''
-class A {}
-''');
-    await indexTestUnit('''
-import "${convertPathForImport('/.pub-cache/lib.dart')}";
-main() {
-  A a;
-}
-''');
-    createRenameRefactoringAtString('A a');
-    // check status
-    refactoring.newName = 'NewName';
-    RefactoringStatus status = await refactoring.checkInitialConditions();
-    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
-        expectedMessage:
-            "The class 'A' is defined in a pub package, so cannot be renamed.");
-  }
-
-  test_checkInitialConditions_inPubCache_windows() async {
-    addSource('/Pub/Cache/lib.dart', r'''
-class A {}
-''');
-    await indexTestUnit('''
-import "${convertPathForImport('/Pub/Cache/lib.dart')}";
-main() {
-  A a;
-}
-''');
-    createRenameRefactoringAtString('A a');
-    // check status
-    refactoring.newName = 'NewName';
-    RefactoringStatus status = await refactoring.checkInitialConditions();
-    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
-        expectedMessage:
-            "The class 'A' is defined in a pub package, so cannot be renamed.");
-  }
-
   test_checkInitialConditions_inSDK() async {
     await indexTestUnit('''
 main() {
@@ -267,6 +229,25 @@
             "The class 'String' is defined in the SDK, so cannot be renamed.");
   }
 
+  test_checkInitialConditions_outsideOfProject() async {
+    addSource('/other/lib.dart', r'''
+class A {}
+''');
+    await indexTestUnit('''
+import "${convertPathForImport('/other/lib.dart')}";
+main() {
+  A a;
+}
+''');
+    createRenameRefactoringAtString('A a');
+    // check status
+    refactoring.newName = 'NewName';
+    RefactoringStatus status = await refactoring.checkInitialConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
+        expectedMessage:
+            "The class 'A' is defined outside of the project, so cannot be renamed.");
+  }
+
   test_checkNewName_ClassElement() async {
     await indexTestUnit('''
 class Test {}
@@ -483,7 +464,7 @@
   }
 
   test_createChange_FunctionElement_imported() async {
-    await indexUnit('/foo.dart', r'''
+    await indexUnit('/project/foo.dart', r'''
 test() {}
 foo() {}
 ''');
@@ -510,7 +491,7 @@
   foo();
 }
 ''');
-    assertFileChangeResult('/foo.dart', '''
+    assertFileChangeResult('/project/foo.dart', '''
 newName() {}
 foo() {}
 ''');
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index ef5fb8f..5fd654d 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -33,6 +33,10 @@
   });
 }
 
+ContextRoot _newContextRoot(String root, {List<String> exclude: const []}) {
+  return new ContextRoot(path.context, root, exclude);
+}
+
 @reflectiveTest
 class BuiltInPluginInfoTest {
   TestNotificationManager notificationManager;
@@ -45,7 +49,7 @@
   }
 
   test_addContextRoot() {
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
     plugin.addContextRoot(contextRoot1);
     expect(plugin.contextRoots, [contextRoot1]);
     plugin.addContextRoot(contextRoot1);
@@ -60,8 +64,8 @@
   }
 
   test_removeContextRoot() {
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
-    ContextRoot contextRoot2 = new ContextRoot('/pkg2', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
+    ContextRoot contextRoot2 = _newContextRoot('/pkg2');
     plugin.addContextRoot(contextRoot1);
     expect(plugin.contextRoots, unorderedEquals([contextRoot1]));
     plugin.addContextRoot(contextRoot2);
@@ -119,7 +123,7 @@
 
   test_addContextRoot() {
     String optionsFilePath = '/pkg1/analysis_options.yaml';
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
     contextRoot1.optionsFilePath = optionsFilePath;
     PluginSession session = new PluginSession(plugin);
     TestServerCommunicationChannel channel =
@@ -144,8 +148,8 @@
   }
 
   test_removeContextRoot() {
-    ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
-    ContextRoot contextRoot2 = new ContextRoot('/pkg2', []);
+    ContextRoot contextRoot1 = _newContextRoot('/pkg1');
+    ContextRoot contextRoot2 = _newContextRoot('/pkg2');
     plugin.addContextRoot(contextRoot1);
     expect(plugin.contextRoots, unorderedEquals([contextRoot1]));
     plugin.addContextRoot(contextRoot2);
@@ -202,7 +206,7 @@
     io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
     String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
     await withPlugin(test: (String pluginPath) async {
-      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+      ContextRoot contextRoot = _newContextRoot(pkgPath);
       await manager.addPluginToContextRoot(contextRoot, pluginPath);
       await manager.stopAll();
     });
@@ -217,7 +221,7 @@
 //    io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
 //    String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
 //    await withPubspecPlugin(test: (String pluginPath) async {
-//      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+//      ContextRoot contextRoot = _newContextRoot(pkgPath);
 //      await manager.addPluginToContextRoot(contextRoot, pluginPath);
 //      String packagesPath =
 //          resourceProvider.pathContext.join(pluginPath, '.packages');
@@ -238,7 +242,7 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+                ContextRoot contextRoot = _newContextRoot(pkgPath);
                 await manager.addPluginToContextRoot(contextRoot, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot, plugin2Path);
 
@@ -264,7 +268,7 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+                ContextRoot contextRoot = _newContextRoot(pkgPath);
                 await manager.addPluginToContextRoot(contextRoot, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot, plugin2Path);
 
@@ -285,7 +289,7 @@
     await withPlugin(
         pluginName: 'plugin1',
         test: (String plugin1Path) async {
-          ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+          ContextRoot contextRoot = _newContextRoot(pkgPath);
           await manager.addPluginToContextRoot(contextRoot, plugin1Path);
           List<PluginInfo> plugins = manager.pluginsForContextRoot(contextRoot);
           expect(plugins, hasLength(1));
@@ -311,7 +315,7 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+                ContextRoot contextRoot = _newContextRoot(pkgPath);
                 await manager.addPluginToContextRoot(contextRoot, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot, plugin2Path);
 
@@ -333,7 +337,7 @@
     io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
     String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
     await withPlugin(test: (String pluginPath) async {
-      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+      ContextRoot contextRoot = _newContextRoot(pkgPath);
       await manager.addPluginToContextRoot(contextRoot, pluginPath);
 
       List<PluginInfo> plugins = manager.pluginsForContextRoot(contextRoot);
@@ -349,7 +353,7 @@
     io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
     String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
     await withPlugin(test: (String pluginPath) async {
-      ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+      ContextRoot contextRoot = _newContextRoot(pkgPath);
       await manager.addPluginToContextRoot(contextRoot, pluginPath);
 
       manager.removedContextRoot(contextRoot);
@@ -370,8 +374,8 @@
           await withPlugin(
               pluginName: 'plugin2',
               test: (String plugin2Path) async {
-                ContextRoot contextRoot1 = new ContextRoot(pkg1Path, []);
-                ContextRoot contextRoot2 = new ContextRoot(pkg2Path, []);
+                ContextRoot contextRoot1 = _newContextRoot(pkg1Path);
+                ContextRoot contextRoot2 = _newContextRoot(pkg2Path);
                 await manager.addPluginToContextRoot(contextRoot1, plugin1Path);
                 await manager.addPluginToContextRoot(contextRoot1, plugin2Path);
                 await manager.addPluginToContextRoot(contextRoot2, plugin1Path);
@@ -415,7 +419,7 @@
   }
 
   void test_broadcastRequest_none() {
-    ContextRoot contextRoot = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot = _newContextRoot('/pkg1');
     Map<PluginInfo, Future<Response>> responses = manager.broadcastRequest(
         new CompletionGetSuggestionsParams('/pkg1/lib/pkg1.dart', 100),
         contextRoot: contextRoot);
@@ -498,7 +502,7 @@
   }
 
   void test_pluginsForContextRoot_none() {
-    ContextRoot contextRoot = new ContextRoot('/pkg1', []);
+    ContextRoot contextRoot = _newContextRoot('/pkg1');
     expect(manager.pluginsForContextRoot(contextRoot), isEmpty);
   }
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 8c372a6..0951011 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -50,7 +50,8 @@
     newFile(
         '/pkg2/${PluginLocator.toolsFolderName}/${PluginLocator.defaultPluginFolderName}/bin/plugin.dart');
 
-    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    ContextRoot contextRoot =
+        new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     driver.analysisOptions.enabledPluginNames = ['pkg2'];
     watcher.addedDriver(driver, contextRoot);
@@ -79,7 +80,8 @@
     String pkg1Path = newFolder('/pkg1').path;
     newFile('/pkg1/lib/test1.dart');
 
-    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    ContextRoot contextRoot =
+        new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     driver.analysisOptions.enabledPluginNames = ['pkg3'];
     watcher.addedDriver(driver, contextRoot);
@@ -100,7 +102,8 @@
 
   test_removedDriver() {
     String pkg1Path = newFolder('/pkg1').path;
-    ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+    ContextRoot contextRoot =
+        new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
     TestDriver driver = new TestDriver(resourceProvider, contextRoot);
     watcher.addedDriver(driver, contextRoot);
     watcher.removedDriver(driver);
diff --git a/pkg/analyzer/lib/src/context/context_root.dart b/pkg/analyzer/lib/src/context/context_root.dart
index a728860..1c32428 100644
--- a/pkg/analyzer/lib/src/context/context_root.dart
+++ b/pkg/analyzer/lib/src/context/context_root.dart
@@ -12,6 +12,11 @@
  */
 class ContextRoot {
   /**
+   * The path context to use when manipulating paths.
+   */
+  final path.Context pathContext;
+
+  /**
    * The absolute path of the root directory containing the files to be
    * analyzed.
    */
@@ -33,7 +38,7 @@
   /**
    * Initialize a newly created context root.
    */
-  ContextRoot(this.root, this.exclude);
+  ContextRoot(this.pathContext, this.root, this.exclude);
 
   @override
   int get hashCode {
@@ -59,11 +64,11 @@
    * directories.
    */
   bool containsFile(String filePath) {
-    if (!path.isWithin(root, filePath)) {
+    if (!pathContext.isWithin(root, filePath)) {
       return false;
     }
     for (String excluded in exclude) {
-      if (filePath == excluded || path.isWithin(excluded, filePath)) {
+      if (filePath == excluded || pathContext.isWithin(excluded, filePath)) {
         return false;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index 628d28c..2d54d53 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -80,7 +80,9 @@
     builder.performanceLog = performanceLog;
 
     old.ContextRoot oldContextRoot = new old.ContextRoot(
-        contextRoot.root.path, contextRoot.excludedPaths.toList());
+        resourceProvider.pathContext,
+        contextRoot.root.path,
+        contextRoot.excludedPaths.toList());
     AnalysisDriver driver = builder.buildDriver(oldContextRoot);
     DriverBasedAnalysisContext context =
         new DriverBasedAnalysisContext(resourceProvider, contextRoot, driver);
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index e53835f..5d290be 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -100,8 +100,10 @@
     builder.performanceLog = performanceLog;
     List<AnalysisContext> contextList = <AnalysisContext>[];
     for (ContextRoot root in roots) {
-      old.ContextRoot contextRoot =
-          new old.ContextRoot(root.root.path, root.excludedPaths.toList());
+      old.ContextRoot contextRoot = new old.ContextRoot(
+          resourceProvider.pathContext,
+          root.root.path,
+          root.excludedPaths.toList());
       AnalysisDriver driver = builder.buildDriver(contextRoot);
       DriverBasedAnalysisContext context =
           new DriverBasedAnalysisContext(resourceProvider, root, driver);
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index bf98050..0d4084c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 58;
+  static const int DATA_VERSION = 59;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 052b7ba..a706a0d 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1979,7 +1979,7 @@
       push(prefix);
     } else if (prefix is SimpleIdentifier) {
       // TODO(paulberry): resolve [identifier].  Note that BodyBuilder handles
-      // this situation using SendAccessor.
+      // this situation using SendAccessGenerator.
       push(ast.prefixedIdentifier(prefix, period, identifier));
     } else {
       // TODO(paulberry): implement.
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 52839a7..1f3035f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -6,8 +6,6 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart'
-    show Identifier, Operator;
 import 'package:front_end/src/fasta/kernel/forest.dart';
 import 'package:kernel/ast.dart' as kernel;
 
@@ -60,9 +58,31 @@
   Expression asExpression(Expression expression, type, Token location) =>
       astFactory.asExpression(expression, location, type);
 
+  @override
   Expression asLiteralString(Expression value) => value;
 
   @override
+  ConstructorInitializer assertInitializer(
+          Token assertKeyword,
+          Token leftParenthesis,
+          Expression condition,
+          Token comma,
+          Expression message) =>
+      astFactory.assertInitializer(assertKeyword, leftParenthesis, condition,
+          comma, message, leftParenthesis.endGroup);
+
+  @override
+  Statement assertStatement(
+          Token assertKeyword,
+          Token leftParenthesis,
+          Expression condition,
+          Token comma,
+          Expression message,
+          Token semicolon) =>
+      astFactory.assertStatement(assertKeyword, leftParenthesis, condition,
+          comma, message, leftParenthesis.endGroup, semicolon);
+
+  @override
   Expression awaitExpression(Expression operand, Token awaitKeyword) =>
       astFactory.awaitExpression(awaitKeyword, operand);
 
@@ -71,6 +91,12 @@
       astFactory.block(openBrace, statements, closeBrace);
 
   @override
+  Statement breakStatement(
+          Token breakKeyword, Identifier label, Token semicolon) =>
+      astFactory.breakStatement(
+          breakKeyword, astFactory.simpleIdentifier(label.token), semicolon);
+
+  @override
   kernel.Arguments castArguments(_Arguments arguments) {
     // TODO(brianwilkerson) Implement this or remove it from the API.
     throw new UnimplementedError();
@@ -89,6 +115,12 @@
           condition, question, thenExpression, colon, elseExpression);
 
   @override
+  Statement continueStatement(
+          Token continueKeyword, Identifier label, Token semicolon) =>
+      astFactory.continueStatement(
+          continueKeyword, astFactory.simpleIdentifier(label.token), semicolon);
+
+  @override
   Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
           ParenthesizedExpression condition, Token semicolon) =>
       astFactory.doStatement(
@@ -104,6 +136,7 @@
   Statement emptyStatement(Token semicolon) =>
       astFactory.emptyStatement(semicolon);
 
+  @override
   Statement expressionStatement(Expression expression, Token semicolon) =>
       astFactory.expressionStatement(expression, semicolon);
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index a7b6f00..2d36b5a 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -1158,7 +1158,9 @@
 
   @override
   void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
-    expectIn('Import');
+    // This event normally happens within "Import",
+    // but happens within "CompilationUnit" during recovery.
+    expectInOneOf(const ['Import', 'CompilationUnit']);
     listener.handleImportPrefix(deferredKeyword, asKeyword);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index 425b0a0..1ec29cc 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -3181,6 +3181,8 @@
   @failingTest
   void test_parsePrimaryExpression_const() {
     super.test_parsePrimaryExpression_const();
+    fail(
+        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
   }
 
   @failingTest
@@ -4017,6 +4019,11 @@
   }
 
   @failingTest
+  void test_combinator_badIdentifier() {
+    super.test_combinator_badIdentifier();
+  }
+
+  @failingTest
   void test_combinator_missingIdentifier() {
     super.test_combinator_missingIdentifier();
   }
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 611ee186..56f90ba 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -10787,6 +10787,25 @@
             : [ParserErrorCode.EXPECTED_TOKEN]);
   }
 
+  void test_combinator_badIdentifier() {
+    createParser('import "/testB.dart" show @');
+    parser.parseCompilationUnit2();
+    listener.assertErrors(usingFastaParser
+        ? [
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 27, 0),
+            expectedError(
+                ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 27, 0),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 27, 0)
+          ]
+        : [
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 26, 1),
+            expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+            expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 27, 1)
+          ]);
+  }
+
   void test_combinator_missingIdentifier() {
     createParser('import "/testB.dart" show ;');
     parser.parseCompilationUnit2();
@@ -13558,15 +13577,6 @@
     expect(arguments, hasLength(1));
   }
 
-  void test_parseArgumentList_typeArguments_prefixed() {
-    createParser('(a<b,p.c>(d))');
-    ArgumentList argumentList = parser.parseArgumentList();
-    expectNotNullIfNoErrors(argumentList);
-    assertNoErrors();
-    NodeList<Expression> arguments = argumentList.arguments;
-    expect(arguments, hasLength(1));
-  }
-
   void test_parseArgumentList_typeArguments_none() {
     createParser('(a<b,p.q.c>(d))');
     ArgumentList argumentList = parser.parseArgumentList();
@@ -13576,6 +13586,15 @@
     expect(arguments, hasLength(2));
   }
 
+  void test_parseArgumentList_typeArguments_prefixed() {
+    createParser('(a<b,p.c>(d))');
+    ArgumentList argumentList = parser.parseArgumentList();
+    expectNotNullIfNoErrors(argumentList);
+    assertNoErrors();
+    NodeList<Expression> arguments = argumentList.arguments;
+    expect(arguments, hasLength(1));
+  }
+
   void test_parseCombinators_h() {
     createParser('hide a');
     List<Combinator> combinators = parser.parseCombinators();
@@ -14716,7 +14735,10 @@
   }
 
   void test_parseBreakStatement_label() {
-    var statement = parseStatement('break foo;') as BreakStatement;
+    LabeledStatement labeledStatement =
+        parseStatement('foo: while (true) { break foo; }');
+    WhileStatement whileStatement = labeledStatement.statement;
+    BreakStatement statement = (whileStatement.body as Block).statements[0];
     assertNoErrors();
     expect(statement.breakKeyword, isNotNull);
     expect(statement.label, isNotNull);
@@ -14724,24 +14746,30 @@
   }
 
   void test_parseBreakStatement_noLabel() {
-    var statement = parseStatement('break;') as BreakStatement;
-    assertErrorsWithCodes([ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+    WhileStatement whileStatement = parseStatement('while (true) { break; }');
+    BreakStatement statement = (whileStatement.body as Block).statements[0];
+    assertNoErrors();
     expect(statement.breakKeyword, isNotNull);
     expect(statement.label, isNull);
     expect(statement.semicolon, isNotNull);
   }
 
   void test_parseContinueStatement_label() {
-    var statement = parseStatement('continue foo;') as ContinueStatement;
-    assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    LabeledStatement labeledStatement =
+        parseStatement('foo: while (true) { continue foo; }');
+    WhileStatement whileStatement = labeledStatement.statement;
+    ContinueStatement statement = (whileStatement.body as Block).statements[0];
+    assertNoErrors();
     expect(statement.continueKeyword, isNotNull);
     expect(statement.label, isNotNull);
     expect(statement.semicolon, isNotNull);
   }
 
   void test_parseContinueStatement_noLabel() {
-    var statement = parseStatement('continue;') as ContinueStatement;
-    assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    WhileStatement whileStatement =
+        parseStatement('while (true) { continue; }');
+    ContinueStatement statement = (whileStatement.body as Block).statements[0];
+    assertNoErrors();
     expect(statement.continueKeyword, isNotNull);
     expect(statement.label, isNull);
     expect(statement.semicolon, isNotNull);
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 17789d4368..dc970a1 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -891,7 +891,7 @@
     - empty_constructor_bodies
 ''');
 
-    ContextRoot root = new ContextRoot(path, []);
+    ContextRoot root = new ContextRoot(pathContext, path, []);
     builder.getAnalysisOptions(path, contextRoot: root);
     expect(root.optionsFilePath, equals(filePath));
   }
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
index ab21c64..99320a1 100644
--- a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -21,8 +21,7 @@
 import 'package:front_end/src/fasta/constant_context.dart';
 import 'package:front_end/src/fasta/dill/dill_target.dart';
 import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/body_builder.dart' hide Identifier;
-import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart' hide Identifier;
 import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
 import "package:front_end/src/fasta/kernel/kernel_target.dart";
 import 'package:front_end/src/fasta/modifier.dart' as Modifier;
@@ -514,7 +513,7 @@
         false /* strong mode */,
       ));
 
-      BodyBuilder builder = new AstBodyBuilder(
+      AstBodyBuilder builder = new AstBodyBuilder(
         library,
         procedureBuilder,
         library.scope,
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
index 1b2fdee..06105e3 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
@@ -12,47 +12,116 @@
 
 class AnnotationTest extends PartialCodeTest {
   buildAll() {
-    List<TestDescriptor> descriptors = <TestDescriptor>[
-      new TestDescriptor(
-        'ampersand',
-        '@',
-        [ParserErrorCode.MISSING_IDENTIFIER],
-        '@_s_',
-        allFailing: true,
-      ),
-      new TestDescriptor(
-        'leftParen',
-        '@a(',
-        [ParserErrorCode.EXPECTED_TOKEN],
-        '@a()',
-        allFailing: true,
-      ),
-    ];
     buildTests(
       'annotation_topLevel',
-      expectErrors(descriptors, [ParserErrorCode.EXPECTED_EXECUTABLE]),
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_EXECUTABLE
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_EXECUTABLE]),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_EXECUTABLE
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_EXECUTABLE]),
+      ],
       [],
     );
     buildTests(
       'annotation_topLevel',
-      descriptors,
+      [
+        new TestDescriptor(
+            'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+            failing: ['typedef', 'functionNonVoid', 'getter', 'setter']),
+        new TestDescriptor(
+            'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
+            allFailing: true),
+      ],
       PartialCodeTest.declarationSuffixes,
       includeEof: false,
     );
+
     buildTests(
       'annotation_classMember',
-      descriptors,
-      PartialCodeTest.classMemberSuffixes,
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_CLASS_MEMBER
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_CLASS_MEMBER]),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_CLASS_MEMBER
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_CLASS_MEMBER]),
+      ],
+      [],
       head: 'class C { ',
       tail: ' }',
     );
     buildTests(
+      'annotation_classMember',
+      [
+        new TestDescriptor(
+            'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+            failing: ['methodNonVoid', 'getter', 'setter']),
+        new TestDescriptor(
+            'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
+            allFailing: true),
+      ],
+      PartialCodeTest.classMemberSuffixes,
+      includeEof: false,
+      head: 'class C { ',
+      tail: ' }',
+    );
+
+    buildTests(
       'annotation_local',
-      expectErrors(descriptors, [
-        ParserErrorCode.EXPECTED_TOKEN,
-        ParserErrorCode.EXPECTED_TYPE_NAME,
-        ParserErrorCode.MISSING_IDENTIFIER,
-      ]),
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ]),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ]),
+      ],
       [],
       head: 'f() { ',
       tail: ' }',
@@ -60,24 +129,71 @@
     // TODO(brianwilkerson) Many of the combinations produced by the following
     // produce "valid" code that is not valid. Even when we recover the
     // annotation, the following statement is not allowed to have an annotation.
+    const localAllowed = const [
+      'localVariable',
+      'localFunctionNonVoid',
+      'localFunctionVoid'
+    ];
+    List<TestSuffix> localAnnotationAllowedSuffixes = PartialCodeTest
+        .statementSuffixes
+        .where((t) => localAllowed.contains(t.name))
+        .toList();
+    List<TestSuffix> localAnnotationNotAllowedSuffixes = PartialCodeTest
+        .statementSuffixes
+        .where((t) => !localAllowed.contains(t.name))
+        .toList();
+
     buildTests(
       'annotation_local',
-      descriptors,
-      PartialCodeTest.statementSuffixes,
-      head: 'f() { ',
+      [
+        new TestDescriptor(
+            'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+            failing: ['localFunctionNonVoid']),
+        new TestDescriptor(
+            'leftParen', '@a(', [ParserErrorCode.MISSING_IDENTIFIER], '@a()',
+            allFailing: true),
+      ],
+      localAnnotationAllowedSuffixes,
       includeEof: false,
+      head: 'f() { ',
+      tail: ' }',
+    );
+    buildTests(
+      'annotation_local',
+      [
+        new TestDescriptor(
+            'ampersand',
+            '@',
+            [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@_s_',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ],
+            failing: ['labeled']),
+        new TestDescriptor(
+            'leftParen',
+            '@a(',
+            [
+              ScannerErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER
+            ],
+            '@a()',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.EXPECTED_TOKEN
+            ],
+            allFailing: true),
+      ],
+      localAnnotationNotAllowedSuffixes,
+      includeEof: false,
+      head: 'f() { ',
       tail: ' }',
     );
   }
-
-  /**
-   * Return a list of descriptors just like the given [descriptors] except that
-   * they have the given list of [errors] as the errors that are expected to be
-   * in the valid code.
-   */
-  List<TestDescriptor> expectErrors(
-          List<TestDescriptor> descriptors, List<ParserErrorCode> errors) =>
-      descriptors
-          .map((descriptor) => descriptor.withExpectedErrorsInValidCode(errors))
-          .toList();
 }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
index 7c73192..fda0f64 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
@@ -12,20 +12,6 @@
 
 class ExportDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'import',
-      'export',
-      'part',
-      'class',
-      'typedef',
-      'functionVoid',
-      'functionNonVoid',
-      'var',
-      'const',
-      'final',
-      'getter',
-      'setter'
-    ];
     buildTests(
         'export_directive',
         [
@@ -51,7 +37,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' hide _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('hideName', "export 'a.dart' hide A",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A;"),
           new TestDescriptor(
@@ -62,7 +48,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' hide A, _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('hideCommaName', "export 'a.dart' hide A, B",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A, B;"),
           new TestDescriptor(
@@ -73,7 +59,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' hide A show _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor(
               'show',
               "export 'a.dart' show",
@@ -82,7 +68,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' show _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('showName', "export 'a.dart' show A",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A;"),
           new TestDescriptor(
@@ -93,7 +79,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' show A, _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('showCommaName', "export 'a.dart' show A, B",
               [ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A, B;"),
           new TestDescriptor(
@@ -104,7 +90,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "export 'a.dart' show A hide _s_;",
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
         ],
         PartialCodeTest.prePartSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index dd46a45..4c1c8e1 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -85,6 +85,15 @@
               ],
               "import 'a.dart' as _s_;",
               failing: ['functionNonVoid', 'getter']),
+          new TestDescriptor(
+              'show',
+              "import 'a.dart' show",
+              [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER
+              ],
+              "import 'a.dart' show _s_;",
+              failing: ['functionNonVoid', 'getter']),
         ],
         PartialCodeTest.prePartSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
index 7432c7f..24b5890 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
@@ -12,17 +12,18 @@
 
 class PartOfDirectivesTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'class',
+    List<String> identifiers = const [
       'typedef',
-      'functionVoid',
       'functionNonVoid',
-      'var',
-      'const',
-      'final',
       'getter',
       'setter'
     ];
+    List<TestSuffix> identifierSuffixes = PartialCodeTest.declarationSuffixes
+        .where((t) => identifiers.contains(t.name))
+        .toList();
+    List<TestSuffix> nonIdentifierSuffixes = PartialCodeTest.declarationSuffixes
+        .where((t) => !identifiers.contains(t.name))
+        .toList();
     buildTests(
         'part_of_directive',
         [
@@ -30,11 +31,31 @@
               'keyword',
               'part of',
               [
-                ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
+                ParserErrorCode.EXPECTED_STRING_LITERAL,
+                ParserErrorCode.EXPECTED_TOKEN
+              ],
+              'part of "";',
+              failing: []),
+        ],
+        nonIdentifierSuffixes);
+    buildTests(
+        'part_of_directive',
+        [
+          new TestDescriptor(
+              'keyword',
+              'part of',
+              [
+                ParserErrorCode.MISSING_IDENTIFIER,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               'part of _s_;',
-              allFailing: true),
+              failing: ['functionNonVoid', 'getter']),
+        ],
+        identifierSuffixes,
+        includeEof: false);
+    buildTests(
+        'part_of_directive',
+        [
           new TestDescriptor('name', 'part of lib',
               [ParserErrorCode.EXPECTED_TOKEN], 'library lib;',
               allFailing: true),
@@ -46,7 +67,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               'part of lib._s_;',
-              failing: allExceptEof),
+              failing: ['functionNonVoid', 'getter']),
           new TestDescriptor('nameDotName', 'part of lib.a',
               [ParserErrorCode.EXPECTED_TOKEN], 'part of lib.a;'),
           new TestDescriptor('emptyUri', "part of ''",
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index faaddf6..533c856 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -260,17 +260,6 @@
    */
   TestDescriptor(this.name, this.invalid, this.errorCodes, this.valid,
       {this.allFailing: false, this.failing, this.expectedErrorsInValidCode});
-
-  /**
-   * Return a new description that is exactly like this descriptor except with
-   * the given [expectedErrorsInValidCode].
-   */
-  TestDescriptor withExpectedErrorsInValidCode(
-          List<ErrorCode> expectedErrorsInValidCode) =>
-      new TestDescriptor(name, invalid, errorCodes, valid,
-          allFailing: allFailing,
-          failing: failing,
-          expectedErrorsInValidCode: expectedErrorsInValidCode);
 }
 
 /**
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
index af85dc1..d9da37e 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
@@ -43,7 +43,12 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "try {} on _s_ {}",
-              failing: allExceptEof),
+              failing: [
+                'block',
+                'labeled',
+                'localFunctionNonVoid',
+                'localFunctionVoid'
+              ]),
           new TestDescriptor('on_identifier', 'try {} on A',
               [ParserErrorCode.EXPECTED_TOKEN], "try {} on A {}",
               failing: ['block']),
diff --git a/pkg/build_integration/README.md b/pkg/build_integration/README.md
new file mode 100644
index 0000000..2b97b10
--- /dev/null
+++ b/pkg/build_integration/README.md
@@ -0,0 +1,4 @@
+## Package build\_integration
+
+This package contains libraries for integrating Dart tools with build systems
+like bazel and build\_runner.
diff --git a/pkg/front_end/lib/src/multi_root_file_system.dart b/pkg/build_integration/lib/file_system/multi_root.dart
similarity index 95%
rename from pkg/front_end/lib/src/multi_root_file_system.dart
rename to pkg/build_integration/lib/file_system/multi_root.dart
index a30e75f..1163d39 100644
--- a/pkg/front_end/lib/src/multi_root_file_system.dart
+++ b/pkg/build_integration/lib/file_system/multi_root.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// A file system that implements [CopilerOptions.multiRoots].
-library front_end.src.multi_roots_file_system;
-
 import 'dart:async';
 
 import 'package:front_end/src/api_prototype/file_system.dart';
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
new file mode 100644
index 0000000..cb58f97
--- /dev/null
+++ b/pkg/build_integration/pubspec.yaml
@@ -0,0 +1,9 @@
+name: build_integration
+version: 0.0.1
+author: Dart Team <misc@dartlang.org>
+description: >
+  Libraries for integrating Dart tools with build systems like bazel
+  and build_runner.
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/build_integration
+dependencies:
+  front_end: ^0.1.0
diff --git a/pkg/front_end/test/src/multi_root_file_system_test.dart b/pkg/build_integration/test/file_system/multi_root_test.dart
similarity index 97%
rename from pkg/front_end/test/src/multi_root_file_system_test.dart
rename to pkg/build_integration/test/file_system/multi_root_test.dart
index 9a29993..e86fc3f 100644
--- a/pkg/front_end/test/src/multi_root_file_system_test.dart
+++ b/pkg/build_integration/test/file_system/multi_root_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/multi_root_file_system.dart';
 
 import 'package:test/test.dart';
 
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index b7201df..4179a3b 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -60,45 +60,45 @@
     if (left.isInt && right.isInt) {
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
-      int resultValue = foldInts(leftInt.intValue, rightInt.intValue);
+      BigInt resultValue = foldInts(leftInt.intValue, rightInt.intValue);
       if (resultValue == null) return null;
       return DART_CONSTANT_SYSTEM.createInt(resultValue);
     }
     return null;
   }
 
-  int foldInts(int left, int right);
+  BigInt foldInts(BigInt left, BigInt right);
 }
 
 class BitOrOperation extends BinaryBitOperation {
   final String name = '|';
   const BitOrOperation();
-  int foldInts(int left, int right) => left | right;
+  BigInt foldInts(BigInt left, BigInt right) => left | right;
   apply(left, right) => left | right;
 }
 
 class BitAndOperation extends BinaryBitOperation {
   final String name = '&';
   const BitAndOperation();
-  int foldInts(int left, int right) => left & right;
+  BigInt foldInts(BigInt left, BigInt right) => left & right;
   apply(left, right) => left & right;
 }
 
 class BitXorOperation extends BinaryBitOperation {
   final String name = '^';
   const BitXorOperation();
-  int foldInts(int left, int right) => left ^ right;
+  BigInt foldInts(BigInt left, BigInt right) => left ^ right;
   apply(left, right) => left ^ right;
 }
 
 class ShiftLeftOperation extends BinaryBitOperation {
   final String name = '<<';
   const ShiftLeftOperation();
-  int foldInts(int left, int right) {
+  BigInt foldInts(BigInt left, BigInt right) {
     // TODO(floitsch): find a better way to guard against excessive shifts to
     // the left.
-    if (right > 100 || right < 0) return null;
-    return left << right;
+    if (right > new BigInt.from(100) || right < BigInt.zero) return null;
+    return left << right.toInt();
   }
 
   apply(left, right) => left << right;
@@ -107,9 +107,9 @@
 class ShiftRightOperation extends BinaryBitOperation {
   final String name = '>>';
   const ShiftRightOperation();
-  int foldInts(int left, int right) {
-    if (right < 0) return null;
-    return left >> right;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right < BigInt.zero) return null;
+    return left >> right.toInt();
   }
 
   apply(left, right) => left >> right;
@@ -150,7 +150,7 @@
     if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
       NumConstantValue rightNum = right;
-      num foldedValue;
+      var foldedValue;
       if (left.isInt && right.isInt) {
         IntConstantValue leftInt = leftNum;
         IntConstantValue rightInt = rightNum;
@@ -161,7 +161,7 @@
       // A division by 0 means that we might not have a folded value.
       if (foldedValue == null) return null;
       if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
-        assert(foldedValue is int);
+        assert(foldedValue is BigInt);
         return DART_CONSTANT_SYSTEM.createInt(foldedValue);
       } else {
         return DART_CONSTANT_SYSTEM.createDouble(foldedValue);
@@ -172,13 +172,14 @@
 
   bool isDivide() => false;
   bool isTruncatingDivide() => false;
-  num foldInts(int left, int right) => foldNums(left, right);
-  num foldNums(num left, num right);
+  foldInts(BigInt left, BigInt right);
+  foldNums(num left, num right);
 }
 
 class SubtractOperation extends ArithmeticNumOperation {
   final String name = '-';
   const SubtractOperation();
+  BigInt foldInts(BigInt left, BigInt right) => left - right;
   num foldNums(num left, num right) => left - right;
   apply(left, right) => left - right;
 }
@@ -186,6 +187,7 @@
 class MultiplyOperation extends ArithmeticNumOperation {
   final String name = '*';
   const MultiplyOperation();
+  BigInt foldInts(BigInt left, BigInt right) => left * right;
   num foldNums(num left, num right) => left * right;
   apply(left, right) => left * right;
 }
@@ -193,8 +195,8 @@
 class ModuloOperation extends ArithmeticNumOperation {
   final String name = '%';
   const ModuloOperation();
-  int foldInts(int left, int right) {
-    if (right == 0) return null;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
     return left % right;
   }
 
@@ -205,6 +207,7 @@
 class RemainderOperation extends ArithmeticNumOperation {
   final String name = 'remainder';
   const RemainderOperation();
+  BigInt foldInts(BigInt left, BigInt right) => null;
   // Not a defined constant operation.
   num foldNums(num left, num right) => null;
   apply(left, right) => left.remainder(right);
@@ -213,15 +216,15 @@
 class TruncatingDivideOperation extends ArithmeticNumOperation {
   final String name = '~/';
   const TruncatingDivideOperation();
-  int foldInts(int left, int right) {
-    if (right == 0) return null;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
     return left ~/ right;
   }
 
-  num foldNums(num left, num right) {
+  BigInt foldNums(num left, num right) {
     num ratio = left / right;
     if (ratio.isNaN || ratio.isInfinite) return null;
-    return ratio.truncate().toInt();
+    return new BigInt.from(ratio.truncate().toInt());
   }
 
   apply(left, right) => left ~/ right;
@@ -231,6 +234,7 @@
 class DivideOperation extends ArithmeticNumOperation {
   final String name = '/';
   const DivideOperation();
+  double foldInts(BigInt left, BigInt right) => left / right;
   num foldNums(num left, num right) => left / right;
   bool isDivide() => true;
   apply(left, right) => left / right;
@@ -243,7 +247,7 @@
     if (left.isInt && right.isInt) {
       IntConstantValue leftInt = left;
       IntConstantValue rightInt = right;
-      int result = leftInt.intValue + rightInt.intValue;
+      BigInt result = leftInt.intValue + rightInt.intValue;
       return DART_CONSTANT_SYSTEM.createInt(result);
     } else if (left.isNum && right.isNum) {
       NumConstantValue leftNum = left;
@@ -281,14 +285,14 @@
     return DART_CONSTANT_SYSTEM.createBool(foldedValue);
   }
 
-  bool foldInts(int left, int right);
+  bool foldInts(BigInt left, BigInt right);
   bool foldNums(num left, num right);
 }
 
 class LessOperation extends RelationalNumOperation {
   final String name = '<';
   const LessOperation();
-  bool foldInts(int left, int right) => left < right;
+  bool foldInts(BigInt left, BigInt right) => left < right;
   bool foldNums(num left, num right) => left < right;
   apply(left, right) => left < right;
 }
@@ -296,7 +300,7 @@
 class LessEqualOperation extends RelationalNumOperation {
   final String name = '<=';
   const LessEqualOperation();
-  bool foldInts(int left, int right) => left <= right;
+  bool foldInts(BigInt left, BigInt right) => left <= right;
   bool foldNums(num left, num right) => left <= right;
   apply(left, right) => left <= right;
 }
@@ -304,7 +308,7 @@
 class GreaterOperation extends RelationalNumOperation {
   final String name = '>';
   const GreaterOperation();
-  bool foldInts(int left, int right) => left > right;
+  bool foldInts(BigInt left, BigInt right) => left > right;
   bool foldNums(num left, num right) => left > right;
   apply(left, right) => left > right;
 }
@@ -312,7 +316,7 @@
 class GreaterEqualOperation extends RelationalNumOperation {
   final String name = '>=';
   const GreaterEqualOperation();
-  bool foldInts(int left, int right) => left >= right;
+  bool foldInts(BigInt left, BigInt right) => left >= right;
   bool foldNums(num left, num right) => left >= right;
   apply(left, right) => left >= right;
 }
@@ -387,10 +391,10 @@
       StringConstantValue stringConstant = left;
       IntConstantValue indexConstant = right;
       String string = stringConstant.stringValue;
-      int index = indexConstant.intValue;
+      int index = indexConstant.intValue.toInt();
       if (index < 0 || index >= string.length) return null;
       int value = string.codeUnitAt(index);
-      return DART_CONSTANT_SYSTEM.createInt(value);
+      return DART_CONSTANT_SYSTEM.createIntFromInt(value);
     }
     return null;
   }
@@ -442,7 +446,7 @@
   const DartConstantSystem();
 
   @override
-  IntConstantValue createInt(int i) => new IntConstantValue(i);
+  IntConstantValue createInt(BigInt i) => new IntConstantValue(i);
 
   @override
   DoubleConstantValue createDouble(double d) => new DoubleConstantValue(d);
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 2a3d5ee..c543720 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -59,7 +59,8 @@
 
   const ConstantSystem();
 
-  ConstantValue createInt(int i);
+  ConstantValue createInt(BigInt i);
+  ConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
   ConstantValue createDouble(double d);
   ConstantValue createString(String string);
   ConstantValue createBool(bool value);
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index b590b23..7916753 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -235,7 +235,7 @@
 
 /// Integer literal constant.
 class IntConstantExpression extends ConstantExpression {
-  final int intValue;
+  final BigInt intValue;
 
   IntConstantExpression(this.intValue);
 
@@ -1533,7 +1533,8 @@
       return new NonConstantValue();
     } else {
       StringConstantValue stringValue = value;
-      return constantSystem.createInt(stringValue.stringValue.length);
+      return constantSystem
+          .createInt(new BigInt.from(stringValue.stringValue.length));
     }
   }
 
@@ -1907,9 +1908,9 @@
       StringConstantValue nameStringConstantValue = nameConstantValue;
       String text =
           environment.readFromEnvironment(nameStringConstantValue.stringValue);
-      int value;
+      BigInt value;
       if (text != null) {
-        value = int.parse(text, onError: (_) => null);
+        value = BigInt.tryParse(text);
       }
       if (value == null) {
         return defaultConstantValue;
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index abf5d5a..48f4397 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -205,55 +205,38 @@
 }
 
 class IntConstantValue extends NumConstantValue {
-  final int intValue;
+  final BigInt intValue;
+
+  // Caching IntConstantValues representing -2 through 10 so that we don't have
+  // to create new ones every time those values are used.
+  static Map<BigInt, IntConstantValue> _cachedValues = {};
+
   double get doubleValue => intValue.toDouble();
 
-  factory IntConstantValue(int value) {
-    switch (value) {
-      case 0:
-        return const IntConstantValue._internal(0);
-      case 1:
-        return const IntConstantValue._internal(1);
-      case 2:
-        return const IntConstantValue._internal(2);
-      case 3:
-        return const IntConstantValue._internal(3);
-      case 4:
-        return const IntConstantValue._internal(4);
-      case 5:
-        return const IntConstantValue._internal(5);
-      case 6:
-        return const IntConstantValue._internal(6);
-      case 7:
-        return const IntConstantValue._internal(7);
-      case 8:
-        return const IntConstantValue._internal(8);
-      case 9:
-        return const IntConstantValue._internal(9);
-      case 10:
-        return const IntConstantValue._internal(10);
-      case -1:
-        return const IntConstantValue._internal(-1);
-      case -2:
-        return const IntConstantValue._internal(-2);
-      default:
-        return new IntConstantValue._internal(value);
+  factory IntConstantValue(BigInt value) {
+    var existing = _cachedValues[value];
+    if (existing != null) return existing;
+    var intConstantVal = new IntConstantValue._internal(value);
+    var intValue = value.toInt();
+    if (intValue <= -2 && intValue >= 10) {
+      _cachedValues[value] = intConstantVal;
     }
+    return intConstantVal;
   }
 
   const IntConstantValue._internal(this.intValue);
 
   bool get isInt => true;
 
-  bool isUInt31() => intValue >= 0 && intValue < (1 << 31);
+  bool isUInt31() => intValue.toUnsigned(31) == intValue;
 
-  bool isUInt32() => intValue >= 0 && intValue < (1 << 32);
+  bool isUInt32() => intValue.toUnsigned(32) == intValue;
 
-  bool isPositive() => intValue >= 0;
+  bool isPositive() => intValue >= BigInt.zero;
 
-  bool get isZero => intValue == 0;
+  bool get isZero => intValue == BigInt.zero;
 
-  bool get isOne => intValue == 1;
+  bool get isOne => intValue == BigInt.one;
 
   DartType getType(CommonElements types) => types.intType;
 
@@ -264,7 +247,7 @@
     return intValue == otherInt.intValue;
   }
 
-  int get hashCode => intValue & Hashing.SMI_MASK;
+  int get hashCode => intValue.hashCode & Hashing.SMI_MASK;
 
   accept(ConstantValueVisitor visitor, arg) => visitor.visitInt(this, arg);
 
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 2998bbf..c995cfb 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -615,8 +615,8 @@
     ConstantSystem constantSystem = _closedWorld.constantSystem;
     // The JavaScript backend may turn this literal into a double at
     // runtime.
-    return _types.getConcreteTypeFor(
-        computeTypeMask(_closedWorld, constantSystem.createInt(node.value)));
+    return _types.getConcreteTypeFor(computeTypeMask(
+        _closedWorld, constantSystem.createIntFromInt(node.value)));
   }
 
   @override
@@ -1012,7 +1012,7 @@
         ConstantValue value = _elementMap.getFieldConstantValue(member);
         if (value != null && value.isInt) {
           IntConstantValue intValue = value;
-          return intValue.intValue;
+          return intValue.intValue.toInt();
         }
       }
     }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 7188cf6..f1c234f 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -964,6 +964,7 @@
       CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
+      DartType asyncTypeParameter,
       SourceInformation bodySourceInformation,
       SourceInformation exitSourceInformation) {
     if (element.asyncMarker == AsyncMarker.SYNC) return code;
@@ -974,8 +975,8 @@
 
     switch (element.asyncMarker) {
       case AsyncMarker.ASYNC:
-        rewriter = _makeAsyncRewriter(
-            commonElements, elementEnvironment, registry, element, code, name);
+        rewriter = _makeAsyncRewriter(commonElements, elementEnvironment,
+            registry, element, code, asyncTypeParameter, name);
         break;
       case AsyncMarker.SYNC_STAR:
         rewriter = new SyncStarRewriter(reporter, element,
@@ -983,8 +984,7 @@
                 emitter.staticFunctionAccess(commonElements.endOfIteration),
             iterableFactory: emitter
                 .staticFunctionAccess(commonElements.syncStarIterableFactory),
-            iterableFactoryTypeArguments:
-                _fetchItemType(element, elementEnvironment),
+            iterableFactoryTypeArguments: _fetchItemType(asyncTypeParameter),
             yieldStarExpression:
                 emitter.staticFunctionAccess(commonElements.yieldStar),
             uncaughtErrorExpression: emitter
@@ -1006,8 +1006,7 @@
             wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
             newController: emitter.staticFunctionAccess(
                 commonElements.asyncStarStreamControllerFactory),
-            newControllerTypeArguments:
-                _fetchItemType(element, elementEnvironment),
+            newControllerTypeArguments: _fetchItemType(asyncTypeParameter),
             safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
             yieldExpression:
                 emitter.staticFunctionAccess(commonElements.yieldSingle),
@@ -1024,22 +1023,15 @@
     return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
   }
 
-  /// Returns an optional expression that evaluates the type argument to the
-  /// Future/Stream/Iterable.
-  /// Returns an empty list if the type is not needed.
-  /// Returns `null` if the type expression is determined by
-  /// the outside context and should be added as a function parameter.
-  List<jsAst.Expression> _fetchItemType(
-      FunctionEntity element, ElementEnvironment elementEnvironment) {
-    //DartType type =
-    //  elementEnvironment.getFunctionAsyncOrSyncStarElementType(element);
-
-    //if (!type.containsFreeTypeVariables) {
-    //  var ast = rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
-    //  return <jsAst.Expression>[ast];
-    //}
-
-    return null;
+  /// Returns an optional expression that evaluates [type].  Returns `null` if
+  /// the type expression is determined by the outside context and should be
+  /// added as a function parameter to the rewritten code.
+  // TODO(sra): We could also return an empty list if the generator takes no
+  // type (e.g. due to rtiNeed optimization).
+  List<jsAst.Expression> _fetchItemType(DartType type) {
+    if (type == null) return null;
+    var ast = rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
+    return <jsAst.Expression>[ast];
   }
 
   AsyncRewriter _makeAsyncRewriter(
@@ -1048,6 +1040,7 @@
       CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
+      DartType elementType,
       jsAst.Name name) {
     bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
 
@@ -1058,8 +1051,7 @@
         ? commonElements.asyncAwaitCompleterFactory
         : commonElements.syncCompleterFactory;
 
-    List<jsAst.Expression> itemTypeExpression =
-        _fetchItemType(element, elementEnvironment);
+    List<jsAst.Expression> itemTypeExpression = _fetchItemType(elementType);
 
     var rewriter = new AsyncRewriter(reporter, element,
         asyncStart: emitter.staticFunctionAccess(startFunction),
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index c5915dc..7069820 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -120,7 +120,7 @@
 
   @override
   jsAst.Expression visitInt(IntConstantValue constant, [_]) {
-    int value = constant.intValue;
+    BigInt value = constant.intValue;
     // Since we are in JavaScript we can shorten long integers to their shorter
     // exponential representation, for example: "1e4" is shorter than "10000".
     //
@@ -131,9 +131,9 @@
     String representation = value.toString();
     String alternative = null;
     int cutoff = _options.enableMinification ? 10000 : 1e10.toInt();
-    if (value.abs() >= cutoff) {
-      alternative =
-          _shortenExponentialRepresentation(value.toStringAsExponential());
+    if (value.abs() >= new BigInt.from(cutoff)) {
+      alternative = _shortenExponentialRepresentation(
+          value.toDouble().toStringAsExponential());
     }
     if (alternative != null && alternative.length < representation.length) {
       representation = alternative;
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index 26f845e..d454cf3 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -43,7 +43,7 @@
 
   JavaScriptConstantCompiler();
 
-  ConstantSystem get constantSystem => JAVA_SCRIPT_CONSTANT_SYSTEM;
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
 
   @override
   void registerLazyStatic(FieldEntity element) {
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index a2bd855..cb869ee 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -11,18 +11,18 @@
 import '../elements/types.dart';
 import '../elements/entities.dart';
 
-const JAVA_SCRIPT_CONSTANT_SYSTEM = const JavaScriptConstantSystem();
-
 class JavaScriptBitNotOperation extends BitNotOperation {
   const JavaScriptBitNotOperation();
 
   ConstantValue fold(ConstantValue constant) {
-    if (JAVA_SCRIPT_CONSTANT_SYSTEM.isInt(constant)) {
+    if (JavaScriptConstantSystem.only.isInt(constant)) {
       // In JavaScript we don't check for -0 and treat it as if it was zero.
-      if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
+      if (constant.isMinusZero) {
+        constant = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+      }
       IntConstantValue intConstant = constant;
       // We convert the result of bit-operations to 32 bit unsigned integers.
-      return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.intValue);
+      return JavaScriptConstantSystem.only.createInt32(~intConstant.intValue);
     }
     return null;
   }
@@ -41,12 +41,16 @@
 
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     // In JavaScript we don't check for -0 and treat it as if it was zero.
-    if (left.isMinusZero) left = DART_CONSTANT_SYSTEM.createInt(0);
-    if (right.isMinusZero) right = DART_CONSTANT_SYSTEM.createInt(0);
+    if (left.isMinusZero) {
+      left = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+    }
+    if (right.isMinusZero) {
+      right = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+    }
     IntConstantValue result = dartBitOperation.fold(left, right);
     if (result != null) {
       // We convert the result of bit-operations to 32 bit unsigned integers.
-      return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(result.intValue);
+      return JavaScriptConstantSystem.only.createInt32(result.intValue);
     }
     return result;
   }
@@ -61,9 +65,9 @@
     // Truncate the input value to 32 bits if necessary.
     if (left.isInt) {
       IntConstantValue intConstant = left;
-      int value = intConstant.intValue;
-      int truncatedValue = value & JAVA_SCRIPT_CONSTANT_SYSTEM.BITS32;
-      if (value < 0) {
+      BigInt value = intConstant.intValue;
+      BigInt truncatedValue = value & JavaScriptConstantSystem.only.BITS32;
+      if (value < BigInt.zero) {
         // Sign-extend if the input was negative. The current semantics don't
         // make much sense, since we only look at bit 31.
         // TODO(floitsch): we should treat the input to right shifts as
@@ -74,8 +78,8 @@
         // Example: 0xFFFFFFFF - 0x100000000 => -1.
         // We simply and with the sign-bit and multiply by two. If the sign-bit
         // was set, then the result is 0. Otherwise it will become 2^32.
-        final int SIGN_BIT = 0x80000000;
-        truncatedValue -= 2 * (truncatedValue & SIGN_BIT);
+        final BigInt SIGN_BIT = new BigInt.from(0x80000000);
+        truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
       }
       if (value != truncatedValue) {
         left = DART_CONSTANT_SYSTEM.createInt(truncatedValue);
@@ -95,8 +99,8 @@
   ConstantValue fold(ConstantValue constant) {
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      if (intConstant.intValue == 0) {
-        return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0);
+      if (intConstant.intValue == BigInt.zero) {
+        return JavaScriptConstantSystem.only.createDouble(-0.0);
       }
     }
     return dartNegateOperation.fold(constant);
@@ -112,7 +116,7 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     ConstantValue result = _addOperation.fold(left, right);
     if (result != null && result.isNum) {
-      return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+      return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
     }
     return result;
   }
@@ -125,8 +129,8 @@
 
   const JavaScriptRemainderOperation();
 
-  int foldInts(int left, int right) {
-    if (right == 0) return null;
+  BigInt foldInts(BigInt left, BigInt right) {
+    if (right == BigInt.zero) return null;
     return left.remainder(right);
   }
 
@@ -144,7 +148,7 @@
   ConstantValue fold(ConstantValue left, ConstantValue right) {
     ConstantValue result = dartArithmeticOperation.fold(left, right);
     if (result == null) return result;
-    return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+    return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
   }
 
   apply(left, right) => dartArithmeticOperation.apply(left, right);
@@ -186,7 +190,7 @@
   ConstantValue fold(ConstantValue constant) {
     // Be careful to round() only values that do not throw on either the host or
     // target platform.
-    ConstantValue tryToRound(num value) {
+    ConstantValue tryToRound(double value) {
       // Due to differences between browsers, only 'round' easy cases. Avoid
       // cases where nudging the value up or down changes the answer.
       // 13 digits is safely within the ~15 digit precision of doubles.
@@ -196,13 +200,13 @@
       double rounded1 = (value * (1.0 + severalULP)).roundToDouble();
       double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
       if (rounded != rounded1 || rounded != rounded2) return null;
-      return JAVA_SCRIPT_CONSTANT_SYSTEM
-          .convertToJavaScriptConstant(new IntConstantValue(value.round()));
+      return JavaScriptConstantSystem.only.convertToJavaScriptConstant(
+          new IntConstantValue(new BigInt.from(value.round())));
     }
 
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      int value = intConstant.intValue;
+      double value = intConstant.intValue.toDouble();
       if (value >= -double.maxFinite && value <= double.maxFinite) {
         return tryToRound(value);
       }
@@ -224,7 +228,7 @@
  * compiled to JavaScript.
  */
 class JavaScriptConstantSystem extends ConstantSystem {
-  final int BITS32 = 0xFFFFFFFF;
+  final BITS32 = new BigInt.from(0xFFFFFFFF);
 
   final add = const JavaScriptAddOperation();
   final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
@@ -260,13 +264,16 @@
   final round = const JavaScriptRoundOperation();
   final abs = const UnfoldedUnaryOperation('abs');
 
-  const JavaScriptConstantSystem();
+  static final JavaScriptConstantSystem only =
+      new JavaScriptConstantSystem._internal();
+
+  JavaScriptConstantSystem._internal();
 
   /**
    * Returns true if [value] will turn into NaN or infinity
    * at runtime.
    */
-  bool integerBecomesNanOrInfinity(int value) {
+  bool integerBecomesNanOrInfinity(BigInt value) {
     double doubleValue = value.toDouble();
     return doubleValue.isNaN || doubleValue.isInfinite;
   }
@@ -274,13 +281,13 @@
   NumConstantValue convertToJavaScriptConstant(NumConstantValue constant) {
     if (constant.isInt) {
       IntConstantValue intConstant = constant;
-      int intValue = intConstant.intValue;
+      BigInt intValue = intConstant.intValue;
       if (integerBecomesNanOrInfinity(intValue)) {
         return new DoubleConstantValue(intValue.toDouble());
       }
       // If the integer loses precision with JavaScript numbers, use
       // the floored version JavaScript will use.
-      int floorValue = intValue.toDouble().floor().toInt();
+      BigInt floorValue = new BigInt.from(intValue.toDouble());
       if (floorValue != intValue) {
         return new IntConstantValue(floorValue);
       }
@@ -290,9 +297,9 @@
       if (!doubleValue.isInfinite &&
           !doubleValue.isNaN &&
           !constant.isMinusZero) {
-        int intValue = doubleValue.truncate();
-        if (intValue == doubleValue) {
-          return new IntConstantValue(intValue);
+        double truncated = doubleValue.truncateToDouble();
+        if (truncated == doubleValue) {
+          return new IntConstantValue(new BigInt.from(truncated));
         }
       }
     }
@@ -300,11 +307,11 @@
   }
 
   @override
-  NumConstantValue createInt(int i) {
+  NumConstantValue createInt(BigInt i) {
     return convertToJavaScriptConstant(new IntConstantValue(i));
   }
 
-  NumConstantValue createInt32(int i) => new IntConstantValue(i & BITS32);
+  NumConstantValue createInt32(BigInt i) => new IntConstantValue(i & BITS32);
   NumConstantValue createDouble(double d) =>
       convertToJavaScriptConstant(new DoubleConstantValue(d));
   StringConstantValue createString(String string) {
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index b732c81..4ce047a 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -1893,7 +1893,7 @@
   @override
   void visitInt(IntConstantValue constant, [_]) {
     // No `addRoot` since IntConstants are always inlined.
-    if (constant.intValue < 0) {
+    if (constant.intValue < BigInt.zero) {
       add('m${-constant.intValue}');
     } else {
       add('${constant.intValue}');
@@ -2088,7 +2088,11 @@
 
   @override
   int visitInt(IntConstantValue constant, [_]) {
-    return _hashInt(constant.intValue);
+    BigInt value = constant.intValue;
+    if (value.toSigned(32) == value) {
+      return value.toUnsigned(32).toInt() & _MASK;
+    }
+    return _hashDouble(value.toDouble());
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 43e81b6..c86157d 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -143,8 +143,9 @@
     return new JConstructorBody(constructor);
   }
 
-  JGeneratorBody createGeneratorBody(FunctionEntity function) {
-    return new JGeneratorBody(function);
+  JGeneratorBody createGeneratorBody(
+      FunctionEntity function, DartType elementType) {
+    return new JGeneratorBody(function, elementType);
   }
 
   IndexedFunction createGetter(LibraryEntity library,
@@ -504,9 +505,10 @@
 
 class JGeneratorBody extends JFunction {
   final FunctionEntity function;
+  final DartType elementType;
   final int hashCode;
 
-  JGeneratorBody(this.function)
+  JGeneratorBody(this.function, this.elementType)
       : hashCode = function.hashCode + 1, // Hack stabilize sort order.
         super(function.library, function.enclosingClass, function.memberName,
             function.parameterStructure, function.asyncMarker,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index c4c47a1..28e67b6 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -346,7 +346,7 @@
         elementEnvironment: _elementEnvironment,
         dartTypes: _elementMap.types,
         commonElements: _commonElements,
-        constantSystem: const JavaScriptConstantSystem(),
+        constantSystem: JavaScriptConstantSystem.only,
         backendUsage: backendUsage,
         noSuchMethodData: noSuchMethodData,
         nativeData: nativeData,
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index a6e104d..fe02b86 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1881,7 +1881,7 @@
   KernelConstantEnvironment(this._elementMap, this._environment);
 
   @override
-  ConstantSystem get constantSystem => const JavaScriptConstantSystem();
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
 
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
@@ -2920,12 +2920,13 @@
   }
 
   JGeneratorBody getGeneratorBody(covariant IndexedFunction function) {
-    FunctionData functionData = _members.getData(function);
-    ir.TreeNode node = functionData.definition.node;
-    // TODO(sra): Maybe store this in the FunctionData.
     JGeneratorBody generatorBody = _generatorBodies[function];
     if (generatorBody == null) {
-      generatorBody = createGeneratorBody(function);
+      FunctionData functionData = _members.getData(function);
+      ir.TreeNode node = functionData.definition.node;
+      DartType elementType =
+          _elementEnvironment.getFunctionAsyncOrSyncStarElementType(function);
+      generatorBody = createGeneratorBody(function, elementType);
       _members.register<IndexedFunction, FunctionData>(
           generatorBody,
           new GeneratorBodyFunctionData(
@@ -2942,7 +2943,8 @@
     return generatorBody;
   }
 
-  JGeneratorBody createGeneratorBody(FunctionEntity function);
+  JGeneratorBody createGeneratorBody(
+      FunctionEntity function, DartType elementType);
 }
 
 class KernelClassQueries extends ClassQueries {
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index a7f7901..c661c48 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -295,7 +295,7 @@
         assert(constant.fields.length == 1 || constant.fields.length == 2);
         ConstantValue indexConstant = constant.fields.values.first;
         if (indexConstant is IntConstantValue) {
-          return indexConstant.intValue;
+          return indexConstant.intValue.toInt();
         }
       }
     }
@@ -604,7 +604,7 @@
 
   @override
   ConstantExpression visitIntLiteral(ir.IntLiteral node) {
-    return new IntConstantExpression(node.value);
+    return new IntConstantExpression(new BigInt.from(node.value));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 26834cf..c8a203c 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1013,37 +1013,19 @@
         isStatement: true));
   }
 
-  /// Builds a SSA graph for a sync*/async/async* generator.
+  /// Builds a SSA graph for a sync*/async/async* generator.  We generate a
+  /// entry function which tail-calls a body function. The entry contains
+  /// per-invocation checks and the body, which is later transformed, contains
+  /// the re-entrant 'state machine' code.
   void buildGenerator(FunctionEntity function, ir.FunctionNode functionNode) {
-    // TODO(sra): Optimize by generating a merged entry + body when (1) there
-    // are no checks in the entry and (2) the element type is simple.
-    if (true == true) {
-      buildGeneratorEntry(function, functionNode);
-    } else {
-      openFunction(function, functionNode);
-      functionNode.body.accept(this);
-      closeFunction();
-    }
-  }
-
-  /// Builds a SSA graph for a sync*/async/async* generator body.
-  void buildGeneratorEntry(
-      FunctionEntity function, ir.FunctionNode functionNode) {
-    graph.isGeneratorEntry = true;
-
-    // TODO(sra): Omit entry checks.
     openFunction(function, functionNode);
 
-    // Generate type argument for generator class.
-
-    // Tail-call body.
-    JGeneratorBody body = _elementMap.getGeneratorBody(function);
-    backend.outputUnitData.registerColocatedMembers(function, body);
+    // Prepare to tail-call the body.
 
     // Is 'buildAsyncBody' the best location for the entry?
     var sourceInformation = _sourceInformationBuilder.buildAsyncBody();
 
-    // Forward all the parameters.
+    // Forward all the parameters to the body.
     List<HInstruction> inputs = <HInstruction>[];
     if (graph.thisInstruction != null) {
       inputs.add(graph.thisInstruction);
@@ -1061,8 +1043,29 @@
     // Add the type parameter for the generator's element type.
     DartType elementType = _elementMap.elementEnvironment
         .getAsyncOrSyncStarElementType(function.asyncMarker, _returnType);
-    inputs.add(typeBuilder.analyzeTypeArgument(elementType, function));
 
+    if (elementType.containsFreeTypeVariables) {
+      // Type must be computed in the entry function, where the type variables
+      // are in scope, and passed to the body function.
+      inputs.add(typeBuilder.analyzeTypeArgument(elementType, function));
+    } else {
+      // Types with no type variables can be emitted as part of the generator,
+      // avoiding an extra argument.
+      if (_generatedEntryIsEmpty()) {
+        // If the entry function is empty (e.g. no argument checks) and the type
+        // can be generated in body, 'inline' the body by generating it in
+        // place. This works because the subsequent transformation of the code
+        // is 'correct' for the empty entry function code.
+        graph.needsAsyncRewrite = true;
+        graph.asyncElementType = elementType;
+        functionNode.body.accept(this);
+        closeFunction();
+        return;
+      }
+    }
+
+    JGeneratorBody body = _elementMap.getGeneratorBody(function);
+    backend.outputUnitData.registerColocatedMembers(function, body);
     push(new HInvokeGeneratorBody(
         body,
         inputs,
@@ -1078,13 +1081,28 @@
   /// Builds a SSA graph for a sync*/async/async* generator body.
   void buildGeneratorBody(
       JGeneratorBody function, ir.FunctionNode functionNode) {
-    // TODO(sra): Omit entry checks.
     FunctionEntity entry = function.function;
     openFunction(entry, functionNode);
+    graph.needsAsyncRewrite = true;
+    if (!function.elementType.containsFreeTypeVariables) {
+      // We can generate the element type in place
+      graph.asyncElementType = function.elementType;
+    }
     functionNode.body.accept(this);
     closeFunction();
   }
 
+  bool _generatedEntryIsEmpty() {
+    HBasicBlock block = current;
+    // If `block.id` is not 1 then we generated some control flow.
+    if (block.id != 1) return false;
+    for (HInstruction node = block.first; node != null; node = node.next) {
+      if (node is HGoto) continue;
+      return false;
+    }
+    return true;
+  }
+
   void _potentiallyAddFunctionParameterTypeChecks(ir.FunctionNode function) {
     // Put the type checks in the first successor of the entry,
     // because that is where the type guards will also be inserted.
@@ -1107,6 +1125,7 @@
         return;
       }
       HInstruction newParameter = localsHandler.directLocals[local];
+
       newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
           newParameter, _getDartTypeIfValid(variable.type));
       localsHandler.directLocals[local] = newParameter;
@@ -1225,20 +1244,20 @@
     }
   }
 
-  void openFunction(MemberEntity member, [ir.FunctionNode function]) {
+  void openFunction(MemberEntity member, [ir.FunctionNode functionNode]) {
     Map<Local, TypeMask> parameterMap = <Local, TypeMask>{};
-    if (function != null) {
+    if (functionNode != null) {
       void handleParameter(ir.VariableDeclaration node) {
         Local local = localsMap.getLocalVariable(node);
         parameterMap[local] =
             _typeInferenceMap.getInferredTypeOfParameter(local);
       }
 
-      function.positionalParameters.forEach(handleParameter);
-      function.namedParameters.toList()
+      functionNode.positionalParameters.forEach(handleParameter);
+      functionNode.namedParameters.toList()
         ..sort(namedOrdering)
         ..forEach(handleParameter);
-      _returnType = _elementMap.getDartType(function.returnType);
+      _returnType = _elementMap.getDartType(functionNode.returnType);
     }
 
     HBasicBlock block = graph.addNewBlock();
@@ -1258,8 +1277,8 @@
     _addClassTypeVariablesIfNeeded(member);
     _addFunctionTypeVariablesIfNeeded(member);
 
-    if (function != null) {
-      _potentiallyAddFunctionParameterTypeChecks(function);
+    if (functionNode != null) {
+      _potentiallyAddFunctionParameterTypeChecks(functionNode);
     }
     _insertTraceCall(member);
     _insertCoverageCall(member);
@@ -2361,7 +2380,9 @@
 
       List<ConstantValue> getConstants(
           ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) {
-        return <ConstantValue>[constantSystem.createInt(caseIndex[switchCase])];
+        return <ConstantValue>[
+          constantSystem.createIntFromInt(caseIndex[switchCase])
+        ];
       }
 
       void buildSwitchCase(ir.SwitchCase switchCase) {
@@ -4278,7 +4299,7 @@
     add(argumentNamesInstruction);
 
     ConstantValue kindConstant =
-        constantSystem.createInt(selector.invocationMirrorKind);
+        constantSystem.createIntFromInt(selector.invocationMirrorKind);
 
     _pushStaticInvocation(
         _commonElements.createInvocationMirror,
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 5d70634..1e94b01 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -47,7 +47,7 @@
 
   String get name => 'SSA code generator';
 
-  js.Fun buildJavaScriptFunction(bool isGeneratorEntry, FunctionEntity element,
+  js.Fun buildJavaScriptFunction(bool needsAsyncRewrite, FunctionEntity element,
       List<js.Parameter> parameters, js.Block body) {
     js.Fun finish(js.AsyncModifier asyncModifier) {
       return new js.Fun(parameters, body, asyncModifier: asyncModifier)
@@ -56,15 +56,17 @@
               .buildDeclaration(element));
     }
 
-    if (isGeneratorEntry) return finish(const js.AsyncModifier.sync());
-
-    return finish(element.asyncMarker.isAsync
-        ? (element.asyncMarker.isYielding
-            ? const js.AsyncModifier.asyncStar()
-            : const js.AsyncModifier.async())
-        : (element.asyncMarker.isYielding
-            ? const js.AsyncModifier.syncStar()
-            : const js.AsyncModifier.sync()));
+    if (needsAsyncRewrite) {
+      return finish(element.asyncMarker.isAsync
+          ? (element.asyncMarker.isYielding
+              ? const js.AsyncModifier.asyncStar()
+              : const js.AsyncModifier.async())
+          : (element.asyncMarker.isYielding
+              ? const js.AsyncModifier.syncStar()
+              : const js.AsyncModifier.sync()));
+    } else {
+      return finish(const js.AsyncModifier.sync());
+    }
   }
 
   js.Expression generateCode(
@@ -122,7 +124,7 @@
           work);
       codegen.visitGraph(graph);
       backend.tracer.traceGraph("codegen", graph);
-      return buildJavaScriptFunction(graph.isGeneratorEntry, work.element,
+      return buildJavaScriptFunction(graph.needsAsyncRewrite, work.element,
           codegen.parameters, codegen.body);
     });
   }
@@ -271,7 +273,7 @@
     int constant(HInstruction instruction) {
       if (instruction is HConstant && instruction.isConstantInteger()) {
         IntConstantValue constant = instruction.constant;
-        return constant.intValue;
+        return constant.intValue.toInt();
       }
       return null;
     }
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index ac8576f..e5b0003 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -660,16 +660,16 @@
     if (!instruction.isConstantInteger()) return false;
     HConstant rightConstant = instruction;
     IntConstantValue intConstant = rightConstant.constant;
-    int count = intConstant.intValue;
-    return count != 0;
+    BigInt count = intConstant.intValue;
+    return count != BigInt.zero;
   }
 
   bool isTwoOrGreater(HInstruction instruction) {
     if (!instruction.isConstantInteger()) return false;
     HConstant rightConstant = instruction;
     IntConstantValue intConstant = rightConstant.constant;
-    int count = intConstant.intValue;
-    return count >= 2;
+    BigInt count = intConstant.intValue;
+    return count >= BigInt.two;
   }
 
   bool hasUint31Result(HInstruction instruction, ClosedWorld closedWorld) {
@@ -750,7 +750,9 @@
     if (instruction.isConstantInteger()) {
       HConstant rightConstant = instruction;
       IntConstantValue intConstant = rightConstant.constant;
-      int value = intConstant.intValue;
+      int value = intConstant.intValue.toInt();
+      assert(intConstant.intValue ==
+          new BigInt.from(intConstant.intValue.toInt()));
       return value >= low && value <= high;
     }
     // TODO(sra): Integrate with the bit-width analysis in codegen.dart.
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 28185e0..8e731b7 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -235,8 +235,8 @@
 
   @override
   void visitIntLiteral(ir.IntLiteral literal) {
-    impactBuilder
-        .registerConstantLiteral(new IntConstantExpression(literal.value));
+    impactBuilder.registerConstantLiteral(
+        new IntConstantExpression(new BigInt.from(literal.value)));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 7d6720a..04c906f 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -16,6 +16,7 @@
 import '../js_backend/js_backend.dart';
 import '../native/native.dart' as native;
 import '../types/abstract_value_domain.dart';
+import '../types/masks.dart' show TypeMask;
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
 import '../util/util.dart';
@@ -207,9 +208,13 @@
   HBasicBlock exit;
   HThis thisInstruction;
 
-  /// `true` if a sync*/async/async* method is split into an entry and a body
-  /// and this graph is for the entry, which should not be rewritten.
-  bool isGeneratorEntry = false;
+  /// `true` if this graph should be transformed by a sync*/async/async*
+  /// rewrite.
+  bool needsAsyncRewrite = false;
+
+  /// If this function requires an async rewrite, this is the element type of
+  /// the generator.
+  DartType asyncElementType;
 
   /// Receiver parameter, set for methods using interceptor calling convention.
   HParameterValue explicitReceiverParameter;
@@ -291,7 +296,8 @@
   }
 
   HConstant addConstantInt(int i, ClosedWorld closedWorld) {
-    return addConstant(closedWorld.constantSystem.createInt(i), closedWorld);
+    return addConstant(
+        closedWorld.constantSystem.createIntFromInt(i), closedWorld);
   }
 
   HConstant addConstantDouble(double d, ClosedWorld closedWorld) {
@@ -3164,6 +3170,42 @@
         receiverTypeCheckSelector == other.receiverTypeCheckSelector;
   }
 
+  bool isRedundant(ClosedWorld closedWorld) {
+    AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+    DartType type = typeExpression;
+    if (type != null) {
+      if (type.isMalformed) {
+        // Malformed types are treated as dynamic statically, but should
+        // throw a type error at runtime.
+        return false;
+      }
+      if (type.isTypeVariable) {
+        return false;
+      }
+      if (type.isFutureOr) {
+        // `null` always passes type conversion.
+        if (checkedInput.isNull(abstractValueDomain)) return true;
+        // TODO(johnniwinther): Optimize FutureOr type conversions.
+        return false;
+      }
+      if (!type.treatAsRaw) {
+        // `null` always passes type conversion.
+        if (checkedInput.isNull(abstractValueDomain)) return true;
+        return false;
+      }
+      if (type.isFunctionType) {
+        // `null` always passes type conversion.
+        if (checkedInput.isNull(abstractValueDomain)) return true;
+        // TODO(johnniwinther): Optimize function type conversions.
+        return false;
+      }
+    }
+    // Type is refined from `dynamic`, so it might become non-redundant.
+    if (abstractValueDomain.containsAll(checkedType)) return false;
+    TypeMask inputType = checkedInput.instructionType;
+    return inputType.isInMask(checkedType, closedWorld);
+  }
+
   String toString() => 'HTypeConversion(type=$typeExpression, kind=$kind, '
       '${hasTypeRepresentation ? 'representation=$typeRepresentation, ' : ''}'
       'checkedInput=$checkedInput)';
@@ -3205,6 +3247,13 @@
     return knownType == other.knownType &&
         instructionType == other.instructionType;
   }
+
+  bool isRedundant(ClosedWorld closedWorld) {
+    AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+    if (abstractValueDomain.containsAll(knownType)) return false;
+    TypeMask inputType = checkedInput.instructionType;
+    return inputType.isInMask(knownType, closedWorld);
+  }
 }
 
 class HRangeConversion extends HCheck {
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index f521421..0b25f85 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -925,54 +925,11 @@
   }
 
   HInstruction visitTypeConversion(HTypeConversion node) {
-    DartType type = node.typeExpression;
-    if (type != null) {
-      if (type.isMalformed) {
-        // Malformed types are treated as dynamic statically, but should
-        // throw a type error at runtime.
-        return node;
-      }
-      if (type.isTypeVariable) {
-        return node;
-      }
-      if (type.isFutureOr) {
-        HInstruction input = node.checkedInput;
-        // `null` always passes type conversion.
-        if (input.isNull(_abstractValueDomain)) return input;
-        // TODO(johnniwinther): Optimize FutureOr type conversions.
-        return node;
-      }
-      if (!type.treatAsRaw) {
-        HInstruction input = node.checkedInput;
-        // `null` always passes type conversion.
-        if (input.isNull(_abstractValueDomain)) return input;
-        // TODO(sra): We can statically check [input] if it is a constructor.
-        // TODO(sra): We can statically check [input] if it is load from a field
-        // of the same ground type, or load from a field of a parameterized type
-        // with the same receiver.
-        return node;
-      }
-      if (type.isFunctionType) {
-        HInstruction input = node.checkedInput;
-        // `null` always passes type conversion.
-        if (input.isNull(_abstractValueDomain)) return input;
-        // TODO(johnniwinther): Optimize function type conversions.
-        // TODO(sra): We can statically check [input] if it is a closure getter.
-        return node;
-      }
-    }
-    return removeIfCheckAlwaysSucceeds(node, node.checkedType);
+    return node.isRedundant(_closedWorld) ? node.checkedInput : node;
   }
 
   HInstruction visitTypeKnown(HTypeKnown node) {
-    return removeIfCheckAlwaysSucceeds(node, node.knownType);
-  }
-
-  HInstruction removeIfCheckAlwaysSucceeds(HCheck node, TypeMask checkedType) {
-    if (checkedType.containsAll(_closedWorld)) return node;
-    HInstruction input = node.checkedInput;
-    TypeMask inputType = input.instructionType;
-    return inputType.isInMask(checkedType, _closedWorld) ? input : node;
+    return node.isRedundant(_closedWorld) ? node.checkedInput : node;
   }
 
   FieldEntity findConcreteFieldForDynamicAccess(
@@ -1048,7 +1005,7 @@
       List<ConstantValue> entries = list.entries;
       HConstant indexInstruction = node.index;
       IntConstantValue indexConstant = indexInstruction.constant;
-      int index = indexConstant.intValue;
+      int index = indexConstant.intValue.toInt();
       if (index >= 0 && index < entries.length) {
         return _graph.addConstant(entries[index], _closedWorld);
       }
@@ -2029,20 +1986,20 @@
           switchRange.upper is IntValue) {
         IntValue lowerValue = switchRange.lower;
         IntValue upperValue = switchRange.upper;
-        int lower = lowerValue.value;
-        int upper = upperValue.value;
-        Set<int> liveLabels = new Set<int>();
+        BigInt lower = lowerValue.value;
+        BigInt upper = upperValue.value;
+        Set<BigInt> liveLabels = new Set<BigInt>();
         for (int pos = 1; pos < node.inputs.length; pos++) {
           HConstant input = node.inputs[pos];
           if (!input.isConstantInteger()) continue;
           IntConstantValue constant = input.constant;
-          int label = constant.intValue;
+          BigInt label = constant.intValue;
           if (!liveLabels.contains(label) && label <= upper && label >= lower) {
             markBlockLive(node.block.successors[pos - 1]);
             liveLabels.add(label);
           }
         }
-        if (liveLabels.length != upper - lower + 1) {
+        if (new BigInt.from(liveLabels.length) != upper - lower + BigInt.one) {
           markBlockLive(node.defaultTarget);
         }
         return;
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index def9ec7..f757a85 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -7,8 +7,7 @@
 import '../common/codegen.dart' show CodegenWorkItem, CodegenRegistry;
 import '../common/tasks.dart' show CompilerTask, Measurer;
 import '../constants/values.dart';
-import '../elements/entities.dart'
-    show FieldEntity, FunctionEntity, MemberEntity;
+import '../elements/entities.dart' show FieldEntity, MemberEntity;
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
 import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler;
@@ -45,7 +44,7 @@
     optimizer.optimize(work, graph, closedWorld);
     MemberEntity element = work.element;
     js.Expression result = generator.generateCode(work, graph, closedWorld);
-    if (element is FunctionEntity && !graph.isGeneratorEntry) {
+    if (graph.needsAsyncRewrite) {
       SourceInformationBuilder sourceInformationBuilder =
           backend.sourceInformationStrategy.createBuilderForContext(element);
       result = backend.rewriteAsync(
@@ -54,6 +53,7 @@
           work.registry,
           element,
           result,
+          graph.asyncElementType,
           sourceInformationBuilder.buildAsyncBody(),
           sourceInformationBuilder.buildAsyncExit());
     }
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 81268b8..6e4c5bb 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -72,6 +72,9 @@
     // a similar operation on `registry`; otherwise, this one might not be
     // needed.
     builder.registry?.registerTypeUse(new TypeUse.isCheck(type));
+    if (other is HTypeConversion && other.isRedundant(builder.closedWorld)) {
+      return original;
+    }
     return other;
   }
 
@@ -79,6 +82,9 @@
     if (type == null) return original;
     HInstruction trusted = _trustType(original, type);
     if (trusted == original) return original;
+    if (trusted is HTypeKnown && trusted.isRedundant(builder.closedWorld)) {
+      return original;
+    }
     builder.add(trusted);
     return trusted;
   }
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 97b75ff..71f4e24 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -16,11 +16,11 @@
   IntValue intOne;
 
   ValueRangeInfo(this.constantSystem) {
-    intZero = newIntValue(0);
-    intOne = newIntValue(1);
+    intZero = newIntValue(BigInt.zero);
+    intOne = newIntValue(BigInt.one);
   }
 
-  Value newIntValue(int value) {
+  Value newIntValue(BigInt value) {
     return new IntValue(value, this);
   }
 
@@ -128,7 +128,7 @@
  * An [IntValue] contains a constant integer value.
  */
 class IntValue extends Value {
-  final int value;
+  final BigInt value;
 
   const IntValue(this.value, info) : super(info);
 
@@ -187,9 +187,9 @@
   int get hashCode => throw new UnsupportedError('IntValue.hashCode');
 
   String toString() => 'IntValue $value';
-  bool get isNegative => value < 0;
-  bool get isPositive => value >= 0;
-  bool get isZero => value == 0;
+  bool get isNegative => value < BigInt.zero;
+  bool get isPositive => value >= BigInt.zero;
+  bool get isZero => value == BigInt.zero;
 }
 
 /**
@@ -694,11 +694,13 @@
     if (constantNum.isPositiveInfinity || constantNum.isNegativeInfinity) {
       return info.newUnboundRange();
     }
-    if (constantNum.isMinusZero) constantNum = new IntConstantValue(0);
+    if (constantNum.isMinusZero) {
+      constantNum = new IntConstantValue(BigInt.zero);
+    }
 
-    int intValue = constantNum is IntConstantValue
+    BigInt intValue = constantNum is IntConstantValue
         ? constantNum.intValue
-        : constantNum.doubleValue.toInt();
+        : new BigInt.from(constantNum.doubleValue.toInt());
     Value value = info.newIntValue(intValue);
     return info.newNormalizedRange(value, value);
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index b2b01e9..f8a4624 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -7,9 +7,9 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-import 'package:front_end/src/multi_root_file_system.dart';
 import 'package:kernel/kernel.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/source_maps.dart';
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 493b103..a9faea8 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -18,6 +18,10 @@
 import 'package:args/args.dart' show ArgParser;
 import 'package:path/path.dart' as path;
 
+// TODO(vsm): Remove this once we stop ignoring.  It's off here, but
+// configurable for manual testing.
+const ignoreWhitelistedErrors = false;
+
 void main(List<String> args) {
   // Parse flags.
   var parser = new ArgParser()
@@ -139,7 +143,7 @@
         function(sdk, app) {
     'use strict';
     sdk._debugger.registerDevtoolsFormatter();
-    sdk.dart.ignoreWhitelistedErrors(false);
+    sdk.dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
     sdk._isolate_helper.startRootIsolate(() => {}, []);
     app.$basename.main();
   });
@@ -162,7 +166,7 @@
     }
     let sdk = require(\"dart_sdk\");
     let main = require(\"./$basename\").$basename.main;
-    sdk.dart.ignoreWhitelistedErrors(false);
+    sdk.dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
     try {
       sdk._isolate_helper.startRootIsolate(main, []);
     } catch(e) {
@@ -186,7 +190,7 @@
     import { dart, _isolate_helper } from '$sdkJsPath/dart_sdk.js';
     import { $basename } from '$basename.js';
     let main = $basename.main;
-    dart.ignoreWhitelistedErrors(false);
+    dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
     try {
       _isolate_helper.startRootIsolate(() => {}, []);
       main();
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index a6b3b01..b0b39e3 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -51,7 +51,7 @@
       null, new Symbol('<Unexpected Null Value>'), null, null, null);
 }
 
-castError(obj, expectedType, [bool typeError = undefined]) {
+castError(obj, expectedType, [@js_helper.notNull bool isImplicit = false]) {
   var actualType = getReifiedType(obj);
   var message = _castErrorMessage(actualType, expectedType);
   if (JS('!', 'dart.__ignoreAllErrors')) {
@@ -59,9 +59,8 @@
     return obj;
   }
   if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
-  var error = JS<bool>('!', '#', typeError)
-      ? new TypeErrorImpl(message)
-      : new CastErrorImpl(message);
+  var error =
+      isImplicit ? new TypeErrorImpl(message) : new CastErrorImpl(message);
   throw error;
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index b8b88e2..0723a7b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -425,8 +425,7 @@
 
     if (!!$isSubtype(type, $Iterable) && !!$isSubtype(actual, $Iterable) ||
         !!$isSubtype(type, $Future) && !!$isSubtype(actual, $Future) ||
-        !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map) ||
-        !!$isSubtype(type, $Stream) && !!$isSubtype(actual, $Stream)) {
+        !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map)) {
       console.warn('Ignoring cast fail from ' + $typeName(actual) +
                    ' to ' + $typeName(type));
       return true;
@@ -444,7 +443,7 @@
 }
 
 @JSExportName('as')
-cast(obj, type, bool isExplicit) {
+cast(obj, type, @js_helper.notNull bool isImplicit) {
   if (obj == null) return obj;
   var actual = getReifiedType(obj);
   var result = isSubtype(actual, type);
@@ -454,13 +453,13 @@
       'dart.__ignoreWhitelistedErrors && #(#, #)',
       result,
       result,
-      isExplicit,
+      isImplicit,
       _ignoreTypeFailure,
       actual,
       type)) {
     return obj;
   }
-  return castError(obj, type, isExplicit);
+  return castError(obj, type, isImplicit);
 }
 
 bool test(bool obj) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index fd62cd8..15b4326 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -23,6 +23,7 @@
         PrivateSymbol,
         ReifyFunctionTypes,
         NoReifyGeneric;
+import 'dart:_js_helper' as js_helper show notNull;
 import 'dart:_debugger' show trackCall;
 
 export 'dart:_debugger'
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index c7a40c5..2d0df1b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -427,7 +427,7 @@
         }))()''');
 
   @JSExportName('as')
-  as_T(obj, [bool typeError]) {
+  as_T(obj, [@js_helper.notNull bool isImplicit = false]) {
     if (obj == null) return obj;
     if (JS('bool', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
@@ -436,12 +436,14 @@
       if (actual == null) return obj;
       var result = isSubtype(actual, this);
       if (result == true) return obj;
-      if (result == null && JS('bool', 'dart.__ignoreWhitelistedErrors')) {
+      if (result == null &&
+          isImplicit &&
+          JS<bool>('!', 'dart.__ignoreWhitelistedErrors')) {
         _logIgnoredCast(actual, this);
         return obj;
       }
     }
-    return castError(obj, this, typeError);
+    return castError(obj, this, isImplicit);
   }
 
   @JSExportName('_check')
diff --git a/pkg/front_end/lib/src/byte_store/crc32.dart b/pkg/front_end/lib/src/byte_store/crc32.dart
new file mode 100644
index 0000000..457712e
--- /dev/null
+++ b/pkg/front_end/lib/src/byte_store/crc32.dart
@@ -0,0 +1,288 @@
+// 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.
+
+const List<int> _CRC32_TABLE = const [
+  0x00000000,
+  0x77073096,
+  0xEE0E612C,
+  0x990951BA,
+  0x076DC419,
+  0x706AF48F,
+  0xE963A535,
+  0x9E6495A3,
+  0x0EDB8832,
+  0x79DCB8A4,
+  0xE0D5E91E,
+  0x97D2D988,
+  0x09B64C2B,
+  0x7EB17CBD,
+  0xE7B82D07,
+  0x90BF1D91,
+  0x1DB71064,
+  0x6AB020F2,
+  0xF3B97148,
+  0x84BE41DE,
+  0x1ADAD47D,
+  0x6DDDE4EB,
+  0xF4D4B551,
+  0x83D385C7,
+  0x136C9856,
+  0x646BA8C0,
+  0xFD62F97A,
+  0x8A65C9EC,
+  0x14015C4F,
+  0x63066CD9,
+  0xFA0F3D63,
+  0x8D080DF5,
+  0x3B6E20C8,
+  0x4C69105E,
+  0xD56041E4,
+  0xA2677172,
+  0x3C03E4D1,
+  0x4B04D447,
+  0xD20D85FD,
+  0xA50AB56B,
+  0x35B5A8FA,
+  0x42B2986C,
+  0xDBBBC9D6,
+  0xACBCF940,
+  0x32D86CE3,
+  0x45DF5C75,
+  0xDCD60DCF,
+  0xABD13D59,
+  0x26D930AC,
+  0x51DE003A,
+  0xC8D75180,
+  0xBFD06116,
+  0x21B4F4B5,
+  0x56B3C423,
+  0xCFBA9599,
+  0xB8BDA50F,
+  0x2802B89E,
+  0x5F058808,
+  0xC60CD9B2,
+  0xB10BE924,
+  0x2F6F7C87,
+  0x58684C11,
+  0xC1611DAB,
+  0xB6662D3D,
+  0x76DC4190,
+  0x01DB7106,
+  0x98D220BC,
+  0xEFD5102A,
+  0x71B18589,
+  0x06B6B51F,
+  0x9FBFE4A5,
+  0xE8B8D433,
+  0x7807C9A2,
+  0x0F00F934,
+  0x9609A88E,
+  0xE10E9818,
+  0x7F6A0DBB,
+  0x086D3D2D,
+  0x91646C97,
+  0xE6635C01,
+  0x6B6B51F4,
+  0x1C6C6162,
+  0x856530D8,
+  0xF262004E,
+  0x6C0695ED,
+  0x1B01A57B,
+  0x8208F4C1,
+  0xF50FC457,
+  0x65B0D9C6,
+  0x12B7E950,
+  0x8BBEB8EA,
+  0xFCB9887C,
+  0x62DD1DDF,
+  0x15DA2D49,
+  0x8CD37CF3,
+  0xFBD44C65,
+  0x4DB26158,
+  0x3AB551CE,
+  0xA3BC0074,
+  0xD4BB30E2,
+  0x4ADFA541,
+  0x3DD895D7,
+  0xA4D1C46D,
+  0xD3D6F4FB,
+  0x4369E96A,
+  0x346ED9FC,
+  0xAD678846,
+  0xDA60B8D0,
+  0x44042D73,
+  0x33031DE5,
+  0xAA0A4C5F,
+  0xDD0D7CC9,
+  0x5005713C,
+  0x270241AA,
+  0xBE0B1010,
+  0xC90C2086,
+  0x5768B525,
+  0x206F85B3,
+  0xB966D409,
+  0xCE61E49F,
+  0x5EDEF90E,
+  0x29D9C998,
+  0xB0D09822,
+  0xC7D7A8B4,
+  0x59B33D17,
+  0x2EB40D81,
+  0xB7BD5C3B,
+  0xC0BA6CAD,
+  0xEDB88320,
+  0x9ABFB3B6,
+  0x03B6E20C,
+  0x74B1D29A,
+  0xEAD54739,
+  0x9DD277AF,
+  0x04DB2615,
+  0x73DC1683,
+  0xE3630B12,
+  0x94643B84,
+  0x0D6D6A3E,
+  0x7A6A5AA8,
+  0xE40ECF0B,
+  0x9309FF9D,
+  0x0A00AE27,
+  0x7D079EB1,
+  0xF00F9344,
+  0x8708A3D2,
+  0x1E01F268,
+  0x6906C2FE,
+  0xF762575D,
+  0x806567CB,
+  0x196C3671,
+  0x6E6B06E7,
+  0xFED41B76,
+  0x89D32BE0,
+  0x10DA7A5A,
+  0x67DD4ACC,
+  0xF9B9DF6F,
+  0x8EBEEFF9,
+  0x17B7BE43,
+  0x60B08ED5,
+  0xD6D6A3E8,
+  0xA1D1937E,
+  0x38D8C2C4,
+  0x4FDFF252,
+  0xD1BB67F1,
+  0xA6BC5767,
+  0x3FB506DD,
+  0x48B2364B,
+  0xD80D2BDA,
+  0xAF0A1B4C,
+  0x36034AF6,
+  0x41047A60,
+  0xDF60EFC3,
+  0xA867DF55,
+  0x316E8EEF,
+  0x4669BE79,
+  0xCB61B38C,
+  0xBC66831A,
+  0x256FD2A0,
+  0x5268E236,
+  0xCC0C7795,
+  0xBB0B4703,
+  0x220216B9,
+  0x5505262F,
+  0xC5BA3BBE,
+  0xB2BD0B28,
+  0x2BB45A92,
+  0x5CB36A04,
+  0xC2D7FFA7,
+  0xB5D0CF31,
+  0x2CD99E8B,
+  0x5BDEAE1D,
+  0x9B64C2B0,
+  0xEC63F226,
+  0x756AA39C,
+  0x026D930A,
+  0x9C0906A9,
+  0xEB0E363F,
+  0x72076785,
+  0x05005713,
+  0x95BF4A82,
+  0xE2B87A14,
+  0x7BB12BAE,
+  0x0CB61B38,
+  0x92D28E9B,
+  0xE5D5BE0D,
+  0x7CDCEFB7,
+  0x0BDBDF21,
+  0x86D3D2D4,
+  0xF1D4E242,
+  0x68DDB3F8,
+  0x1FDA836E,
+  0x81BE16CD,
+  0xF6B9265B,
+  0x6FB077E1,
+  0x18B74777,
+  0x88085AE6,
+  0xFF0F6A70,
+  0x66063BCA,
+  0x11010B5C,
+  0x8F659EFF,
+  0xF862AE69,
+  0x616BFFD3,
+  0x166CCF45,
+  0xA00AE278,
+  0xD70DD2EE,
+  0x4E048354,
+  0x3903B3C2,
+  0xA7672661,
+  0xD06016F7,
+  0x4969474D,
+  0x3E6E77DB,
+  0xAED16A4A,
+  0xD9D65ADC,
+  0x40DF0B66,
+  0x37D83BF0,
+  0xA9BCAE53,
+  0xDEBB9EC5,
+  0x47B2CF7F,
+  0x30B5FFE9,
+  0xBDBDF21C,
+  0xCABAC28A,
+  0x53B39330,
+  0x24B4A3A6,
+  0xBAD03605,
+  0xCDD70693,
+  0x54DE5729,
+  0x23D967BF,
+  0xB3667A2E,
+  0xC4614AB8,
+  0x5D681B02,
+  0x2A6F2B94,
+  0xB40BBE37,
+  0xC30C8EA1,
+  0x5A05DF1B,
+  0x2D02EF8D
+];
+
+/**
+ * Get the CRC-32 checksum of the given array. You can append bytes to an
+ * already computed crc by specifying the previous [crc] value.
+ */
+int getCrc32(List<int> array, [int crc = 0]) {
+  int len = array.length;
+  crc = crc ^ 0xffffffff;
+  int ip = 0;
+  while (len >= 8) {
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    len -= 8;
+  }
+  if (len > 0)
+    do {
+      crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+    } while (--len > 0);
+  return crc ^ 0xffffffff;
+}
diff --git a/pkg/front_end/lib/src/byte_store/file_byte_store.dart b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
index 8ce63de..9a9bc29 100644
--- a/pkg/front_end/lib/src/byte_store/file_byte_store.dart
+++ b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
@@ -5,8 +5,10 @@
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
+import 'dart:typed_data';
 
 import 'package:front_end/src/byte_store/byte_store.dart';
+import 'package:front_end/src/byte_store/crc32.dart';
 import 'package:path/path.dart';
 
 /**
@@ -144,6 +146,7 @@
 class FileByteStore implements ByteStore {
   final String _cachePath;
   final String _tempName;
+  final FileByteStoreValidator _validator = new FileByteStoreValidator();
 
   /**
    * If the same cache path is used from more than one isolate of the same
@@ -155,7 +158,9 @@
   @override
   List<int> get(String key) {
     try {
-      return _getFileForKey(key).readAsBytesSync();
+      File file = _getFileForKey(key);
+      List<int> rawBytes = file.readAsBytesSync();
+      return _validator.getData(rawBytes);
     } catch (_) {
       return null;
     }
@@ -164,6 +169,7 @@
   @override
   void put(String key, List<int> bytes) {
     try {
+      bytes = _validator.wrapData(bytes);
       File tempFile = _getFileForKey(_tempName);
       tempFile.writeAsBytesSync(bytes);
       File file = _getFileForKey(key);
@@ -175,3 +181,75 @@
     return new File(join(_cachePath, key));
   }
 }
+
+/**
+ * Generally speaking, we cannot guarantee that any data written into a
+ * file will stay the same - there is always a chance of a hardware problem,
+ * file system problem, truncated data, etc.
+ *
+ * So, we need to embed some validation into data itself.
+ * This class append the version and the checksum to data.
+ */
+class FileByteStoreValidator {
+  static const List<int> _VERSION = const [0x01, 0x00, 0x00, 0x00];
+
+  /**
+   * If the [rawBytes] have the valid version and checksum, extract and
+   * return the data from it.  Otherwise return `null`.
+   */
+  List<int> getData(List<int> rawBytes) {
+    // There must be at least the version and the checksum in the raw bytes.
+    if (rawBytes.length < 8) {
+      return null;
+    }
+    int len = rawBytes.length - 8;
+
+    // Check the version.
+    if (rawBytes[len + 0] != _VERSION[0] ||
+        rawBytes[len + 1] != _VERSION[1] ||
+        rawBytes[len + 2] != _VERSION[2] ||
+        rawBytes[len + 3] != _VERSION[3]) {
+      return null;
+    }
+
+    // Check the CRC32 of the data.
+    List<int> data = rawBytes.sublist(0, len);
+    int crc = getCrc32(data);
+    if (rawBytes[len + 4] != crc & 0xFF ||
+        rawBytes[len + 5] != (crc >> 8) & 0xFF ||
+        rawBytes[len + 6] != (crc >> 16) & 0xFF ||
+        rawBytes[len + 7] != (crc >> 24) & 0xFF) {
+      return null;
+    }
+
+    // OK, the data is probably valid.
+    return data;
+  }
+
+  /**
+   * Return bytes that include the given [data] plus the current version and
+   * the checksum of the [data].
+   */
+  List<int> wrapData(List<int> data) {
+    int len = data.length;
+    var bytes = new Uint8List(len + 8);
+
+    // Put the data.
+    bytes.setRange(0, len, data);
+
+    // Put the version.
+    bytes[len + 0] = _VERSION[0];
+    bytes[len + 1] = _VERSION[1];
+    bytes[len + 2] = _VERSION[2];
+    bytes[len + 3] = _VERSION[3];
+
+    // Put the CRC32 of the data.
+    int crc = getCrc32(data);
+    bytes[len + 4] = crc & 0xFF;
+    bytes[len + 5] = (crc >> 8) & 0xFF;
+    bytes[len + 6] = (crc >> 16) & 0xFF;
+    bytes[len + 7] = (crc >> 24) & 0xFF;
+
+    return bytes;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index e65d55b..e1d7ba7 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1026,30 +1026,6 @@
     tip: r"""Try removing the 'const' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name)>
-    templateConstructorHasNoSuchNamedParameter =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Constructor has no named parameter with the name '#name'.""",
-        withArguments: _withArgumentsConstructorHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
-    codeConstructorHasNoSuchNamedParameter =
-    const Code<Message Function(String name)>(
-        "ConstructorHasNoSuchNamedParameter",
-        templateConstructorHasNoSuchNamedParameter,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstructorHasNoSuchNamedParameter(String name) {
-  return new Message(codeConstructorHasNoSuchNamedParameter,
-      message: """Constructor has no named parameter with the name '$name'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConstructorNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Couldn't find constructor '#name'.""",
@@ -2559,27 +2535,6 @@
         r"""Can't assign to this, so it can't be used in a for-in loop.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name)> templateFunctionHasNoSuchNamedParameter =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Function has no named parameter with the name '#name'.""",
-        withArguments: _withArgumentsFunctionHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeFunctionHasNoSuchNamedParameter =
-    const Code<Message Function(String name)>("FunctionHasNoSuchNamedParameter",
-        templateFunctionHasNoSuchNamedParameter,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFunctionHasNoSuchNamedParameter(String name) {
-  return new Message(codeFunctionHasNoSuchNamedParameter,
-      message: """Function has no named parameter with the name '$name'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFunctionTypeDefaultValue = messageFunctionTypeDefaultValue;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3874,27 +3829,6 @@
     message: r"""An annotation (metadata) can't use type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name)> templateMethodHasNoSuchNamedParameter =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Method has no named parameter with the name '#name'.""",
-        withArguments: _withArgumentsMethodHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeMethodHasNoSuchNamedParameter =
-    const Code<Message Function(String name)>(
-        "MethodHasNoSuchNamedParameter", templateMethodHasNoSuchNamedParameter,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsMethodHasNoSuchNamedParameter(String name) {
-  return new Message(codeMethodHasNoSuchNamedParameter,
-      message: """Method has no named parameter with the name '$name'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateMethodNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Method not found: '#name'.""",
@@ -4265,6 +4199,25 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateNoSuchNamedParameter =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""No named parameter with the name '#name'.""",
+        withArguments: _withArgumentsNoSuchNamedParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNoSuchNamedParameter =
+    const Code<Message Function(String name)>(
+        "NoSuchNamedParameter", templateNoSuchNamedParameter,
+        severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNoSuchNamedParameter(String name) {
+  return new Message(codeNoSuchNamedParameter,
+      message: """No named parameter with the name '$name'.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNoUnnamedConstructorInObject =
     messageNoUnnamedConstructorInObject;
 
@@ -5626,24 +5579,23 @@
     Message Function(
         int count,
         int
-            count2)> templateTooFewArgumentsToConstructor = const Template<
+            count2)> templateTooFewArguments = const Template<
         Message Function(int count, int count2)>(
     messageTemplate:
-        r"""Too few positional arguments to constructor: #count required, #count2 given.""",
-    withArguments: _withArgumentsTooFewArgumentsToConstructor);
+        r"""Too few positional arguments: #count required, #count2 given.""",
+    withArguments: _withArgumentsTooFewArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooFewArgumentsToConstructor =
+const Code<Message Function(int count, int count2)> codeTooFewArguments =
     const Code<Message Function(int count, int count2)>(
-        "TooFewArgumentsToConstructor", templateTooFewArgumentsToConstructor,
+        "TooFewArguments", templateTooFewArguments,
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToConstructor(int count, int count2) {
-  return new Message(codeTooFewArgumentsToConstructor,
+Message _withArgumentsTooFewArguments(int count, int count2) {
+  return new Message(codeTooFewArguments,
       message:
-          """Too few positional arguments to constructor: $count required, $count2 given.""",
+          """Too few positional arguments: $count required, $count2 given.""",
       arguments: {'count': count, 'count2': count2});
 }
 
@@ -5652,128 +5604,23 @@
     Message Function(
         int count,
         int
-            count2)> templateTooFewArgumentsToFunction = const Template<
+            count2)> templateTooManyArguments = const Template<
         Message Function(int count, int count2)>(
     messageTemplate:
-        r"""Too few positional arguments to function: #count required, #count2 given.""",
-    withArguments: _withArgumentsTooFewArgumentsToFunction);
+        r"""Too many positional arguments: #count allowed, #count2 given.""",
+    withArguments: _withArgumentsTooManyArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooFewArgumentsToFunction =
+const Code<Message Function(int count, int count2)> codeTooManyArguments =
     const Code<Message Function(int count, int count2)>(
-        "TooFewArgumentsToFunction", templateTooFewArgumentsToFunction,
+        "TooManyArguments", templateTooManyArguments,
         severity: Severity.errorLegacyWarning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToFunction(int count, int count2) {
-  return new Message(codeTooFewArgumentsToFunction,
+Message _withArgumentsTooManyArguments(int count, int count2) {
+  return new Message(codeTooManyArguments,
       message:
-          """Too few positional arguments to function: $count required, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooFewArgumentsToMethod = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too few positional arguments to method: #count required, #count2 given.""",
-    withArguments: _withArgumentsTooFewArgumentsToMethod);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooFewArgumentsToMethod =
-    const Code<Message Function(int count, int count2)>(
-        "TooFewArgumentsToMethod", templateTooFewArgumentsToMethod,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToMethod(int count, int count2) {
-  return new Message(codeTooFewArgumentsToMethod,
-      message:
-          """Too few positional arguments to method: $count required, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsToConstructor = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments to constructor: #count allowed, #count2 given.""",
-    withArguments: _withArgumentsTooManyArgumentsToConstructor);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsToConstructor =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsToConstructor", templateTooManyArgumentsToConstructor,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToConstructor(int count, int count2) {
-  return new Message(codeTooManyArgumentsToConstructor,
-      message:
-          """Too many positional arguments to constructor: $count allowed, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsToFunction = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments to function: #count allowed, #count2 given.""",
-    withArguments: _withArgumentsTooManyArgumentsToFunction);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsToFunction =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsToFunction", templateTooManyArgumentsToFunction,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToFunction(int count, int count2) {
-  return new Message(codeTooManyArgumentsToFunction,
-      message:
-          """Too many positional arguments to function: $count allowed, $count2 given.""",
-      arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        int count,
-        int
-            count2)> templateTooManyArgumentsToMethod = const Template<
-        Message Function(int count, int count2)>(
-    messageTemplate:
-        r"""Too many positional arguments to method: #count allowed, #count2 given.""",
-    withArguments: _withArgumentsTooManyArgumentsToMethod);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
-    codeTooManyArgumentsToMethod =
-    const Code<Message Function(int count, int count2)>(
-        "TooManyArgumentsToMethod", templateTooManyArgumentsToMethod,
-        severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToMethod(int count, int count2) {
-  return new Message(codeTooManyArgumentsToMethod,
-      message:
-          """Too many positional arguments to method: $count allowed, $count2 given.""",
+          """Too many positional arguments: $count allowed, $count2 given.""",
       arguments: {'count': count, 'count2': count2});
 }
 
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 66003ca..abcc818 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -84,31 +84,29 @@
 
 import 'expression_generator.dart'
     show
-        BuilderHelper,
-        CalleeDesignation,
         DeferredAccessGenerator,
         ErroneousExpressionGenerator,
-        FastaAccessor,
-        FunctionTypeAccessor,
-        GeneratorImpl,
-        IncompleteError,
-        IncompletePropertyAccessor,
-        IncompleteSend,
+        Generator,
+        IncompleteErrorGenerator,
+        IncompletePropertyAccessGenerator,
+        IncompleteSendGenerator,
         IndexedAccessGenerator,
         LargeIntAccessGenerator,
         LoadLibraryGenerator,
-        ParenthesizedExpression,
+        ParenthesizedExpressionGenerator,
         ReadOnlyAccessGenerator,
-        SendAccessor,
+        SendAccessGenerator,
         StaticAccessGenerator,
         SuperIndexedAccessGenerator,
         ThisAccessGenerator,
         ThisPropertyAccessGenerator,
-        TypeDeclarationAccessor,
-        UnresolvedAccessor,
+        TypeDeclarationAccessGenerator,
+        UnresolvedNameGenerator,
         VariableUseGenerator,
         buildIsNull;
 
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
 import 'redirecting_factory_body.dart'
     show
         RedirectingFactoryBody,
@@ -131,7 +129,7 @@
 
 abstract class BodyBuilder<Expression, Statement, Arguments>
     extends ScopeListener<JumpTarget>
-    implements BuilderHelper<Expression, Statement, Arguments> {
+    implements ExpressionGeneratorHelper<Expression, Statement, Arguments> {
   @override
   final KernelLibraryBuilder library;
 
@@ -274,7 +272,7 @@
 
   @override
   Expression toValue(Object node) {
-    if (node is FastaAccessor) {
+    if (node is Generator) {
       return toExpression(node.buildSimpleRead());
     } else if (node is Expression) {
       return node;
@@ -292,7 +290,7 @@
   }
 
   Expression toEffect(Object node) {
-    if (node is FastaAccessor) return toExpression(node.buildForEffect());
+    if (node is Generator) return toExpression(node.buildForEffect());
     return toValue(node);
   }
 
@@ -437,14 +435,14 @@
       var expression = pop();
       if (expression is Identifier) {
         Identifier identifier = expression;
-        expression = new UnresolvedAccessor(
+        expression = new UnresolvedNameGenerator(
             this, identifier.token, new Name(identifier.name, library.library));
       }
       if (name?.isNotEmpty ?? false) {
         Token period = periodBeforeName ?? beginToken.next;
-        FastaAccessor accessor = expression;
-        expression = accessor.buildPropertyAccess(
-            new IncompletePropertyAccessor(
+        Generator generator = expression;
+        expression = generator.buildPropertyAccess(
+            new IncompletePropertyAccessGenerator(
                 this, period.next, new Name(name, library.library)),
             period.next.offset,
             false);
@@ -620,7 +618,7 @@
     Initializer initializer;
     if (node is Initializer) {
       initializer = node;
-    } else if (node is FastaAccessor) {
+    } else if (node is Generator) {
       initializer = node.buildFieldInitializer(initializedFields);
     } else if (node is ConstructorInvocation) {
       initializer = buildSuperInitializer(
@@ -803,10 +801,7 @@
       Initializer initializer;
       Arguments arguments = forest.argumentsEmpty(noLocation);
       if (superTarget == null ||
-          checkArguments(
-                  new FunctionTypeAccessor.fromNode(superTarget.function),
-                  arguments,
-                  CalleeDesignation.Constructor,
+          checkArgumentsForFunction(superTarget.function, arguments,
                   builder.charOffset, const <TypeParameter>[]) !=
               null) {
         String superclass = classBuilder.supertype.fullNameForErrors;
@@ -909,7 +904,7 @@
   @override
   void handleParenthesizedExpression(Token token) {
     debugEvent("ParenthesizedExpression");
-    push(new ParenthesizedExpression(
+    push(new ParenthesizedExpressionGenerator(
         this, token.endGroup, toKernelExpression(popForValue())));
   }
 
@@ -928,9 +923,9 @@
     if (receiver is Identifier) {
       Name name = new Name(receiver.name, library.library);
       if (arguments == null) {
-        push(new IncompletePropertyAccessor(this, beginToken, name));
+        push(new IncompletePropertyAccessGenerator(this, beginToken, name));
       } else {
-        push(new SendAccessor(this, beginToken, name, arguments));
+        push(new SendAccessGenerator(this, beginToken, name, arguments));
       }
     } else if (arguments == null) {
       push(receiver);
@@ -941,7 +936,7 @@
 
   @override
   finishSend(Object receiver, Arguments arguments, int charOffset) {
-    if (receiver is FastaAccessor) {
+    if (receiver is Generator) {
       return receiver.doInvocation(charOffset, arguments);
     } else {
       return buildMethodInvocation(
@@ -1078,7 +1073,7 @@
   /// Handle `a?.b(...)`.
   void doIfNotNull(Token token) {
     var send = pop();
-    if (send is IncompleteSend) {
+    if (send is IncompleteSendGenerator) {
       push(send.withReceiver(pop(), token.charOffset, isNullAware: true));
     } else {
       pop();
@@ -1091,7 +1086,7 @@
 
   void doDotOrCascadeExpression(Token token) {
     var send = pop();
-    if (send is IncompleteSend) {
+    if (send is IncompleteSendGenerator) {
       Object receiver = optional(".", token) ? pop() : popForValue();
       push(send.withReceiver(receiver, token.charOffset));
     } else {
@@ -1370,7 +1365,7 @@
           classBuilder.origin.findStaticBuilder(name, charOffset, uri, library);
     }
     if (builder != null && member.isField && builder.isInstanceMember) {
-      return new IncompleteError(this, token,
+      return new IncompleteErrorGenerator(this, token,
           fasta.templateThisAccessInFieldInitializer.withArguments(name));
     }
     if (builder == null || (!isInstanceContext && builder.isInstanceMember)) {
@@ -1378,7 +1373,7 @@
       if (!isQualified && isInstanceContext) {
         assert(builder == null);
         if (constantContext != ConstantContext.none || member.isField) {
-          return new UnresolvedAccessor(this, token, n);
+          return new UnresolvedNameGenerator(this, token, n);
         }
         return new ThisPropertyAccessGenerator(this, token, n,
             lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
@@ -1387,7 +1382,7 @@
           member?.name == "_getMainClosure") {
         return storeOffset(forest.literalNull(null), charOffset);
       } else {
-        return new UnresolvedAccessor(this, token, n);
+        return new UnresolvedNameGenerator(this, token, n);
       }
     } else if (builder.isTypeDeclaration) {
       if (constantContext != ConstantContext.none &&
@@ -1396,11 +1391,12 @@
         deprecated_addCompileTimeError(
             charOffset, "Not a constant expression.");
       }
-      TypeDeclarationAccessor accessor = new TypeDeclarationAccessor(
-          this, token, prefix, charOffset, builder, name);
+      TypeDeclarationAccessGenerator generator =
+          new TypeDeclarationAccessGenerator(
+              this, token, prefix, charOffset, builder, name);
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator(this, token, prefix, accessor)
-          : accessor;
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
+          : generator;
     } else if (builder.isLocal) {
       if (constantContext != ConstantContext.none &&
           !builder.isConst &&
@@ -1449,11 +1445,11 @@
       return new ThisPropertyAccessGenerator(this, token, n, getter, setter);
     } else if (builder.isRegularMethod) {
       assert(builder.isStatic || builder.isTopLevel);
-      StaticAccessGenerator accessor =
+      StaticAccessGenerator generator =
           new StaticAccessGenerator(this, token, builder.target, null);
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator(this, token, prefix, accessor)
-          : accessor;
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
+          : generator;
     } else if (builder is PrefixBuilder) {
       if (constantContext != ConstantContext.none && builder.deferred) {
         deprecated_addCompileTimeError(
@@ -1477,10 +1473,10 @@
       } else if (builder.isField && !builder.isFinal) {
         setter = builder;
       }
-      StaticAccessGenerator accessor =
+      StaticAccessGenerator generator =
           new StaticAccessGenerator.fromBuilder(this, builder, token, setter);
       if (constantContext != ConstantContext.none) {
-        Member readTarget = accessor.readTarget;
+        Member readTarget = generator.readTarget;
         if (!(readTarget is Field && readTarget.isConst ||
             // Static tear-offs are also compile time constants.
             readTarget is Procedure)) {
@@ -1489,8 +1485,8 @@
         }
       }
       return (prefix?.deferred == true)
-          ? new DeferredAccessGenerator(this, token, prefix, accessor)
-          : accessor;
+          ? new DeferredAccessGenerator(this, token, prefix, generator)
+          : generator;
     }
   }
 
@@ -1789,13 +1785,13 @@
   void handleAssignmentExpression(Token token) {
     debugEvent("AssignmentExpression");
     Expression value = popForValue();
-    var accessor = pop();
-    if (accessor is! FastaAccessor) {
+    var generator = pop();
+    if (generator is! Generator) {
       push(buildCompileTimeError(fasta.messageNotAnLvalue,
           offsetForToken(token), lengthForToken(token)));
     } else {
-      push(new DelayedAssignment(
-          this, token, accessor, toKernelExpression(value), token.stringValue));
+      push(new DelayedAssignment(this, token, generator,
+          toKernelExpression(value), token.stringValue));
     }
   }
 
@@ -1821,7 +1817,7 @@
   }
 
   List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
-    if (variableOrExpression is FastaAccessor) {
+    if (variableOrExpression is Generator) {
       variableOrExpression = variableOrExpression.buildForEffect();
     }
     if (variableOrExpression is VariableDeclaration) {
@@ -2054,7 +2050,7 @@
         return;
       }
     }
-    if (name is FastaAccessor) {
+    if (name is Generator) {
       push(name.buildTypeWithBuiltArguments(arguments));
     } else if (name is TypeBuilder) {
       push(name.build(library));
@@ -2324,14 +2320,11 @@
       optional = pop();
       count--;
     }
-    FormalParameters<Arguments> formals = new FormalParameters(
-        popList(
-                count,
-                new List<VariableDeclaration>.filled(count, null,
-                    growable: true)) ??
-            <VariableDeclaration>[],
-        optional,
-        beginToken.charOffset);
+    List<VariableDeclaration> variables =
+        new List<VariableDeclaration>.filled(count, null, growable: true);
+    popList(count, variables);
+    FormalParameters<Arguments> formals =
+        new FormalParameters(variables, optional, beginToken.charOffset);
     constantContext = pop();
     push(formals);
     if ((inCatchClause || functionNestingLevel != 0) &&
@@ -2484,24 +2477,26 @@
   @override
   void handleUnaryPrefixAssignmentExpression(Token token) {
     debugEvent("UnaryPrefixAssignmentExpression");
-    var accessor = pop();
-    if (accessor is FastaAccessor) {
-      push(accessor.buildPrefixIncrement(incrementOperator(token),
+    var generator = pop();
+    if (generator is Generator) {
+      push(generator.buildPrefixIncrement(incrementOperator(token),
           offset: token.charOffset));
     } else {
-      push(wrapInCompileTimeError(toValue(accessor), fasta.messageNotAnLvalue));
+      push(
+          wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
     }
   }
 
   @override
   void handleUnaryPostfixAssignmentExpression(Token token) {
     debugEvent("UnaryPostfixAssignmentExpression");
-    var accessor = pop();
-    if (accessor is FastaAccessor) {
+    var generator = pop();
+    if (generator is Generator) {
       push(new DelayedPostfixIncrement<Arguments>(
-          this, token, accessor, incrementOperator(token), null));
+          this, token, generator, incrementOperator(token), null));
     } else {
-      push(wrapInCompileTimeError(toValue(accessor), fasta.messageNotAnLvalue));
+      push(
+          wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
     }
   }
 
@@ -2542,7 +2537,7 @@
   /// But the parser can't tell this from type c) above.
   ///
   /// This method pops 2 (or 3 if `periodBeforeName != null`) values from the
-  /// stack and pushes 3 values: an accessor (the type in a constructor
+  /// stack and pushes 3 values: a generator (the type in a constructor
   /// reference, or an expression in metadata), a list of type arguments, and a
   /// name.
   void pushQualifiedReference(Token start, Token periodBeforeName) {
@@ -2558,13 +2553,13 @@
             prefix.exportScope, identifier.name, identifier.token,
             isQualified: true, prefix: prefix);
         identifier = null;
-      } else if (prefix is TypeDeclarationAccessor) {
+      } else if (prefix is TypeDeclarationAccessGenerator) {
         type = prefix;
-      } else if (prefix is FastaAccessor) {
+      } else if (prefix is Generator) {
         String name = suffix == null
             ? "${prefix.plainNameForRead}.${identifier.name}"
             : "${prefix.plainNameForRead}.${identifier.name}.$suffix";
-        type = new UnresolvedAccessor(
+        type = new UnresolvedNameGenerator(
             this, prefix.token, new Name(name, library.library));
       } else {
         unhandled("${prefix.runtimeType}", "pushQualifiedReference",
@@ -2599,15 +2594,8 @@
       assert(!target.enclosingClass.isAbstract);
       typeParameters = target.enclosingClass.typeParameters;
     }
-    CalleeDesignation calleeKind = target is Constructor
-        ? CalleeDesignation.Constructor
-        : CalleeDesignation.Method;
-    LocatedMessage argMessage = checkArguments(
-        new FunctionTypeAccessor.fromNode(target.function),
-        arguments,
-        calleeKind,
-        charOffset,
-        typeParameters);
+    LocatedMessage argMessage = checkArgumentsForFunction(
+        target.function, arguments, charOffset, typeParameters);
     if (argMessage != null) {
       return throwNoSuchMethodError(
           storeOffset(forest.literalNull(null), charOffset),
@@ -2653,65 +2641,29 @@
   }
 
   @override
-  LocatedMessage checkArguments(FunctionTypeAccessor function,
-      Arguments arguments, CalleeDesignation calleeKind, int offset,
-      [List<TypeParameter> typeParameters]) {
+  LocatedMessage checkArgumentsForFunction(FunctionNode function,
+      Arguments arguments, int offset, List<TypeParameter> typeParameters) {
     if (forest.argumentsPositional(arguments).length <
         function.requiredParameterCount) {
-      Template<Message Function(int count, int count2)> template;
-      switch (calleeKind) {
-        case CalleeDesignation.Function:
-          template = fasta.templateTooFewArgumentsToFunction;
-          break;
-        case CalleeDesignation.Method:
-          template = fasta.templateTooFewArgumentsToMethod;
-          break;
-        case CalleeDesignation.Constructor:
-          template = fasta.templateTooFewArgumentsToConstructor;
-          break;
-      }
-      return template
+      return fasta.templateTooFewArguments
           .withArguments(function.requiredParameterCount,
               forest.argumentsPositional(arguments).length)
           .withLocation(uri, offset, noLength);
     }
     if (forest.argumentsPositional(arguments).length >
-        function.positionalParameterCount) {
-      Template<Message Function(int count, int count2)> template;
-      switch (calleeKind) {
-        case CalleeDesignation.Function:
-          template = fasta.templateTooManyArgumentsToFunction;
-          break;
-        case CalleeDesignation.Method:
-          template = fasta.templateTooManyArgumentsToMethod;
-          break;
-        case CalleeDesignation.Constructor:
-          template = fasta.templateTooManyArgumentsToConstructor;
-          break;
-      }
-      return template
-          .withArguments(function.positionalParameterCount,
+        function.positionalParameters.length) {
+      return fasta.templateTooManyArguments
+          .withArguments(function.positionalParameters.length,
               forest.argumentsPositional(arguments).length)
           .withLocation(uri, offset, noLength);
     }
     List named = forest.argumentsNamed(arguments);
     if (named.isNotEmpty) {
-      Set<String> names = function.namedParameterNames;
+      Set<String> names =
+          new Set.from(function.namedParameters.map((a) => a.name));
       for (NamedExpression argument in named) {
         if (!names.remove(argument.name)) {
-          Template<Message Function(String name)> template;
-          switch (calleeKind) {
-            case CalleeDesignation.Function:
-              template = fasta.templateFunctionHasNoSuchNamedParameter;
-              break;
-            case CalleeDesignation.Method:
-              template = fasta.templateMethodHasNoSuchNamedParameter;
-              break;
-            case CalleeDesignation.Constructor:
-              template = fasta.templateConstructorHasNoSuchNamedParameter;
-              break;
-          }
-          return template
+          return fasta.templateNoSuchNamedParameter
               .withArguments(argument.name)
               .withLocation(uri, argument.fileOffset, argument.name.length);
         }
@@ -2719,7 +2671,7 @@
     }
 
     List types = forest.argumentsTypeArguments(arguments);
-    if (typeParameters != null && typeParameters.length != types.length) {
+    if (typeParameters.length != types.length) {
       // TODO(paulberry): Report error in this case as well,
       // after https://github.com/dart-lang/sdk/issues/32130 is fixed.
       types.clear();
@@ -2732,6 +2684,39 @@
   }
 
   @override
+  LocatedMessage checkArgumentsForType(
+      FunctionType function, Arguments arguments, int offset) {
+    if (forest.argumentsPositional(arguments).length <
+        function.requiredParameterCount) {
+      return fasta.templateTooFewArguments
+          .withArguments(function.requiredParameterCount,
+              forest.argumentsPositional(arguments).length)
+          .withLocation(uri, offset, noLength);
+    }
+    if (forest.argumentsPositional(arguments).length >
+        function.positionalParameters.length) {
+      return fasta.templateTooManyArguments
+          .withArguments(function.positionalParameters.length,
+              forest.argumentsPositional(arguments).length)
+          .withLocation(uri, offset, noLength);
+    }
+    List named = forest.argumentsNamed(arguments);
+    if (named.isNotEmpty) {
+      Set<String> names =
+          new Set.from(function.namedParameters.map((a) => a.name));
+      for (NamedExpression argument in named) {
+        if (!names.remove(argument.name)) {
+          return fasta.templateNoSuchNamedParameter
+              .withArguments(argument.name)
+              .withLocation(uri, argument.fileOffset, argument.name.length);
+        }
+      }
+    }
+
+    return null;
+  }
+
+  @override
   void beginNewExpression(Token token) {
     debugEvent("beginNewExpression");
     super.push(constantContext);
@@ -2787,18 +2772,18 @@
     PrefixBuilder deferredPrefix;
     int checkOffset;
     if (type is DeferredAccessGenerator) {
-      DeferredAccessGenerator accessor = type;
-      type = accessor.accessor;
-      deferredPrefix = accessor.builder;
-      checkOffset = accessor.token.charOffset;
+      DeferredAccessGenerator generator = type;
+      type = generator.generator;
+      deferredPrefix = generator.builder;
+      checkOffset = generator.token.charOffset;
     }
 
-    if (type is TypeDeclarationAccessor) {
-      TypeDeclarationAccessor accessor = type;
-      if (accessor.prefix != null) {
+    if (type is TypeDeclarationAccessGenerator) {
+      TypeDeclarationAccessGenerator generator = type;
+      if (generator.prefix != null) {
         nameToken = nameToken.next.next;
       }
-      type = accessor.declaration;
+      type = generator.declaration;
     }
 
     ConstantContext savedConstantContext = pop();
@@ -2940,7 +2925,8 @@
     if (context.isScopeReference && isInstanceContext) {
       push(new ThisAccessGenerator(this, token, inInitializer));
     } else {
-      push(new IncompleteError(this, token, fasta.messageThisAsIdentifier));
+      push(new IncompleteErrorGenerator(
+          this, token, fasta.messageThisAsIdentifier));
     }
   }
 
@@ -2952,7 +2938,8 @@
       member.transformerFlags |= TransformerFlag.superCalls;
       push(new ThisAccessGenerator(this, token, inInitializer, isSuper: true));
     } else {
-      push(new IncompleteError(this, token, fasta.messageSuperAsIdentifier));
+      push(new IncompleteErrorGenerator(
+          this, token, fasta.messageSuperAsIdentifier));
     }
   }
 
@@ -3205,7 +3192,7 @@
         deprecated_addCompileTimeError(
             variable.fileOffset, "A for-in loop-variable can't be 'const'.");
       }
-    } else if (lvalue is FastaAccessor) {
+    } else if (lvalue is Generator) {
       /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
       ///
       ///     for (lvalue in expression) body
@@ -3261,7 +3248,8 @@
   @override
   void beginLabeledStatement(Token token, int labelCount) {
     debugEvent("beginLabeledStatement");
-    List<Label> labels = popList(labelCount);
+    List<Label> labels = popList(
+        labelCount, new List<Label>.filled(labelCount, null, growable: true));
     enterLocalScope(null, scope.createNestedLabelScope());
     LabelTarget target = new LabelTarget<Statement>(
         member, functionNestingLevel, token.charOffset);
@@ -3277,20 +3265,22 @@
     Statement statement = popStatement();
     LabelTarget target = pop();
     exitLocalScope();
-    kernel.Statement kernelStatement = toKernelStatement(statement);
     if (target.breakTarget.hasUsers) {
-      if (kernelStatement is! LabeledStatement) {
-        kernelStatement = new ShadowLabeledStatement(kernelStatement);
+      if (statement is! LabeledStatement) {
+        statement = forest.syntheticLabeledStatement(statement);
       }
-      target.breakTarget.resolveBreaks(forest, kernelStatement);
+      target.breakTarget.resolveBreaks(forest, statement);
     }
+    // TODO(brianwilkerson): Figure out how to get the labels that are part of
+    // the statement.
+//    statement = forest.labeledStatement(labels, statement);
     if (target.continueTarget.hasUsers) {
-      if (kernelStatement is! LabeledStatement) {
-        kernelStatement = new ShadowLabeledStatement(kernelStatement);
+      if (statement is! LabeledStatement) {
+        statement = forest.syntheticLabeledStatement(statement);
       }
-      target.continueTarget.resolveContinues(forest, kernelStatement);
+      target.continueTarget.resolveContinues(forest, statement);
     }
-    push(kernelStatement);
+    push(statement);
   }
 
   @override
@@ -3352,48 +3342,10 @@
     Expression message = popForValueIfNotNull(commaToken);
     Expression condition = popForValue();
 
-    // Compute start and end offsets for the condition expression.
-    // This code is a temporary workaround because expressions don't carry
-    // their start and end offsets currently.
-    //
-    // The token that follows leftParenthesis is considered to be the
-    // first token of the condition.
-    // TODO(ahe): this really should be condition.fileOffset.
-    int startOffset = leftParenthesis.next.offset;
-    int endOffset;
-    {
-      // Search forward from leftParenthesis to find the last token of
-      // the condition - which is a token immediately followed by a commaToken,
-      // right parenthesis or a trailing comma.
-      Token conditionBoundary = commaToken ?? leftParenthesis.endGroup;
-      Token conditionLastToken = leftParenthesis;
-      while (!conditionLastToken.isEof) {
-        Token nextToken = conditionLastToken.next;
-        if (nextToken == conditionBoundary) {
-          break;
-        } else if (optional(',', nextToken) &&
-            nextToken.next == conditionBoundary) {
-          // The next token is trailing comma, which means current token is
-          // the last token of the condition.
-          break;
-        }
-        conditionLastToken = nextToken;
-      }
-      if (conditionLastToken.isEof) {
-        endOffset = startOffset = -1;
-      } else {
-        endOffset = conditionLastToken.offset + conditionLastToken.length;
-      }
-    }
-
-    AssertStatement statement = new ShadowAssertStatement(
-        toKernelExpression(condition),
-        conditionStartOffset: startOffset,
-        conditionEndOffset: endOffset,
-        message: toKernelExpression(message));
     switch (kind) {
       case Assert.Statement:
-        push(statement);
+        push(forest.assertStatement(assertKeyword, leftParenthesis, condition,
+            commaToken, message, semicolonToken));
         break;
 
       case Assert.Expression:
@@ -3404,7 +3356,8 @@
         break;
 
       case Assert.Initializer:
-        push(new ShadowAssertInitializer(statement));
+        push(forest.assertInitializer(
+            assertKeyword, leftParenthesis, condition, commaToken, message));
         break;
     }
   }
@@ -3560,11 +3513,12 @@
       bool hasTarget, Token breakKeyword, Token endToken) {
     debugEvent("BreakStatement");
     var target = breakTarget;
+    Identifier identifier;
     String name;
     if (hasTarget) {
-      Identifier identifier = pop();
+      identifier = pop();
       name = identifier.name;
-      target = scope.lookupLabel(identifier.name);
+      target = scope.lookupLabel(name);
     }
     if (target == null && name == null) {
       push(compileTimeErrorInLoopOrSwitch =
@@ -3582,8 +3536,8 @@
               "Can't break to '$name' in a different function.",
               breakKeyword.next.charOffset));
     } else {
-      BreakStatement statement = new ShadowBreakStatement(null)
-        ..fileOffset = breakKeyword.charOffset;
+      Statement statement =
+          forest.breakStatement(breakKeyword, identifier, endToken);
       target.addBreak(statement);
       push(statement);
     }
@@ -3594,9 +3548,10 @@
       bool hasTarget, Token continueKeyword, Token endToken) {
     debugEvent("ContinueStatement");
     var target = continueTarget;
+    Identifier identifier;
     String name;
     if (hasTarget) {
-      Identifier identifier = pop();
+      identifier = pop();
       name = identifier.name;
       target = scope.lookupLabel(identifier.name);
       if (target != null && target is! JumpTarget) {
@@ -3639,8 +3594,8 @@
               "Can't continue at '$name' in a different function.",
               continueKeyword.next.charOffset));
     } else {
-      BreakStatement statement = new ShadowBreakStatement(null)
-        ..fileOffset = continueKeyword.charOffset;
+      Statement statement =
+          forest.continueStatement(continueKeyword, identifier, endToken);
       target.addContinue(statement);
       push(statement);
     }
@@ -3686,7 +3641,7 @@
     List<Expression> annotations = pop();
     KernelTypeVariableBuilder variable;
     Object inScope = scopeLookup(scope, name.name, token);
-    if (inScope is TypeDeclarationAccessor) {
+    if (inScope is TypeDeclarationAccessGenerator) {
       variable = inScope.declaration;
     } else {
       // Something went wrong when pre-parsing the type variables.
@@ -4254,15 +4209,14 @@
   String toString() => "label($name)";
 }
 
-abstract class ContextAccessor<Arguments> extends FastaAccessor<Arguments>
-    with GeneratorImpl {
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
+abstract class ContextAwareGenerator<Arguments> extends Generator<Arguments> {
+  final Generator generator;
 
-  final FastaAccessor accessor;
-
-  final Token token;
-
-  ContextAccessor(this.helper, this.token, this.accessor);
+  ContextAwareGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.generator)
+      : super(helper, token);
 
   String get plainNameForRead {
     return unsupported("plainNameForRead", token.charOffset, helper.uri);
@@ -4321,14 +4275,18 @@
   }
 }
 
-class DelayedAssignment<Arguments> extends ContextAccessor<Arguments> {
+class DelayedAssignment<Arguments> extends ContextAwareGenerator<Arguments> {
   final kernel.Expression value;
 
   final String assignmentOperator;
 
-  DelayedAssignment(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, FastaAccessor accessor, this.value, this.assignmentOperator)
-      : super(helper, token, accessor);
+  DelayedAssignment(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      Generator generator,
+      this.value,
+      this.assignmentOperator)
+      : super(helper, token, generator);
 
   String get debugName => "DelayedAssignment";
 
@@ -4346,43 +4304,43 @@
           "Not a constant expression.", offsetForToken(token));
     }
     if (identical("=", assignmentOperator)) {
-      return accessor.buildAssignment(value, voidContext: voidContext);
+      return generator.buildAssignment(value, voidContext: voidContext);
     } else if (identical("+=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(plusName, value,
+      return generator.buildCompoundAssignment(plusName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("-=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(minusName, value,
+      return generator.buildCompoundAssignment(minusName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("*=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(multiplyName, value,
+      return generator.buildCompoundAssignment(multiplyName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("%=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(percentName, value,
+      return generator.buildCompoundAssignment(percentName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("&=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(ampersandName, value,
+      return generator.buildCompoundAssignment(ampersandName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("/=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(divisionName, value,
+      return generator.buildCompoundAssignment(divisionName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("<<=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(leftShiftName, value,
+      return generator.buildCompoundAssignment(leftShiftName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical(">>=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(rightShiftName, value,
+      return generator.buildCompoundAssignment(rightShiftName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("??=", assignmentOperator)) {
-      return accessor.buildNullAwareAssignment(
+      return generator.buildNullAwareAssignment(
           value, const DynamicType(), offsetForToken(token),
           voidContext: voidContext);
     } else if (identical("^=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(caretName, value,
+      return generator.buildCompoundAssignment(caretName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("|=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(barName, value,
+      return generator.buildCompoundAssignment(barName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("~/=", assignmentOperator)) {
-      return accessor.buildCompoundAssignment(mustacheName, value,
+      return generator.buildCompoundAssignment(mustacheName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else {
       return unhandled(
@@ -4392,11 +4350,12 @@
 
   @override
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    if (!identical("=", assignmentOperator) || !accessor.isThisPropertyAccess) {
-      return accessor.buildFieldInitializer(initializedFields);
+    if (!identical("=", assignmentOperator) ||
+        !generator.isThisPropertyAccess) {
+      return generator.buildFieldInitializer(initializedFields);
     }
     return helper.buildFieldInitializer(
-        false, accessor.plainNameForRead, offsetForToken(token), value);
+        false, generator.plainNameForRead, offsetForToken(token), value);
   }
 
   @override
@@ -4408,30 +4367,31 @@
   }
 }
 
-class DelayedPostfixIncrement<Arguments> extends ContextAccessor<Arguments> {
+class DelayedPostfixIncrement<Arguments>
+    extends ContextAwareGenerator<Arguments> {
   final Name binaryOperator;
 
   final Procedure interfaceTarget;
 
   DelayedPostfixIncrement(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
-      FastaAccessor accessor,
+      Generator generator,
       this.binaryOperator,
       this.interfaceTarget)
-      : super(helper, token, accessor);
+      : super(helper, token, generator);
 
   String get debugName => "DelayedPostfixIncrement";
 
   kernel.Expression buildSimpleRead() {
-    return accessor.buildPostfixIncrement(binaryOperator,
+    return generator.buildPostfixIncrement(binaryOperator,
         offset: offsetForToken(token),
         voidContext: false,
         interfaceTarget: interfaceTarget);
   }
 
   kernel.Expression buildForEffect() {
-    return accessor.buildPostfixIncrement(binaryOperator,
+    return generator.buildPostfixIncrement(binaryOperator,
         offset: offsetForToken(token),
         voidContext: true,
         interfaceTarget: interfaceTarget);
@@ -4628,7 +4588,7 @@
   }
 
   Scope computeFormalParameterScope(Scope parent, Builder builder,
-      BuilderHelper<dynamic, dynamic, Arguments> helper) {
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
     if (required.length == 0 && optional == null) return parent;
     Map<String, Builder> local = <String, Builder>{};
 
@@ -4684,7 +4644,7 @@
     return node.fullNameForErrors;
   } else if (node is ThisAccessGenerator) {
     return node.isSuper ? "super" : "this";
-  } else if (node is FastaAccessor) {
+  } else if (node is Generator) {
     return node.plainNameForRead;
   } else {
     return unhandled("${node.runtimeType}", "getNodeName", -1, null);
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 291cf8a..b644d94 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// A library to help transform compounds and null-aware accessors into
-/// let expressions.
+/// A library to help generate expression.
 library fasta.expression_generator;
 
 import '../../scanner/token.dart' show Token;
@@ -29,16 +28,16 @@
 
 import '../parser.dart' show lengthForToken, lengthOfSpan, offsetForToken;
 
-import '../problems.dart' show unhandled, unimplemented, unsupported;
+import '../problems.dart' show unhandled, unsupported;
 
-import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope;
-
-import '../type_inference/type_promotion.dart' show TypePromoter;
+import '../scope.dart' show AccessErrorBuilder;
 
 import 'body_builder.dart' show Identifier, noLocation;
 
 import 'constness.dart' show Constness;
 
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
 import 'forest.dart' show Forest;
 
 import 'kernel_builder.dart' show LoadLibraryBuilder, PrefixBuilder;
@@ -50,8 +49,6 @@
         Constructor,
         DartType,
         Field,
-        FunctionNode,
-        FunctionType,
         Initializer,
         InvalidType,
         Let,
@@ -72,7 +69,6 @@
         ShadowVariableAssignment,
         ShadowVariableDeclaration,
         ShadowVariableGet,
-        StaticGet,
         StaticSet,
         SuperMethodInvocation,
         SuperPropertySet,
@@ -94,44 +90,49 @@
         KernelClassBuilder,
         KernelFunctionTypeAliasBuilder,
         KernelInvalidTypeBuilder,
-        KernelPrefixBuilder,
         KernelTypeVariableBuilder,
-        LibraryBuilder,
         LoadLibraryBuilder,
         PrefixBuilder,
         TypeDeclarationBuilder;
 
-part 'expression_generator_impl.dart';
-
-/// An [Accessor] represents a subexpression for which we can't yet build a
-/// kernel [kernel.Expression] because we don't yet know the context in which
-/// it is used.
+/// A generator represents a subexpression for which we can't yet build an
+/// expression because we don't yet know the context in which it's used.
 ///
-/// Once the context is known, an [Accessor] can be converted into an
-/// [kernel.Expression] by calling a "build" method.
+/// Once the context is known, a generator can be converted into an expression
+/// by calling a `build` method.
 ///
 /// For example, when building a kernel representation for `a[x] = b`, after
 /// parsing `a[x]` but before parsing `= b`, we don't yet know whether to
-/// generate an invocation of `operator[]` or `operator[]=`, so we generate an
-/// [Accessor] object.  Later, after `= b` is parsed, [buildAssignment] will be
-/// called.
-// TODO(ahe): Move this into [Generator] when all uses have been updated.
-abstract class Accessor<Arguments> {
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
+/// generate an invocation of `operator[]` or `operator[]=`, so we create a
+/// [Generator] object.  Later, after `= b` is parsed, [buildAssignment] will
+/// be called.
+abstract class Generator<Arguments> {
+  final ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper;
   final Token token;
 
-  Accessor(this.helper, this.token);
+  Generator(this.helper, this.token);
 
+  // TODO(ahe): Change type arguments.
   Forest<kernel.Expression, kernel.Statement, Token, Arguments> get forest =>
       helper.forest;
 
-  /// Builds an [kernel.Expression] representing a read from the accessor.
+  String get plainNameForRead;
+
+  String get debugName;
+
+  Uri get uri => helper.uri;
+
+  String get plainNameForWrite => plainNameForRead;
+
+  bool get isInitializer => false;
+
+  /// Builds a [kernel.Expression] representing a read from the generator.
   kernel.Expression buildSimpleRead() {
     return _finish(_makeSimpleRead(), null);
   }
 
-  /// Builds an [kernel.Expression] representing an assignment with the
-  /// accessor on the LHS and [value] on the RHS.
+  /// Builds a [kernel.Expression] representing an assignment with the
+  /// generator on the LHS and [value] on the RHS.
   ///
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
@@ -142,8 +143,8 @@
         complexAssignment);
   }
 
-  /// Returns an [kernel.Expression] representing a null-aware assignment
-  /// (`??=`) with the accessor on the LHS and [value] on the RHS.
+  /// Returns a [kernel.Expression] representing a null-aware assignment
+  /// (`??=`) with the generator on the LHS and [value] on the RHS.
   ///
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
@@ -178,8 +179,8 @@
     return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
   }
 
-  /// Returns an [kernel.Expression] representing a compound assignment
-  /// (e.g. `+=`) with the accessor on the LHS and [value] on the RHS.
+  /// Returns a [kernel.Expression] representing a compound assignment
+  /// (e.g. `+=`) with the generator on the LHS and [value] on the RHS.
   kernel.Expression buildCompoundAssignment(
       Name binaryOperator, kernel.Expression value,
       {int offset: TreeNode.noOffset,
@@ -196,8 +197,8 @@
         complexAssignment);
   }
 
-  /// Returns an [kernel.Expression] representing a pre-increment or
-  /// pre-decrement of the accessor.
+  /// Returns a [kernel.Expression] representing a pre-increment or
+  /// pre-decrement of the generator.
   kernel.Expression buildPrefixIncrement(Name binaryOperator,
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
@@ -210,8 +211,8 @@
         isPreIncDec: true);
   }
 
-  /// Returns an [kernel.Expression] representing a post-increment or
-  /// post-decrement of the accessor.
+  /// Returns a [kernel.Expression] representing a post-increment or
+  /// post-decrement of the generator.
   kernel.Expression buildPostfixIncrement(Name binaryOperator,
       {int offset: TreeNode.noOffset,
       bool voidContext: false,
@@ -258,40 +259,113 @@
     }
   }
 
-  /// Returns an [kernel.Expression] representing a compile-time error.
+  /// Returns a [kernel.Expression] representing a compile-time error.
   ///
   /// At runtime, an exception will be thrown.
-  makeInvalidRead() {
-    return unhandled("compile-time error", "$runtimeType",
-        offsetForToken(token), helper.uri);
+  kernel.Expression makeInvalidRead() {
+    return buildThrowNoSuchMethodError(
+        forest.literalNull(token), forest.argumentsEmpty(noLocation),
+        isGetter: true);
   }
 
-  /// Returns an [kernel.Expression] representing a compile-time error wrapping
+  /// Returns a [kernel.Expression] representing a compile-time error wrapping
   /// [value].
   ///
   /// At runtime, [value] will be evaluated before throwing an exception.
-  makeInvalidWrite(kernel.Expression value) {
-    return unhandled("compile-time error", "$runtimeType",
-        offsetForToken(token), helper.uri);
+  kernel.Expression makeInvalidWrite(kernel.Expression value) {
+    return buildThrowNoSuchMethodError(forest.literalNull(token),
+        forest.arguments(<kernel.Expression>[value], noLocation),
+        isSetter: true);
   }
 
   /// Creates a data structure for tracking the desugaring of a complex
   /// assignment expression whose right hand side is [rhs].
   ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
       new ShadowIllegalAssignment(rhs);
-}
 
-// TODO(ahe): Merge classes [Accessor] and [FastaAccessor] into this.
-abstract class Generator<Arguments> = Accessor<Arguments>
-    with FastaAccessor<Arguments>;
+  T storeOffset<T>(T node, int offset) {
+    return helper.storeOffset(node, offset);
+  }
+
+  kernel.Expression buildForEffect() => buildSimpleRead();
+
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+    int offset = offsetForToken(token);
+    return helper.buildInvalidInitializer(
+        helper.buildCompileTimeError(
+            messageInvalidInitializer, offset, lengthForToken(token)),
+        offset);
+  }
+
+  /* kernel.Expression | Generator | Initializer */ doInvocation(
+      int offset, Arguments arguments);
+
+  /* kernel.Expression | Generator */ buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    if (send is SendAccessGenerator) {
+      return helper.buildMethodInvocation(buildSimpleRead(), send.name,
+          send.arguments, offsetForToken(send.token),
+          isNullAware: isNullAware);
+    } else {
+      if (helper.constantContext != ConstantContext.none &&
+          send.name != lengthName) {
+        helper.deprecated_addCompileTimeError(
+            offsetForToken(token), "Not a constant expression.");
+      }
+      return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
+          send.name, null, null, isNullAware);
+    }
+  }
+
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    helper.addProblem(templateNotAType.withArguments(token.lexeme),
+        offsetForToken(token), lengthForToken(token));
+    return const InvalidType();
+  }
+
+  /* kernel.Expression | Generator */ buildThrowNoSuchMethodError(
+      kernel.Expression receiver, Arguments arguments,
+      {bool isSuper: false,
+      bool isGetter: false,
+      bool isSetter: false,
+      bool isStatic: false,
+      String name,
+      int offset,
+      LocatedMessage argMessage}) {
+    return helper.throwNoSuchMethodError(receiver, name ?? plainNameForWrite,
+        arguments, offset ?? offsetForToken(this.token),
+        isGetter: isGetter,
+        isSetter: isSetter,
+        isSuper: isSuper,
+        isStatic: isStatic,
+        argMessage: argMessage);
+  }
+
+  bool get isThisPropertyAccess => false;
+
+  void printOn(StringSink sink);
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(debugName);
+    buffer.write("(offset: ");
+    buffer.write("${offsetForToken(token)}");
+    printOn(buffer);
+    buffer.write(")");
+    return "$buffer";
+  }
+}
 
 class VariableUseGenerator<Arguments> extends Generator<Arguments> {
   final VariableDeclaration variable;
 
   final DartType promotedType;
 
-  VariableUseGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.variable,
+  VariableUseGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.variable,
       [this.promotedType])
       : super(helper, token);
 
@@ -353,7 +427,7 @@
   VariableDeclaration _receiverVariable;
 
   PropertyAccessGenerator.internal(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.receiver,
       this.name,
@@ -361,8 +435,8 @@
       this.setter)
       : super(helper, token);
 
-  static FastaAccessor<Arguments> make<Arguments>(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+  static Generator<Arguments> make<Arguments>(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       kernel.Expression receiver,
       Name name,
@@ -457,8 +531,12 @@
 
   final Member setter;
 
-  ThisPropertyAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.name, this.getter, this.setter)
+  ThisPropertyAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.name,
+      this.getter,
+      this.setter)
       : super(helper, token);
 
   String get plainNameForRead => name.name;
@@ -534,7 +612,7 @@
   final DartType type;
 
   NullAwarePropertyAccessGenerator(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.receiverExpression,
       this.name,
@@ -589,7 +667,7 @@
   }
 
   kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return unimplemented("doInvocation", offset, uri);
+    return unsupported("doInvocation", offset, uri);
   }
 
   @override
@@ -622,7 +700,7 @@
   final Member setter;
 
   SuperPropertyAccessGenerator(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.name,
       this.getter,
@@ -705,7 +783,7 @@
   VariableDeclaration indexVariable;
 
   IndexedAccessGenerator.internal(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       this.receiver,
       this.index,
@@ -713,8 +791,8 @@
       this.setter)
       : super(helper, token);
 
-  static FastaAccessor<Arguments> make<Arguments>(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+  static Generator<Arguments> make<Arguments>(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Token token,
       kernel.Expression receiver,
       kernel.Expression index,
@@ -867,8 +945,12 @@
 
   VariableDeclaration indexVariable;
 
-  ThisIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.index, this.getter, this.setter)
+  ThisIndexedAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.index,
+      this.getter,
+      this.setter)
       : super(helper, token);
 
   String get plainNameForRead => "[]";
@@ -987,8 +1069,12 @@
 
   VariableDeclaration indexVariable;
 
-  SuperIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.index, this.getter, this.setter)
+  SuperIndexedAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.index,
+      this.getter,
+      this.setter)
       : super(helper, token);
 
   String get plainNameForRead => "[]";
@@ -1119,13 +1205,16 @@
 
   final Member writeTarget;
 
-  StaticAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.readTarget, this.writeTarget)
+  StaticAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.readTarget,
+      this.writeTarget)
       : assert(readTarget != null || writeTarget != null),
         super(helper, token);
 
   factory StaticAccessGenerator.fromBuilder(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
       Builder builder,
       Token token,
       Builder builderSetter) {
@@ -1215,8 +1304,10 @@
 class LoadLibraryGenerator<Arguments> extends Generator<Arguments> {
   final LoadLibraryBuilder builder;
 
-  LoadLibraryGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.builder)
+  LoadLibraryGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.builder)
       : super(helper, token);
 
   String get plainNameForRead => 'loadLibrary';
@@ -1256,10 +1347,13 @@
 class DeferredAccessGenerator<Arguments> extends Generator<Arguments> {
   final PrefixBuilder builder;
 
-  final FastaAccessor accessor;
+  final Generator generator;
 
-  DeferredAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.builder, this.accessor)
+  DeferredAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.builder,
+      this.generator)
       : super(helper, token);
 
   String get plainNameForRead {
@@ -1271,27 +1365,27 @@
 
   kernel.Expression _makeSimpleRead() {
     return helper.wrapInDeferredCheck(
-        accessor._makeSimpleRead(), builder, token.charOffset);
+        generator._makeSimpleRead(), builder, token.charOffset);
   }
 
   kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
     return helper.wrapInDeferredCheck(
-        accessor._makeRead(complexAssignment), builder, token.charOffset);
+        generator._makeRead(complexAssignment), builder, token.charOffset);
   }
 
   kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
       ShadowComplexAssignment complexAssignment) {
     return helper.wrapInDeferredCheck(
-        accessor._makeWrite(value, voidContext, complexAssignment),
+        generator._makeWrite(value, voidContext, complexAssignment),
         builder,
         token.charOffset);
   }
 
   buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     var propertyAccess =
-        accessor.buildPropertyAccess(send, operatorOffset, isNullAware);
-    if (propertyAccess is FastaAccessor) {
+        generator.buildPropertyAccess(send, operatorOffset, isNullAware);
+    if (propertyAccess is Generator) {
       return new DeferredAccessGenerator(
           helper, token, builder, propertyAccess);
     } else {
@@ -1305,7 +1399,7 @@
       {bool nonInstanceAccessIsError: false}) {
     helper.addProblem(
         templateDeferredTypeAnnotation.withArguments(
-            accessor.buildTypeWithBuiltArguments(arguments,
+            generator.buildTypeWithBuiltArguments(arguments,
                 nonInstanceAccessIsError: nonInstanceAccessIsError),
             builder.name),
         offsetForToken(token),
@@ -1315,15 +1409,15 @@
 
   kernel.Expression doInvocation(int offset, Arguments arguments) {
     return helper.wrapInDeferredCheck(
-        accessor.doInvocation(offset, arguments), builder, token.charOffset);
+        generator.doInvocation(offset, arguments), builder, token.charOffset);
   }
 
   @override
   void printOn(StringSink sink) {
     sink.write(", builder: ");
     sink.write(builder);
-    sink.write(", accessor: ");
-    sink.write(accessor);
+    sink.write(", generator: ");
+    sink.write(generator);
   }
 }
 
@@ -1334,8 +1428,11 @@
 
   VariableDeclaration value;
 
-  ReadOnlyAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.expression, this.plainNameForRead)
+  ReadOnlyAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.expression,
+      this.plainNameForRead)
       : super(helper, token);
 
   String get debugName => "ReadOnlyAccessGenerator";
@@ -1378,7 +1475,8 @@
 
 class LargeIntAccessGenerator<Arguments> extends Generator<Arguments> {
   LargeIntAccessGenerator(
-      BuilderHelper<dynamic, dynamic, Arguments> helper, Token token)
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token)
       : super(helper, token);
 
   // TODO(ahe): This should probably be calling unhandled.
@@ -1429,7 +1527,7 @@
     implements Generator<Arguments> {
   /// Pass [arguments] that must be evaluated before throwing an error.  At
   /// most one of [isGetter] and [isSetter] should be true and they're passed
-  /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used.
+  /// to [ExpressionGeneratorHelper.buildThrowNoSuchMethodError] if it is used.
   kernel.Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset});
 
@@ -1455,7 +1553,7 @@
 
   @override
   buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     return this;
   }
 
@@ -1545,8 +1643,10 @@
 
   final bool isSuper;
 
-  ThisAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.isInitializer,
+  ThisAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.isInitializer,
       {this.isSuper: false})
       : super(helper, token);
 
@@ -1577,11 +1677,11 @@
   }
 
   buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     Name name = send.name;
     Arguments arguments = send.arguments;
     int offset = offsetForToken(send.token);
-    if (isInitializer && send is SendAccessor) {
+    if (isInitializer && send is SendAccessGenerator) {
       if (isNullAware) {
         helper.deprecated_addCompileTimeError(
             operatorOffset, "Expected '.'\nTry removing '?'.");
@@ -1589,7 +1689,7 @@
       return buildConstructorInitializer(offset, name, arguments);
     }
     Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
-    if (send is SendAccessor) {
+    if (send is SendAccessGenerator) {
       // Notice that 'this' or 'super' can't be null. So we can ignore the
       // value of [isNullAware].
       if (getter == null) {
@@ -1630,11 +1730,8 @@
     Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
     LocatedMessage argMessage;
     if (constructor != null) {
-      argMessage = helper.checkArguments(
-          new FunctionTypeAccessor.fromNode(constructor.function),
-          arguments,
-          CalleeDesignation.Constructor,
-          offset, <TypeParameter>[]);
+      argMessage = helper.checkArgumentsForFunction(
+          constructor.function, arguments, offset, <TypeParameter>[]);
     }
     if (constructor == null || argMessage != null) {
       return helper.buildInvalidInitializer(
@@ -1696,13 +1793,13 @@
 
   @override
   kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeRead", offsetForToken(token), uri);
+    return unsupported("_makeRead", offsetForToken(token), uri);
   }
 
   @override
   kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
       ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeWrite", offsetForToken(token), uri);
+    return unsupported("_makeWrite", offsetForToken(token), uri);
   }
 
   @override
@@ -1714,6 +1811,478 @@
   }
 }
 
+abstract class IncompleteSendGenerator<Arguments> extends Generator<Arguments> {
+  final Name name;
+
+  IncompleteSendGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.name)
+      : super(helper, token);
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
+
+  Arguments get arguments => null;
+
+  @override
+  kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeRead", offsetForToken(token), uri);
+  }
+
+  @override
+  kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+      ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeWrite", offsetForToken(token), uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+}
+
+class UnresolvedNameGenerator<Arguments> extends Generator<Arguments>
+    with ErroneousExpressionGenerator<Arguments> {
+  @override
+  final Name name;
+
+  UnresolvedNameGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.name)
+      : super(helper, token);
+
+  String get debugName => "UnresolvedNameGenerator";
+
+  kernel.Expression doInvocation(int charOffset, Arguments arguments) {
+    return buildError(arguments, offset: charOffset);
+  }
+
+  @override
+  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
+    helper.addProblem(
+        templateUnresolvedPrefixInTypeAnnotation.withArguments(
+            name.name, suffix.name),
+        offsetForToken(token),
+        lengthOfSpan(token, suffix.token));
+    return const InvalidType();
+  }
+
+  @override
+  kernel.Expression buildError(Arguments arguments,
+      {bool isGetter: false, bool isSetter: false, int offset}) {
+    offset ??= offsetForToken(this.token);
+    return helper.throwNoSuchMethodError(
+        storeOffset(forest.literalNull(null), offset),
+        plainNameForRead,
+        arguments,
+        offset,
+        isGetter: isGetter,
+        isSetter: isSetter);
+  }
+
+  @override
+  kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeRead", offsetForToken(token), uri);
+  }
+
+  @override
+  kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+      ShadowComplexAssignment complexAssignment) {
+    return unsupported("_makeWrite", offsetForToken(token), uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+}
+
+class IncompleteErrorGenerator<Arguments>
+    extends IncompleteSendGenerator<Arguments>
+    with ErroneousExpressionGenerator<Arguments> {
+  final Message message;
+
+  IncompleteErrorGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.message)
+      : super(helper, token, null);
+
+  String get debugName => "IncompleteErrorGenerator";
+
+  @override
+  kernel.Expression buildError(Arguments arguments,
+      {bool isGetter: false, bool isSetter: false, int offset}) {
+    int length = noLength;
+    if (offset == null) {
+      offset = offsetForToken(token);
+      length = lengthForToken(token);
+    }
+    return helper.buildCompileTimeError(message, offset, length);
+  }
+
+  @override
+  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
+    helper.addProblem(
+        templateNotAPrefixInTypeAnnotation.withArguments(
+            token.lexeme, suffix.name),
+        offsetForToken(token),
+        lengthOfSpan(token, suffix.token));
+    return const InvalidType();
+  }
+
+  @override
+  doInvocation(int offset, Arguments arguments) => this;
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", message: ");
+    sink.write(message.code.name);
+  }
+}
+
+class SendAccessGenerator<Arguments>
+    extends IncompleteSendGenerator<Arguments> {
+  @override
+  final Arguments arguments;
+
+  SendAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      Name name,
+      this.arguments)
+      : super(helper, token, name) {
+    assert(arguments != null);
+  }
+
+  String get plainNameForRead => name.name;
+
+  String get debugName => "SendAccessGenerator";
+
+  kernel.Expression buildSimpleRead() {
+    return unsupported("buildSimpleRead", offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildAssignment(kernel.Expression value,
+      {bool voidContext: false}) {
+    return unsupported("buildAssignment", offsetForToken(token), uri);
+  }
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+    if (receiver is Generator) {
+      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+    }
+    if (receiver is PrefixBuilder) {
+      PrefixBuilder prefix = receiver;
+      if (isNullAware) {
+        helper.deprecated_addCompileTimeError(
+            offsetForToken(token),
+            "Library prefix '${prefix.name}' can't be used with null-aware "
+            "operator.\nTry removing '?'.");
+      }
+      receiver = helper.scopeLookup(prefix.exportScope, name.name, token,
+          isQualified: true, prefix: prefix);
+      return helper.finishSend(receiver, arguments, offsetForToken(token));
+    }
+    return helper.buildMethodInvocation(
+        helper.toValue(receiver), name, arguments, offsetForToken(token),
+        isNullAware: isNullAware);
+  }
+
+  kernel.Expression buildNullAwareAssignment(
+      kernel.Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return unsupported("buildNullAwareAssignment", offset, uri);
+  }
+
+  kernel.Expression buildCompoundAssignment(
+      Name binaryOperator, kernel.Expression value,
+      {int offset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false}) {
+    return unsupported(
+        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    super.printOn(sink);
+    sink.write(", arguments: ");
+    var node = arguments;
+    if (node is kernel.Node) {
+      printNodeOn(node, sink);
+    } else {
+      sink.write(node);
+    }
+  }
+}
+
+class IncompletePropertyAccessGenerator<Arguments>
+    extends IncompleteSendGenerator<Arguments> {
+  IncompletePropertyAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      Name name)
+      : super(helper, token, name);
+
+  String get plainNameForRead => name.name;
+
+  String get debugName => "IncompletePropertyAccessGenerator";
+
+  kernel.Expression buildSimpleRead() {
+    return unsupported("buildSimpleRead", offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildAssignment(kernel.Expression value,
+      {bool voidContext: false}) {
+    return unsupported("buildAssignment", offsetForToken(token), uri);
+  }
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+    if (receiver is Generator) {
+      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+    }
+    if (receiver is PrefixBuilder) {
+      PrefixBuilder prefix = receiver;
+      if (isNullAware) {
+        helper.deprecated_addCompileTimeError(
+            offsetForToken(token),
+            "Library prefix '${prefix.name}' can't be used with null-aware "
+            "operator.\nTry removing '?'.");
+      }
+      return helper.scopeLookup(prefix.exportScope, name.name, token,
+          isQualified: true, prefix: prefix);
+    }
+
+    return PropertyAccessGenerator.make(
+        helper, token, helper.toValue(receiver), name, null, null, isNullAware);
+  }
+
+  kernel.Expression buildNullAwareAssignment(
+      kernel.Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return unsupported("buildNullAwareAssignment", offset, uri);
+  }
+
+  kernel.Expression buildCompoundAssignment(
+      Name binaryOperator, kernel.Expression value,
+      {int offset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false}) {
+    return unsupported(
+        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
+  }
+
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, uri);
+  }
+}
+
+class ParenthesizedExpressionGenerator<Arguments>
+    extends ReadOnlyAccessGenerator<Arguments> {
+  ParenthesizedExpressionGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      kernel.Expression expression)
+      : super(helper, token, expression, null);
+
+  String get debugName => "ParenthesizedExpressionGenerator";
+
+  kernel.Expression makeInvalidWrite(kernel.Expression value) {
+    return helper.deprecated_buildCompileTimeError(
+        "Can't assign to a parenthesized expression.", offsetForToken(token));
+  }
+}
+
+class TypeDeclarationAccessGenerator<Arguments>
+    extends ReadOnlyAccessGenerator<Arguments> {
+  /// The import prefix preceding the [declaration] reference, or `null` if
+  /// the reference is not prefixed.
+  final PrefixBuilder prefix;
+
+  /// The offset at which the [declaration] is referenced by this generator,
+  /// or `-1` if the reference is implicit.
+  final int declarationReferenceOffset;
+
+  final TypeDeclarationBuilder declaration;
+
+  TypeDeclarationAccessGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+      Token token,
+      this.prefix,
+      this.declarationReferenceOffset,
+      this.declaration,
+      String plainNameForRead)
+      : super(helper, token, null, plainNameForRead);
+
+  String get debugName => "TypeDeclarationAccessGenerator";
+
+  kernel.Expression get expression {
+    if (super.expression == null) {
+      int offset = offsetForToken(token);
+      if (declaration is KernelInvalidTypeBuilder) {
+        KernelInvalidTypeBuilder declaration = this.declaration;
+        helper.addProblemErrorIfConst(
+            declaration.message.messageObject, offset, token.length);
+        super.expression =
+            new Throw(forest.literalString(declaration.message.message, token))
+              ..fileOffset = offset;
+      } else {
+        super.expression = forest.literalType(
+            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
+            token);
+      }
+    }
+    return super.expression;
+  }
+
+  kernel.Expression makeInvalidWrite(kernel.Expression value) {
+    return buildThrowNoSuchMethodError(
+        forest.literalNull(token),
+        storeOffset(forest.arguments(<kernel.Expression>[value], null),
+            value.fileOffset),
+        isSetter: true);
+  }
+
+  @override
+  buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    // `SomeType?.toString` is the same as `SomeType.toString`, not
+    // `(SomeType).toString`.
+    isNullAware = false;
+
+    Name name = send.name;
+    Arguments arguments = send.arguments;
+
+    if (declaration is KernelClassBuilder) {
+      KernelClassBuilder declaration = this.declaration;
+      Builder builder = declaration.findStaticBuilder(
+          name.name, offsetForToken(token), uri, helper.library);
+
+      Generator generator;
+      if (builder == null) {
+        // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
+        if (send is IncompletePropertyAccessGenerator) {
+          generator = new UnresolvedNameGenerator(helper, send.token, name);
+        } else {
+          return helper.buildConstructorInvocation(declaration, send.token,
+              arguments, name.name, null, token.charOffset, Constness.implicit);
+        }
+      } else {
+        Builder setter;
+        if (builder.isSetter) {
+          setter = builder;
+        } else if (builder.isGetter) {
+          setter = declaration.findStaticBuilder(
+              name.name, offsetForToken(token), uri, helper.library,
+              isSetter: true);
+        } else if (builder.isField && !builder.isFinal) {
+          setter = builder;
+        }
+        generator = new StaticAccessGenerator.fromBuilder(
+            helper, builder, send.token, setter);
+      }
+
+      return arguments == null
+          ? generator
+          : generator.doInvocation(offsetForToken(send.token), arguments);
+    } else {
+      return super.buildPropertyAccess(send, operatorOffset, isNullAware);
+    }
+  }
+
+  @override
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    if (arguments != null) {
+      int expected = 0;
+      if (declaration is KernelClassBuilder) {
+        expected = declaration.target.typeParameters.length;
+      } else if (declaration is FunctionTypeAliasBuilder) {
+        expected = declaration.target.typeParameters.length;
+      } else if (declaration is KernelTypeVariableBuilder) {
+        // Type arguments on a type variable - error reported elsewhere.
+      } else if (declaration is BuiltinTypeBuilder) {
+        // Type arguments on a built-in type, for example, dynamic or void.
+        expected = 0;
+      } else {
+        return unhandled(
+            "${declaration.runtimeType}",
+            "TypeDeclarationAccessGenerator.buildType",
+            offsetForToken(token),
+            helper.uri);
+      }
+      if (arguments.length != expected) {
+        helper.warnTypeArgumentsMismatch(
+            declaration.name, expected, offsetForToken(token));
+        // We ignore the provided arguments, which will in turn return the
+        // raw type below.
+        // TODO(sigmund): change to use an InvalidType and include the raw type
+        // as a recovery node once the IR can represent it (Issue #29840).
+        arguments = null;
+      }
+    }
+
+    DartType type;
+    if (arguments == null) {
+      TypeDeclarationBuilder typeDeclaration = declaration;
+      if (typeDeclaration is KernelClassBuilder) {
+        type = typeDeclaration.buildType(helper.library, null);
+      } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
+        type = typeDeclaration.buildType(helper.library, null);
+      }
+    }
+    if (type == null) {
+      type =
+          declaration.buildTypesWithBuiltArguments(helper.library, arguments);
+    }
+    if (type is TypeParameterType) {
+      return helper.validatedTypeVariableUse(
+          type, offsetForToken(token), nonInstanceAccessIsError);
+    }
+    return type;
+  }
+
+  @override
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return helper.buildConstructorInvocation(declaration, token, arguments, "",
+        null, token.charOffset, Constness.implicit);
+  }
+}
+
 kernel.Expression makeLet(
     VariableDeclaration variable, kernel.Expression body) {
   if (variable == null) return body;
@@ -1725,7 +2294,7 @@
     Name operator,
     Procedure interfaceTarget,
     kernel.Expression right,
-    BuilderHelper<dynamic, dynamic, Arguments> helper,
+    ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
     {int offset: TreeNode.noOffset}) {
   return new ShadowMethodInvocation(
       left,
@@ -1739,7 +2308,7 @@
 }
 
 kernel.Expression buildIsNull<Arguments>(kernel.Expression value, int offset,
-    BuilderHelper<dynamic, dynamic, Arguments> helper) {
+    ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
   return makeBinary(value, equalsName, null,
       helper.storeOffset(helper.forest.literalNull(null), offset), helper,
       offset: offset);
@@ -1750,3 +2319,13 @@
   // or is fresh (hence needs a let binding).
   return new VariableDeclaration.forValue(value);
 }
+
+int adjustForImplicitCall(String name, int offset) {
+  // Normally the offset is at the start of the token, but in this case,
+  // because we insert a '.call', we want it at the end instead.
+  return offset + (name?.length ?? 0);
+}
+
+bool isFieldOrGetter(Member member) {
+  return member is Field || (member is Procedure && member.isGetter);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
new file mode 100644
index 0000000..5af746c
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.expression_generator_helper;
+
+import '../../scanner/token.dart' show Token;
+
+import '../constant_context.dart' show ConstantContext;
+
+import '../fasta_codes.dart' show LocatedMessage;
+
+import '../messages.dart' show Message;
+
+import '../scope.dart' show ProblemBuilder, Scope;
+
+import '../type_inference/type_promotion.dart' show TypePromoter;
+
+import 'constness.dart' show Constness;
+
+import 'forest.dart' show Forest;
+
+import 'kernel_builder.dart' show PrefixBuilder;
+
+import 'kernel_ast_api.dart'
+    show
+        Constructor,
+        DartType,
+        FunctionNode,
+        FunctionType,
+        Initializer,
+        Member,
+        Name,
+        Procedure,
+        StaticGet,
+        TypeParameter,
+        TypeParameterType;
+
+import 'kernel_builder.dart'
+    show
+        KernelPrefixBuilder,
+        LibraryBuilder,
+        PrefixBuilder,
+        TypeDeclarationBuilder;
+
+abstract class ExpressionGeneratorHelper<Expression, Statement, Arguments> {
+  LibraryBuilder get library;
+
+  Uri get uri;
+
+  TypePromoter get typePromoter;
+
+  int get functionNestingLevel;
+
+  ConstantContext get constantContext;
+
+  Forest<Expression, Statement, Token, Arguments> get forest;
+
+  Constructor lookupConstructor(Name name, {bool isSuper});
+
+  Expression toValue(node);
+
+  Member lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
+
+  scopeLookup(Scope scope, String name, Token token,
+      {bool isQualified: false, PrefixBuilder prefix});
+
+  finishSend(Object receiver, Arguments arguments, int offset);
+
+  Expression buildCompileTimeError(Message message, int charOffset, int length,
+      {List<LocatedMessage> context});
+
+  Expression wrapInCompileTimeError(Expression expression, Message message);
+
+  Expression deprecated_buildCompileTimeError(String error, [int offset]);
+
+  Initializer buildInvalidInitializer(Expression expression, [int offset]);
+
+  Initializer buildFieldInitializer(
+      bool isSynthetic, String name, int offset, Expression expression);
+
+  Initializer buildSuperInitializer(
+      bool isSynthetic, Constructor constructor, Arguments arguments,
+      [int offset]);
+
+  Initializer buildRedirectingInitializer(
+      Constructor constructor, Arguments arguments,
+      [int charOffset = -1]);
+
+  Expression buildStaticInvocation(Procedure target, Arguments arguments,
+      {Constness constness, int charOffset, Member initialTarget});
+
+  Expression buildProblemExpression(
+      ProblemBuilder builder, int offset, int length);
+
+  Expression throwNoSuchMethodError(
+      Expression receiver, String name, Arguments arguments, int offset,
+      {Member candidate,
+      bool isSuper,
+      bool isGetter,
+      bool isSetter,
+      bool isStatic,
+      LocatedMessage argMessage});
+
+  LocatedMessage checkArgumentsForFunction(FunctionNode function,
+      Arguments arguments, int offset, List<TypeParameter> typeParameters);
+
+  LocatedMessage checkArgumentsForType(
+      FunctionType function, Arguments arguments, int offset);
+
+  StaticGet makeStaticGet(Member readTarget, Token token);
+
+  Expression wrapInDeferredCheck(
+      Expression expression, KernelPrefixBuilder prefix, int charOffset);
+
+  dynamic deprecated_addCompileTimeError(int charOffset, String message);
+
+  bool isIdentical(Member member);
+
+  Expression buildMethodInvocation(
+      Expression receiver, Name name, Arguments arguments, int offset,
+      {bool isConstantExpression,
+      bool isNullAware,
+      bool isImplicitCall,
+      bool isSuper,
+      Member interfaceTarget});
+
+  Expression buildConstructorInvocation(
+      TypeDeclarationBuilder type,
+      Token nameToken,
+      Arguments arguments,
+      String name,
+      List<DartType> typeArguments,
+      int charOffset,
+      Constness constness);
+
+  DartType validatedTypeVariableUse(
+      TypeParameterType type, int offset, bool nonInstanceAccessIsError);
+
+  void addProblem(Message message, int charOffset, int length);
+
+  void addProblemErrorIfConst(Message message, int charOffset, int length);
+
+  Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
+
+  Message warnUnresolvedSet(Name name, int charOffset, {bool isSuper});
+
+  Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
+
+  void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
+
+  T storeOffset<T>(T node, int offset);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
deleted file mode 100644
index 603841f..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
+++ /dev/null
@@ -1,730 +0,0 @@
-// Copyright (c) 2016, 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.
-
-part of 'expression_generator.dart';
-
-abstract class BuilderHelper<Expression, Statement, Arguments> {
-  LibraryBuilder get library;
-
-  Uri get uri;
-
-  TypePromoter get typePromoter;
-
-  int get functionNestingLevel;
-
-  ConstantContext get constantContext;
-
-  Forest<Expression, Statement, Token, Arguments> get forest;
-
-  Constructor lookupConstructor(Name name, {bool isSuper});
-
-  Expression toValue(node);
-
-  Member lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
-
-  scopeLookup(Scope scope, String name, Token token,
-      {bool isQualified: false, PrefixBuilder prefix});
-
-  finishSend(Object receiver, Arguments arguments, int offset);
-
-  Expression buildCompileTimeError(Message message, int charOffset, int length,
-      {List<LocatedMessage> context});
-
-  Expression wrapInCompileTimeError(Expression expression, Message message);
-
-  Expression deprecated_buildCompileTimeError(String error, [int offset]);
-
-  Initializer buildInvalidInitializer(Expression expression, [int offset]);
-
-  Initializer buildFieldInitializer(
-      bool isSynthetic, String name, int offset, Expression expression);
-
-  Initializer buildSuperInitializer(
-      bool isSynthetic, Constructor constructor, Arguments arguments,
-      [int offset]);
-
-  Initializer buildRedirectingInitializer(
-      Constructor constructor, Arguments arguments,
-      [int charOffset = -1]);
-
-  Expression buildStaticInvocation(Procedure target, Arguments arguments,
-      {Constness constness, int charOffset, Member initialTarget});
-
-  Expression buildProblemExpression(
-      ProblemBuilder builder, int offset, int length);
-
-  Expression throwNoSuchMethodError(
-      Expression receiver, String name, Arguments arguments, int offset,
-      {Member candidate,
-      bool isSuper,
-      bool isGetter,
-      bool isSetter,
-      bool isStatic,
-      LocatedMessage argMessage});
-
-  LocatedMessage checkArguments(FunctionTypeAccessor function,
-      Arguments arguments, CalleeDesignation calleeKind, int offset,
-      [List<TypeParameter> typeParameters]);
-
-  StaticGet makeStaticGet(Member readTarget, Token token);
-
-  Expression wrapInDeferredCheck(
-      Expression expression, KernelPrefixBuilder prefix, int charOffset);
-
-  dynamic deprecated_addCompileTimeError(int charOffset, String message);
-
-  bool isIdentical(Member member);
-
-  Expression buildMethodInvocation(
-      Expression receiver, Name name, Arguments arguments, int offset,
-      {bool isConstantExpression,
-      bool isNullAware,
-      bool isImplicitCall,
-      bool isSuper,
-      Member interfaceTarget});
-
-  Expression buildConstructorInvocation(
-      TypeDeclarationBuilder type,
-      Token nameToken,
-      Arguments arguments,
-      String name,
-      List<DartType> typeArguments,
-      int charOffset,
-      Constness constness);
-
-  DartType validatedTypeVariableUse(
-      TypeParameterType type, int offset, bool nonInstanceAccessIsError);
-
-  void addProblem(Message message, int charOffset, int length);
-
-  void addProblemErrorIfConst(Message message, int charOffset, int length);
-
-  Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
-
-  Message warnUnresolvedSet(Name name, int charOffset, {bool isSuper});
-
-  Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
-
-  void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
-
-  T storeOffset<T>(T node, int offset);
-}
-
-// The name used to refer to a call target kind
-enum CalleeDesignation { Function, Method, Constructor }
-
-// Abstraction over FunctionNode and FunctionType to access the
-// number and names of parameters.
-class FunctionTypeAccessor {
-  int requiredParameterCount;
-  int positionalParameterCount;
-
-  List _namedParameters;
-
-  Set<String> get namedParameterNames {
-    return new Set.from(_namedParameters.map((a) => a.name));
-  }
-
-  factory FunctionTypeAccessor.fromNode(FunctionNode node) {
-    return new FunctionTypeAccessor._(node.requiredParameterCount,
-        node.positionalParameters.length, node.namedParameters);
-  }
-
-  factory FunctionTypeAccessor.fromType(FunctionType type) {
-    return new FunctionTypeAccessor._(type.requiredParameterCount,
-        type.positionalParameters.length, type.namedParameters);
-  }
-
-  FunctionTypeAccessor._(this.requiredParameterCount,
-      this.positionalParameterCount, this._namedParameters);
-}
-
-// TODO(ahe): Merge this into [Generator] when all uses have been updated.
-abstract class FastaAccessor<Arguments> implements Accessor<Arguments> {
-  BuilderHelper<dynamic, dynamic, Arguments> get helper;
-
-  // TODO(ahe): Change type arguments.
-  Forest<kernel.Expression, kernel.Statement, Token, Arguments> get forest =>
-      helper.forest;
-
-  String get plainNameForRead;
-
-  String get debugName;
-
-  Uri get uri => helper.uri;
-
-  String get plainNameForWrite => plainNameForRead;
-
-  bool get isInitializer => false;
-
-  T storeOffset<T>(T node, int offset) {
-    return helper.storeOffset(node, offset);
-  }
-
-  kernel.Expression buildForEffect() => buildSimpleRead();
-
-  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    int offset = offsetForToken(token);
-    return helper.buildInvalidInitializer(
-        helper.buildCompileTimeError(
-            messageInvalidInitializer, offset, lengthForToken(token)),
-        offset);
-  }
-
-  kernel.Expression makeInvalidRead() {
-    return buildThrowNoSuchMethodError(
-        forest.literalNull(token), forest.argumentsEmpty(noLocation),
-        isGetter: true);
-  }
-
-  kernel.Expression makeInvalidWrite(kernel.Expression value) {
-    return buildThrowNoSuchMethodError(forest.literalNull(token),
-        forest.arguments(<kernel.Expression>[value], noLocation),
-        isSetter: true);
-  }
-
-  /* kernel.Expression | FastaAccessor | Initializer */ doInvocation(
-      int offset, Arguments arguments);
-
-  /* kernel.Expression | FastaAccessor */ buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
-    if (send is SendAccessor) {
-      return helper.buildMethodInvocation(buildSimpleRead(), send.name,
-          send.arguments, offsetForToken(send.token),
-          isNullAware: isNullAware);
-    } else {
-      if (helper.constantContext != ConstantContext.none &&
-          send.name != lengthName) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token), "Not a constant expression.");
-      }
-      return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
-          send.name, null, null, isNullAware);
-    }
-  }
-
-  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    helper.addProblem(templateNotAType.withArguments(token.lexeme),
-        offsetForToken(token), lengthForToken(token));
-    return const InvalidType();
-  }
-
-  /* kernel.Expression | FastaAccessor */ buildThrowNoSuchMethodError(
-      kernel.Expression receiver, Arguments arguments,
-      {bool isSuper: false,
-      bool isGetter: false,
-      bool isSetter: false,
-      bool isStatic: false,
-      String name,
-      int offset,
-      LocatedMessage argMessage}) {
-    return helper.throwNoSuchMethodError(receiver, name ?? plainNameForWrite,
-        arguments, offset ?? offsetForToken(this.token),
-        isGetter: isGetter,
-        isSetter: isSetter,
-        isSuper: isSuper,
-        isStatic: isStatic,
-        argMessage: argMessage);
-  }
-
-  bool get isThisPropertyAccess => false;
-
-  @override
-  ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
-      new ShadowIllegalAssignment(rhs);
-
-  void printOn(StringSink sink);
-
-  String toString() {
-    StringBuffer buffer = new StringBuffer();
-    buffer.write(debugName);
-    buffer.write("(offset: ");
-    buffer.write("${offsetForToken(token)}");
-    printOn(buffer);
-    buffer.write(")");
-    return "$buffer";
-  }
-}
-
-abstract class GeneratorImpl {
-  Token get token;
-
-  Uri get uri;
-
-  kernel.Expression _finish(
-      kernel.Expression body, ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_finish", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeSimpleRead() {
-    return unimplemented("_makeSimpleRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeSimpleWrite(kernel.Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeSimpleWrite", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
-      ShadowComplexAssignment complexAssignment) {
-    return unimplemented("_makeWrite", offsetForToken(token), uri);
-  }
-}
-
-abstract class IncompleteSend<Arguments> extends FastaAccessor<Arguments>
-    with GeneratorImpl {
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
-  @override
-  final Token token;
-
-  final Name name;
-
-  IncompleteSend(this.helper, this.token, this.name);
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
-
-  Arguments get arguments => null;
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(name.name);
-  }
-}
-
-class IncompleteError<Arguments> extends IncompleteSend<Arguments>
-    with ErroneousExpressionGenerator<Arguments> {
-  final Message message;
-
-  IncompleteError(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, this.message)
-      : super(helper, token, null);
-
-  String get debugName => "IncompleteError";
-
-  @override
-  kernel.Expression buildError(Arguments arguments,
-      {bool isGetter: false, bool isSetter: false, int offset}) {
-    int length = noLength;
-    if (offset == null) {
-      offset = offsetForToken(token);
-      length = lengthForToken(token);
-    }
-    return helper.buildCompileTimeError(message, offset, length);
-  }
-
-  @override
-  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
-    helper.addProblem(
-        templateNotAPrefixInTypeAnnotation.withArguments(
-            token.lexeme, suffix.name),
-        offsetForToken(token),
-        lengthOfSpan(token, suffix.token));
-    return const InvalidType();
-  }
-
-  @override
-  doInvocation(int offset, Arguments arguments) => this;
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", message: ");
-    sink.write(message.code.name);
-  }
-}
-
-class SendAccessor<Arguments> extends IncompleteSend<Arguments> {
-  @override
-  final Arguments arguments;
-
-  SendAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper, Token token,
-      Name name, this.arguments)
-      : super(helper, token, name) {
-    assert(arguments != null);
-  }
-
-  String get plainNameForRead => name.name;
-
-  String get debugName => "SendAccessor";
-
-  kernel.Expression buildSimpleRead() {
-    return unsupported("buildSimpleRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildAssignment(kernel.Expression value,
-      {bool voidContext: false}) {
-    return unsupported("buildAssignment", offsetForToken(token), uri);
-  }
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
-    if (receiver is FastaAccessor) {
-      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
-    }
-    if (receiver is PrefixBuilder) {
-      PrefixBuilder prefix = receiver;
-      if (isNullAware) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token),
-            "Library prefix '${prefix.name}' can't be used with null-aware "
-            "operator.\nTry removing '?'.");
-      }
-      receiver = helper.scopeLookup(prefix.exportScope, name.name, token,
-          isQualified: true, prefix: prefix);
-      return helper.finishSend(receiver, arguments, offsetForToken(token));
-    }
-    return helper.buildMethodInvocation(
-        helper.toValue(receiver), name, arguments, offsetForToken(token),
-        isNullAware: isNullAware);
-  }
-
-  kernel.Expression buildNullAwareAssignment(
-      kernel.Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return unsupported("buildNullAwareAssignment", offset, uri);
-  }
-
-  kernel.Expression buildCompoundAssignment(
-      Name binaryOperator, kernel.Expression value,
-      {int offset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
-    return unsupported(
-        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    super.printOn(sink);
-    sink.write(", arguments: ");
-    var node = arguments;
-    if (node is kernel.Node) {
-      printNodeOn(node, sink);
-    } else {
-      sink.write(node);
-    }
-  }
-}
-
-class IncompletePropertyAccessor<Arguments> extends IncompleteSend<Arguments> {
-  IncompletePropertyAccessor(
-      BuilderHelper<dynamic, dynamic, Arguments> helper, Token token, Name name)
-      : super(helper, token, name);
-
-  String get plainNameForRead => name.name;
-
-  String get debugName => "IncompletePropertyAccessor";
-
-  kernel.Expression buildSimpleRead() {
-    return unsupported("buildSimpleRead", offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildAssignment(kernel.Expression value,
-      {bool voidContext: false}) {
-    return unsupported("buildAssignment", offsetForToken(token), uri);
-  }
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
-    if (receiver is FastaAccessor) {
-      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
-    }
-    if (receiver is PrefixBuilder) {
-      PrefixBuilder prefix = receiver;
-      if (isNullAware) {
-        helper.deprecated_addCompileTimeError(
-            offsetForToken(token),
-            "Library prefix '${prefix.name}' can't be used with null-aware "
-            "operator.\nTry removing '?'.");
-      }
-      return helper.scopeLookup(prefix.exportScope, name.name, token,
-          isQualified: true, prefix: prefix);
-    }
-
-    return PropertyAccessGenerator.make(
-        helper, token, helper.toValue(receiver), name, null, null, isNullAware);
-  }
-
-  kernel.Expression buildNullAwareAssignment(
-      kernel.Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return unsupported("buildNullAwareAssignment", offset, uri);
-  }
-
-  kernel.Expression buildCompoundAssignment(
-      Name binaryOperator, kernel.Expression value,
-      {int offset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false}) {
-    return unsupported(
-        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset, bool voidContext: false, Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-}
-
-int adjustForImplicitCall(String name, int offset) {
-  // Normally the offset is at the start of the token, but in this case,
-  // because we insert a '.call', we want it at the end instead.
-  return offset + (name?.length ?? 0);
-}
-
-class ParenthesizedExpression<Arguments>
-    extends ReadOnlyAccessGenerator<Arguments> {
-  ParenthesizedExpression(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, kernel.Expression expression)
-      : super(helper, token, expression, null);
-
-  String get debugName => "ParenthesizedExpression";
-
-  kernel.Expression makeInvalidWrite(kernel.Expression value) {
-    return helper.deprecated_buildCompileTimeError(
-        "Can't assign to a parenthesized expression.", offsetForToken(token));
-  }
-}
-
-class TypeDeclarationAccessor<Arguments>
-    extends ReadOnlyAccessGenerator<Arguments> {
-  /// The import prefix preceding the [declaration] reference, or `null` if
-  /// the reference is not prefixed.
-  final PrefixBuilder prefix;
-
-  /// The offset at which the [declaration] is referenced by this accessor,
-  /// or `-1` if the reference is implicit.
-  final int declarationReferenceOffset;
-
-  final TypeDeclarationBuilder declaration;
-
-  TypeDeclarationAccessor(
-      BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token,
-      this.prefix,
-      this.declarationReferenceOffset,
-      this.declaration,
-      String plainNameForRead)
-      : super(helper, token, null, plainNameForRead);
-
-  String get debugName => "TypeDeclarationAccessor";
-
-  kernel.Expression get expression {
-    if (super.expression == null) {
-      int offset = offsetForToken(token);
-      if (declaration is KernelInvalidTypeBuilder) {
-        KernelInvalidTypeBuilder declaration = this.declaration;
-        helper.addProblemErrorIfConst(
-            declaration.message.messageObject, offset, token.length);
-        super.expression =
-            new Throw(forest.literalString(declaration.message.message, token))
-              ..fileOffset = offset;
-      } else {
-        super.expression = forest.literalType(
-            buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
-            token);
-      }
-    }
-    return super.expression;
-  }
-
-  kernel.Expression makeInvalidWrite(kernel.Expression value) {
-    return buildThrowNoSuchMethodError(
-        forest.literalNull(token),
-        storeOffset(forest.arguments(<kernel.Expression>[value], null),
-            value.fileOffset),
-        isSetter: true);
-  }
-
-  @override
-  buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
-    // `SomeType?.toString` is the same as `SomeType.toString`, not
-    // `(SomeType).toString`.
-    isNullAware = false;
-
-    Name name = send.name;
-    Arguments arguments = send.arguments;
-
-    if (declaration is KernelClassBuilder) {
-      KernelClassBuilder declaration = this.declaration;
-      Builder builder = declaration.findStaticBuilder(
-          name.name, offsetForToken(token), uri, helper.library);
-
-      FastaAccessor accessor;
-      if (builder == null) {
-        // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
-        if (send is IncompletePropertyAccessor) {
-          accessor = new UnresolvedAccessor(helper, send.token, name);
-        } else {
-          return helper.buildConstructorInvocation(declaration, send.token,
-              arguments, name.name, null, token.charOffset, Constness.implicit);
-        }
-      } else {
-        Builder setter;
-        if (builder.isSetter) {
-          setter = builder;
-        } else if (builder.isGetter) {
-          setter = declaration.findStaticBuilder(
-              name.name, offsetForToken(token), uri, helper.library,
-              isSetter: true);
-        } else if (builder.isField && !builder.isFinal) {
-          setter = builder;
-        }
-        accessor = new StaticAccessGenerator.fromBuilder(
-            helper, builder, send.token, setter);
-      }
-
-      return arguments == null
-          ? accessor
-          : accessor.doInvocation(offsetForToken(send.token), arguments);
-    } else {
-      return super.buildPropertyAccess(send, operatorOffset, isNullAware);
-    }
-  }
-
-  @override
-  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    if (arguments != null) {
-      int expected = 0;
-      if (declaration is KernelClassBuilder) {
-        expected = declaration.target.typeParameters.length;
-      } else if (declaration is FunctionTypeAliasBuilder) {
-        expected = declaration.target.typeParameters.length;
-      } else if (declaration is KernelTypeVariableBuilder) {
-        // Type arguments on a type variable - error reported elsewhere.
-      } else if (declaration is BuiltinTypeBuilder) {
-        // Type arguments on a built-in type, for example, dynamic or void.
-        expected = 0;
-      } else {
-        return unhandled(
-            "${declaration.runtimeType}",
-            "TypeDeclarationAccessor.buildType",
-            offsetForToken(token),
-            helper.uri);
-      }
-      if (arguments.length != expected) {
-        helper.warnTypeArgumentsMismatch(
-            declaration.name, expected, offsetForToken(token));
-        // We ignore the provided arguments, which will in turn return the
-        // raw type below.
-        // TODO(sigmund): change to use an InvalidType and include the raw type
-        // as a recovery node once the IR can represent it (Issue #29840).
-        arguments = null;
-      }
-    }
-
-    DartType type;
-    if (arguments == null) {
-      TypeDeclarationBuilder typeDeclaration = declaration;
-      if (typeDeclaration is KernelClassBuilder) {
-        type = typeDeclaration.buildType(helper.library, null);
-      } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
-        type = typeDeclaration.buildType(helper.library, null);
-      }
-    }
-    if (type == null) {
-      type =
-          declaration.buildTypesWithBuiltArguments(helper.library, arguments);
-    }
-    if (type is TypeParameterType) {
-      return helper.validatedTypeVariableUse(
-          type, offsetForToken(token), nonInstanceAccessIsError);
-    }
-    return type;
-  }
-
-  @override
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildConstructorInvocation(declaration, token, arguments, "",
-        null, token.charOffset, Constness.implicit);
-  }
-}
-
-class UnresolvedAccessor<Arguments> extends FastaAccessor<Arguments>
-    with GeneratorImpl, ErroneousExpressionGenerator<Arguments> {
-  @override
-  final Token token;
-
-  @override
-  final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
-  @override
-  final Name name;
-
-  UnresolvedAccessor(this.helper, this.token, this.name);
-
-  String get debugName => "UnresolvedAccessor";
-
-  kernel.Expression doInvocation(int charOffset, Arguments arguments) {
-    return buildError(arguments, offset: charOffset);
-  }
-
-  @override
-  DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
-    helper.addProblem(
-        templateUnresolvedPrefixInTypeAnnotation.withArguments(
-            name.name, suffix.name),
-        offsetForToken(token),
-        lengthOfSpan(token, suffix.token));
-    return const InvalidType();
-  }
-
-  @override
-  kernel.Expression buildError(Arguments arguments,
-      {bool isGetter: false, bool isSetter: false, int offset}) {
-    offset ??= offsetForToken(this.token);
-    return helper.throwNoSuchMethodError(
-        storeOffset(forest.literalNull(null), offset),
-        plainNameForRead,
-        arguments,
-        offset,
-        isGetter: isGetter,
-        isSetter: isSetter);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(name.name);
-  }
-}
-
-bool isFieldOrGetter(Member member) {
-  return member is Field || (member is Procedure && member.isGetter);
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 8f539a0..49330c6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/ast.dart'
     show
         Arguments,
+        AssertInitializer,
         BreakStatement,
         Block,
         Catch,
@@ -30,7 +31,7 @@
         VariableDeclaration,
         setParents;
 
-import '../parser.dart' show offsetForToken;
+import '../parser.dart' show offsetForToken, optional;
 
 import '../problems.dart' show unsupported;
 
@@ -40,9 +41,12 @@
     show
         ShadowArguments,
         ShadowAsExpression,
+        ShadowAssertInitializer,
+        ShadowAssertStatement,
         ShadowAwaitExpression,
         ShadowBlock,
         ShadowBoolLiteral,
+        ShadowBreakStatement,
         ShadowCheckLibraryIsLoaded,
         ShadowConditionalExpression,
         ShadowDoStatement,
@@ -222,6 +226,59 @@
   }
 
   @override
+  AssertInitializer assertInitializer(
+      Token assertKeyword,
+      Token leftParenthesis,
+      Expression condition,
+      Token comma,
+      Expression message) {
+    return new ShadowAssertInitializer(assertStatement(
+        assertKeyword, leftParenthesis, condition, comma, message, null));
+  }
+
+  @override
+  Statement assertStatement(Token assertKeyword, Token leftParenthesis,
+      Expression condition, Token comma, Expression message, Token semicolon) {
+    // Compute start and end offsets for the condition expression.
+    // This code is a temporary workaround because expressions don't carry
+    // their start and end offsets currently.
+    //
+    // The token that follows leftParenthesis is considered to be the
+    // first token of the condition.
+    // TODO(ahe): this really should be condition.fileOffset.
+    int startOffset = leftParenthesis.next.offset;
+    int endOffset;
+    {
+      // Search forward from leftParenthesis to find the last token of
+      // the condition - which is a token immediately followed by a commaToken,
+      // right parenthesis or a trailing comma.
+      Token conditionBoundary = comma ?? leftParenthesis.endGroup;
+      Token conditionLastToken = leftParenthesis;
+      while (!conditionLastToken.isEof) {
+        Token nextToken = conditionLastToken.next;
+        if (nextToken == conditionBoundary) {
+          break;
+        } else if (optional(',', nextToken) &&
+            nextToken.next == conditionBoundary) {
+          // The next token is trailing comma, which means current token is
+          // the last token of the condition.
+          break;
+        }
+        conditionLastToken = nextToken;
+      }
+      if (conditionLastToken.isEof) {
+        endOffset = startOffset = -1;
+      } else {
+        endOffset = conditionLastToken.offset + conditionLastToken.length;
+      }
+    }
+    return new ShadowAssertStatement(condition,
+        conditionStartOffset: startOffset,
+        conditionEndOffset: endOffset,
+        message: message);
+  }
+
+  @override
   Expression awaitExpression(Expression operand, Token token) {
     return new ShadowAwaitExpression(operand)
       ..fileOffset = offsetForToken(token);
@@ -245,6 +302,11 @@
   }
 
   @override
+  Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
+    return new ShadowBreakStatement(null)..fileOffset = breakKeyword.charOffset;
+  }
+
+  @override
   Expression conditionalExpression(Expression condition, Token question,
       Expression thenExpression, Token colon, Expression elseExpression) {
     return new ShadowConditionalExpression(
@@ -253,6 +315,13 @@
   }
 
   @override
+  Statement continueStatement(
+      Token continueKeyword, Object label, Token semicolon) {
+    return new ShadowBreakStatement(null)
+      ..fileOffset = continueKeyword.charOffset;
+  }
+
+  @override
   Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
       Expression condition, Token semicolon) {
     return new ShadowDoStatement(body, condition)
@@ -291,7 +360,7 @@
   }
 
   @override
-  Object parenthesizedCondition(
+  Expression parenthesizedCondition(
       Token leftParenthesis, Expression expression, Token rightParenthesis) {
     return expression;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 99375a3..f7a8b61 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -9,6 +9,8 @@
 
 import 'body_builder.dart' show Identifier;
 
+export 'body_builder.dart' show Identifier, Operator;
+
 /// A tree factory.
 ///
 /// For now, the [Location] is always a token.
@@ -133,6 +135,20 @@
   Expression asExpression(
       Expression expression, covariant type, Location location);
 
+  /// Return a representation of an assert that appears in a constructor's
+  /// initializer list.
+  Object assertInitializer(Location assertKeyword, Location leftParenthesis,
+      Expression condition, Location comma, Expression message);
+
+  /// Return a representation of an assert that appears as a statement.
+  Statement assertStatement(
+      Location assertKeyword,
+      Location leftParenthesis,
+      Expression condition,
+      Location comma,
+      Expression message,
+      Location semicolon);
+
   Expression awaitExpression(Expression operand, Location location);
 
   /// Return a representation of a block of [statements] enclosed between the
@@ -140,6 +156,10 @@
   Statement block(
       Location openBrace, List<Statement> statements, Location closeBrace);
 
+  /// Return a representation of a break statement.
+  Statement breakStatement(
+      Location breakKeyword, Identifier label, Location semicolon);
+
   /// Return a representation of a conditional expression. The [condition] is
   /// the expression preceding the question mark. The [question] is the `?`. The
   /// [thenExpression] is the expression following the question mark. The
@@ -148,6 +168,10 @@
   Expression conditionalExpression(Expression condition, Location question,
       Expression thenExpression, Location colon, Expression elseExpression);
 
+  /// Return a representation of a continue statement.
+  Statement continueStatement(
+      Location continueKeyword, Identifier label, Location semicolon);
+
   /// Return a representation of a do statement.
   Statement doStatement(
       Location doKeyword,
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 fac004f..59c4740 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
@@ -67,7 +67,9 @@
 
 import 'body_builder.dart' show combineStatements;
 
-import 'expression_generator.dart' show BuilderHelper, makeLet;
+import 'expression_generator.dart' show makeLet;
+
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
 
 /// Indicates whether type inference involving conditional expressions should
 /// always use least upper bound.
@@ -2080,8 +2082,8 @@
     // with another, and we can only replace a node if it has a parent pointer.
     assert(expression.parent != null);
 
-    // For full (non-top level) inference, we need access to the BuilderHelper
-    // so that we can perform error recovery.
+    // For full (non-top level) inference, we need access to the
+    // ExpressionGeneratorHelper so that we can perform error recovery.
     assert(isTopLevel || helper != null);
 
     // When doing top level inference, we skip subexpressions whose type isn't
@@ -2112,7 +2114,8 @@
   }
 
   @override
-  void inferInitializer(BuilderHelper helper, Initializer initializer) {
+  void inferInitializer(
+      ExpressionGeneratorHelper helper, Initializer initializer) {
     assert(initializer is ShadowInitializer);
     this.helper = helper;
     // Use polymorphic dispatch on [KernelInitializer] to perform whatever
@@ -2127,8 +2130,8 @@
 
   @override
   void inferStatement(Statement statement) {
-    // For full (non-top level) inference, we need access to the BuilderHelper
-    // so that we can perform error recovery.
+    // For full (non-top level) inference, we need access to the
+    // ExpressionGeneratorHelper so that we can perform error recovery.
     if (!isTopLevel) assert(helper != null);
 
     if (statement is ShadowStatement) {
diff --git a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
index fb9401b..27e7370 100644
--- a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
@@ -6,7 +6,7 @@
 
 import '../../scanner/token.dart' show Token;
 
-import 'assert.dart' show Assert;
+import 'error_delegation_listener.dart' show ErrorDelegationListener;
 
 import 'listener.dart' show Listener;
 
@@ -15,6 +15,8 @@
 /// Parser similar to [TopLevelParser] but also parses class members (excluding
 /// their bodies).
 class ClassMemberParser extends Parser {
+  Parser skipParser;
+
   ClassMemberParser(Listener listener) : super(listener);
 
   @override
@@ -27,13 +29,17 @@
     return token.next;
   }
 
-  @override
-  Token parseAssert(Token token, Assert kind) {
-    if (kind == Assert.Statement) {
-      return super.parseAssert(token, kind);
-    } else {
-      return skipExpression(token);
-    }
+  Token skipExpression(Token token) {
+    // TODO(askesc): We listen to errors occurring during expression parsing,
+    // since the parser may rewrite the token stream such that the error is
+    // not triggered during the second parse.
+    // When the parser supports not doing token stream rewriting, use that
+    // feature together with a no-op listener instead.
+    skipParser ??= new Parser(new ErrorDelegationListener(listener));
+    skipParser.mayParseFunctionExpressions = mayParseFunctionExpressions;
+    skipParser.asyncState = asyncState;
+    skipParser.loopState = loopState;
+    return skipParser.parseExpression(token);
   }
 
   // This method is overridden for two reasons:
diff --git a/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
new file mode 100644
index 0000000..99a7671
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../scanner/token.dart' show Token;
+
+import '../fasta_codes.dart' show Message;
+
+import 'listener.dart' show Listener;
+
+/// A listener which forwards error reports to another listener but ignores
+/// all other events.
+class ErrorDelegationListener extends Listener {
+  Listener delegate;
+
+  ErrorDelegationListener(this.delegate);
+
+  Token handleUnrecoverableError(Token token, Message message) {
+    return delegate.handleUnrecoverableError(token, message);
+  }
+
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    return delegate.handleRecoverableError(message, startToken, endToken);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 962bded..a4075e1 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -35,23 +35,21 @@
 
   /// Identifier is one of the shown/hidden names in an import/export
   /// combinator.
-  static const combinator = const IdentifierContext('combinator');
+  static const combinator = const CombinatorIdentifierContext();
 
   /// Identifier is the start of a name in an annotation that precedes a
   /// declaration (i.e. it appears directly after an `@`).
-  static const metadataReference =
-      const IdentifierContext('metadataReference', isScopeReference: true);
+  static const metadataReference = const MetadataReferenceIdentifierContext();
 
   /// Identifier is part of a name in an annotation that precedes a declaration,
   /// but it's not the first identifier in the name.
   static const metadataContinuation =
-      const IdentifierContext('metadataContinuation', isContinuation: true);
+      const MetadataReferenceIdentifierContext.continuation();
 
   /// Identifier is part of a name in an annotation that precedes a declaration,
   /// but it appears after type parameters (e.g. `foo` in `@X<Y>.foo()`).
-  static const metadataContinuationAfterTypeArguments = const IdentifierContext(
-      'metadataContinuationAfterTypeArguments',
-      isContinuation: true);
+  static const metadataContinuationAfterTypeArguments =
+      const MetadataReferenceIdentifierContext.continuationAfterTypeArguments();
 
   /// Identifier is the name being declared by a typedef declaration.
   static const typedefDeclaration = const TypedefDeclarationIdentifierContext();
@@ -77,15 +75,12 @@
 
   /// Identifier is the start of a library name referenced by a `part of`
   /// directive (e.g. `foo` in the directive `part of foo;`).
-  static const partName =
-      const IdentifierContext('partName', inLibraryOrPartOfDeclaration: true);
+  static const partName = const LibraryIdentifierContext.partName();
 
   /// Identifier is part of a library name referenced by a `part of` directive,
   /// but it's not the first identifier in the name.
-  static const partNameContinuation = const IdentifierContext(
-      'partNameContinuation',
-      inLibraryOrPartOfDeclaration: true,
-      isContinuation: true);
+  static const partNameContinuation =
+      const LibraryIdentifierContext.partNameContinuation();
 
   /// Identifier is the type name being declared by an enum declaration.
   static const enumDeclaration = const EnumDeclarationIdentifierContext();
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index a5d808f..2beb97c 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -52,6 +52,44 @@
   }
 }
 
+/// See [IdentifierContext.combinator].
+class CombinatorIdentifierContext extends IdentifierContext {
+  const CombinatorIdentifierContext() : super('combinator');
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    const followingValues = const [';', ',', 'if', 'as', 'show', 'hide'];
+
+    if (identifier.isIdentifier) {
+      if (!looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+          isOneOfOrEof(identifier.next, followingValues)) {
+        return identifier;
+      }
+      // Although this is a valid identifier name, the import declaration
+      // is invalid and this looks like the start of the next declaration.
+      // In this situation, fall through to insert a synthetic identifier.
+    }
+
+    // Recovery
+    if (isOneOfOrEof(identifier, followingValues) ||
+        looksLikeStartOfNextTopLevelDeclaration(identifier)) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: fasta.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateExpectedIdentifier);
+      if (!identifier.isKeywordOrIdentifier) {
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext.dottedName].
 class DottedNameIdentifierContext extends IdentifierContext {
   const DottedNameIdentifierContext() : super('dottedName');
@@ -334,7 +372,10 @@
   }
 }
 
-/// See [IdentifierContext.libraryName].
+/// See [IdentifierContext.libraryName],
+/// and [IdentifierContext.libraryNameContinuation]
+/// and [IdentifierContext.partName],
+/// and [IdentifierContext.partNameContinuation].
 class LibraryIdentifierContext extends IdentifierContext {
   const LibraryIdentifierContext()
       : super('libraryName', inLibraryOrPartOfDeclaration: true);
@@ -343,6 +384,13 @@
       : super('libraryNameContinuation',
             inLibraryOrPartOfDeclaration: true, isContinuation: true);
 
+  const LibraryIdentifierContext.partName()
+      : super('partName', inLibraryOrPartOfDeclaration: true);
+
+  const LibraryIdentifierContext.partNameContinuation()
+      : super('partNameContinuation',
+            inLibraryOrPartOfDeclaration: true, isContinuation: true);
+
   @override
   Token ensureIdentifier(Token token, Parser parser) {
     Token identifier = token.next;
@@ -410,6 +458,47 @@
   }
 }
 
+/// See [IdentifierContext.metadataReference]
+/// and [IdentifierContext.metadataContinuation]
+/// and [IdentifierContext.metadataContinuationAfterTypeArguments].
+class MetadataReferenceIdentifierContext extends IdentifierContext {
+  const MetadataReferenceIdentifierContext()
+      : super('metadataReference', isScopeReference: true);
+
+  const MetadataReferenceIdentifierContext.continuation()
+      : super('metadataContinuation', isContinuation: true);
+
+  const MetadataReferenceIdentifierContext.continuationAfterTypeArguments()
+      : super('metadataContinuationAfterTypeArguments', isContinuation: true);
+
+  @override
+  Token ensureIdentifier(Token token, Parser parser) {
+    Token identifier = token.next;
+    assert(identifier.kind != IDENTIFIER_TOKEN);
+    if (identifier.isIdentifier) {
+      return identifier;
+    }
+
+    // Recovery
+    if (isOneOfOrEof(identifier, const ['{', '}', '(', ')', ']']) ||
+        looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+        looksLikeStartOfNextClassMember(identifier) ||
+        looksLikeStartOfNextStatement(identifier)) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: fasta.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      parser.reportRecoverableErrorWithToken(
+          identifier, fasta.templateExpectedIdentifier);
+      if (!identifier.isKeywordOrIdentifier) {
+        // When in doubt, consume the token to ensure we make progress
+        // but insert a synthetic identifier to satisfy listeners.
+        identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+      }
+    }
+    return identifier;
+  }
+}
+
 /// See [IdentifierContext.methodDeclaration],
 /// and [IdentifierContext.methodDeclarationContinuation],
 /// and [IdentifierContext.operatorName].
@@ -655,5 +744,4 @@
 
 bool looksLikeStartOfNextTopLevelDeclaration(Token token) =>
     token.isTopLevelKeyword ||
-    isOneOfOrEof(
-        token, const ['class', 'const', 'get', 'final', 'set', 'var', 'void']);
+    isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index d0777a2..fc82a91 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -3990,71 +3990,6 @@
     return token;
   }
 
-  Token skipExpression(Token token) {
-    while (true) {
-      Token next = token.next;
-      final kind = next.kind;
-      final value = next.stringValue;
-      if ((identical(kind, EOF_TOKEN)) ||
-          (identical(value, ';')) ||
-          (identical(value, ',')) ||
-          (identical(value, '}')) ||
-          (identical(value, ')')) ||
-          (identical(value, ']'))) {
-        break;
-      }
-      if (identical(value, '=') ||
-          identical(value, '?') ||
-          identical(value, ':') ||
-          identical(value, '??')) {
-        var nextValue = next.next.stringValue;
-        if (identical(nextValue, 'const')) {
-          token = next;
-          next = token.next;
-          nextValue = next.next.stringValue;
-        }
-        if (identical(nextValue, '{')) {
-          // Handle cases like this:
-          // class Foo {
-          //   var map;
-          //   Foo() : map = {};
-          //   Foo.x() : map = true ? {} : {};
-          // }
-          token = next.next.endGroup ?? next;
-          next = token.next;
-          continue;
-        }
-        if (identical(nextValue, '<')) {
-          // Handle cases like this:
-          // class Foo {
-          //   var map;
-          //   Foo() : map = <String, Foo>{};
-          //   Foo.x() : map = true ? <String, Foo>{} : <String, Foo>{};
-          // }
-          token = next.next.endGroup ?? next;
-          next = token.next;
-          if (identical(next.stringValue, '{')) {
-            token = next.endGroup ?? next;
-            next = token.next;
-          }
-          continue;
-        }
-      }
-      if (!mayParseFunctionExpressions && identical(value, '{')) {
-        break;
-      }
-      if (next is BeginToken) {
-        token = next.endGroup ?? next;
-      } else {
-        if (next is ErrorToken) {
-          reportErrorToken(next, false);
-        }
-        token = next;
-      }
-    }
-    return token;
-  }
-
   int expressionDepth = 0;
   Token parseExpression(Token token) {
     if (expressionDepth++ > 500) {
@@ -5674,7 +5609,7 @@
       if (identical(value, 'on')) {
         // 'on' type catchPart?
         onKeyword = token;
-        lastConsumed = parseType(token);
+        lastConsumed = computeType(token, true).ensureTypeNotVoid(token, this);
         token = lastConsumed.next;
         value = token.stringValue;
       }
@@ -6135,8 +6070,10 @@
       // TODO(danrubel): Provide a more specific error message for extra ';'.
       reportRecoverableErrorWithToken(next, fasta.templateExpectedClassMember);
       listener.handleInvalidMember(next);
-      // Ensure we make progress.
-      token = next;
+      if (!identical(value, '}')) {
+        // Ensure we make progress.
+        token = next;
+      }
     } else {
       token = parseFields(beforeStart, externalToken, staticToken,
           covariantToken, varFinalOrConst, beforeType, typeInfo, token, false);
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 5cf8451..71ae91c 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -26,7 +26,8 @@
 
 import '../kernel/kernel_body_builder.dart' show KernelBodyBuilder;
 
-import '../parser.dart' show IdentifierContext, MemberKind, Parser, optional;
+import '../parser.dart'
+    show Assert, IdentifierContext, MemberKind, Parser, optional;
 
 import '../problems.dart' show internalProblem, unexpected;
 
@@ -588,6 +589,13 @@
   }
 
   @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token commaToken, Token semicolonToken) {
+    debugEvent("Assert");
+    // Do nothing
+  }
+
+  @override
   void beginClassBody(Token token) {
     debugEvent("beginClassBody");
     String name = pop();
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 195f710..1a2fa07 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -54,7 +54,7 @@
         operatorRequiredArgumentCount;
 
 import '../parser.dart'
-    show FormalParameterKind, IdentifierContext, MemberKind, optional;
+    show Assert, FormalParameterKind, IdentifierContext, MemberKind, optional;
 
 import '../problems.dart' show unhandled;
 
@@ -902,6 +902,13 @@
   }
 
   @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token commaToken, Token semicolonToken) {
+    debugEvent("Assert");
+    // Do nothing
+  }
+
+  @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     String documentationComment = getDocumentationComment(enumKeyword);
     List constantNamesAndOffsets = popList(count * 3);
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 eaa54e0..9237dcd 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
@@ -62,8 +62,10 @@
 
 import '../fasta_codes.dart';
 
-import '../kernel/expression_generator.dart'
-    show BuilderHelper, CalleeDesignation, FunctionTypeAccessor, buildIsNull;
+import '../kernel/expression_generator.dart' show buildIsNull;
+
+import '../kernel/expression_generator_helper.dart'
+    show ExpressionGeneratorHelper;
 
 import '../kernel/kernel_shadow_ast.dart'
     show
@@ -322,18 +324,20 @@
   Uri get uri;
 
   /// Performs full type inference on the given field initializer.
-  void inferFieldInitializer(
-      BuilderHelper helper, DartType declaredType, Expression initializer);
+  void inferFieldInitializer(ExpressionGeneratorHelper helper,
+      DartType declaredType, Expression initializer);
 
   /// Performs type inference on the given function body.
-  void inferFunctionBody(BuilderHelper helper, DartType returnType,
+  void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
       AsyncMarker asyncMarker, Statement body);
 
   /// Performs type inference on the given constructor initializer.
-  void inferInitializer(BuilderHelper helper, Initializer initializer);
+  void inferInitializer(
+      ExpressionGeneratorHelper helper, Initializer initializer);
 
   /// Performs type inference on the given metadata annotations.
-  void inferMetadata(BuilderHelper helper, List<Expression> annotations);
+  void inferMetadata(
+      ExpressionGeneratorHelper helper, List<Expression> annotations);
 
   /// Performs type inference on the given metadata annotations keeping the
   /// existing helper if possible.
@@ -341,8 +345,8 @@
 
   /// Performs type inference on the given function parameter initializer
   /// expression.
-  void inferParameterInitializer(
-      BuilderHelper helper, Expression initializer, DartType declaredType);
+  void inferParameterInitializer(ExpressionGeneratorHelper helper,
+      Expression initializer, DartType declaredType);
 }
 
 /// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -362,25 +366,27 @@
   Uri get uri => null;
 
   @override
-  void inferFieldInitializer(
-      BuilderHelper helper, DartType declaredType, Expression initializer) {}
+  void inferFieldInitializer(ExpressionGeneratorHelper helper,
+      DartType declaredType, Expression initializer) {}
 
   @override
-  void inferFunctionBody(BuilderHelper helper, DartType returnType,
+  void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
       AsyncMarker asyncMarker, Statement body) {}
 
   @override
-  void inferInitializer(BuilderHelper helper, Initializer initializer) {}
+  void inferInitializer(
+      ExpressionGeneratorHelper helper, Initializer initializer) {}
 
   @override
-  void inferMetadata(BuilderHelper helper, List<Expression> annotations) {}
+  void inferMetadata(
+      ExpressionGeneratorHelper helper, List<Expression> annotations) {}
 
   @override
   void inferMetadataKeepingHelper(List<Expression> annotations) {}
 
   @override
-  void inferParameterInitializer(
-      BuilderHelper helper, Expression initializer, DartType declaredType) {}
+  void inferParameterInitializer(ExpressionGeneratorHelper helper,
+      Expression initializer, DartType declaredType) {}
 }
 
 /// Derived class containing generic implementations of [TypeInferrer].
@@ -418,7 +424,7 @@
 
   final SourceLibraryBuilder library;
 
-  BuilderHelper helper;
+  ExpressionGeneratorHelper helper;
 
   /// Context information for the current closure, or `null` if we are not
   /// inside a closure.
@@ -924,8 +930,8 @@
       Expression expression, DartType typeContext, bool typeNeeded);
 
   @override
-  void inferFieldInitializer(
-      BuilderHelper helper, DartType declaredType, Expression initializer) {
+  void inferFieldInitializer(ExpressionGeneratorHelper helper,
+      DartType declaredType, Expression initializer) {
     assert(closureContext == null);
     this.helper = helper;
     var actualType = inferExpression(
@@ -944,7 +950,7 @@
   DartType inferFieldTopLevel(ShadowField field, bool typeNeeded);
 
   @override
-  void inferFunctionBody(BuilderHelper helper, DartType returnType,
+  void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
       AsyncMarker asyncMarker, Statement body) {
     assert(closureContext == null);
     this.helper = helper;
@@ -1057,14 +1063,8 @@
       arguments.types.addAll(inferredTypes);
     }
     if (typeChecksNeeded && !identical(calleeType, unknownFunction)) {
-      CalleeDesignation calleeKind = receiverType is FunctionType
-          ? CalleeDesignation.Function
-          : CalleeDesignation.Method;
-      LocatedMessage argMessage = helper.checkArguments(
-          new FunctionTypeAccessor.fromType(calleeType),
-          arguments,
-          calleeKind,
-          offset);
+      LocatedMessage argMessage =
+          helper.checkArgumentsForType(calleeType, arguments, offset);
       if (argMessage != null) {
         helper.addProblem(
             argMessage.messageObject, argMessage.charOffset, argMessage.length);
@@ -1243,7 +1243,8 @@
   }
 
   @override
-  void inferMetadata(BuilderHelper helper, List<Expression> annotations) {
+  void inferMetadata(
+      ExpressionGeneratorHelper helper, List<Expression> annotations) {
     if (annotations != null) {
       this.helper = helper;
       inferMetadataKeepingHelper(annotations);
@@ -1325,8 +1326,8 @@
   }
 
   @override
-  void inferParameterInitializer(
-      BuilderHelper helper, Expression initializer, DartType declaredType) {
+  void inferParameterInitializer(ExpressionGeneratorHelper helper,
+      Expression initializer, DartType declaredType) {
     assert(closureContext == null);
     this.helper = helper;
     assert(declaredType != null);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 6554d8e..0297c47 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -267,7 +267,22 @@
         downwardsInferPhase: formalTypes == null);
   }
 
-  /// Use the given [constraints] to substitute for type variables..
+  bool hasOmittedBound(TypeParameter parameter) {
+    // If the bound was omitted by the programmer, the Kernel representation for
+    // the parameter will look similar to the following:
+    //
+    //     T extends Object = dynamic
+    //
+    // Note that it's not possible to receive [Object] as [TypeParameter.bound]
+    // and `dynamic` as [TypeParameter.defaultType] from the front end in any
+    // other way.
+    DartType bound = parameter.bound;
+    return bound is InterfaceType &&
+        identical(bound.classNode, coreTypes.objectClass) &&
+        parameter.defaultType is DynamicType;
+  }
+
+  /// Use the given [constraints] to substitute for type variables.
   ///
   /// [typeParametersToInfer] is the set of type parameters that should be
   /// substituted for.  [inferredTypes] should be a list of the same length.
@@ -293,7 +308,7 @@
 
       var typeParamBound = typeParam.bound;
       DartType extendsConstraint;
-      if (!_isObjectOrDynamic(typeParamBound)) {
+      if (!hasOmittedBound(typeParam)) {
         extendsConstraint = Substitution
             .fromPairs(typeParametersToInfer, inferredTypes)
             .substituteType(typeParamBound);
@@ -326,7 +341,7 @@
 
       var inferred = inferredTypes[i];
       bool success = typeSatisfiesConstraint(inferred, constraint);
-      if (success && !_isObjectOrDynamic(typeParamBound)) {
+      if (success && !hasOmittedBound(typeParam)) {
         // If everything else succeeded, check the `extends` constraint.
         var extendsConstraint = typeParamBound;
         success = isSubtypeOf(inferred, extendsConstraint);
@@ -666,11 +681,6 @@
     return hierarchy.getClassicLeastUpperBound(type1, type2);
   }
 
-  bool _isObjectOrDynamic(DartType type) =>
-      type is DynamicType ||
-      (type is InterfaceType &&
-          identical(type.classNode, coreTypes.objectClass));
-
   DartType _typeParameterLeastUpperBound(DartType type1, DartType type2) {
     // This currently just implements a simple least upper bound to
     // handle some common cases.  It also avoids some termination issues
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index d6a7570..02eedd8 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -83,8 +83,6 @@
 ConstEvalNonConstantLiteral/dart2jsCode: Fail
 ConstEvalNonConstantLiteral/example: Fail
 ConstFieldWithoutInitializer/example: Fail
-ConstructorHasNoSuchNamedParameter/analyzerCode: Fail
-ConstructorHasNoSuchNamedParameter/example: Fail
 ConstructorNotFound/analyzerCode: Fail
 ConstructorNotFound/example: Fail
 ContinueOutsideOfLoop/script1: Fail
@@ -195,8 +193,6 @@
 ForInLoopExactlyOneVariable/statement: Fail # Fasta reports too many errors.
 ForInLoopNotAssignable/analyzerCode: Fail # The analyzer reports a different error.
 ForInLoopNotAssignable/statement: Fail
-FunctionHasNoSuchNamedParameter/analyzerCode: Fail
-FunctionHasNoSuchNamedParameter/example: Fail
 FunctionTypeDefaultValue/example: Fail
 FunctionTypedParameterVar/script1: Fail
 GeneratorReturnsValue/example: Fail
@@ -258,8 +254,6 @@
 MemberWithSameNameAsClass/example: Fail
 MetadataTypeArguments/analyzerCode: Fail
 MetadataTypeArguments/example: Fail
-MethodHasNoSuchNamedParameter/analyzerCode: Fail
-MethodHasNoSuchNamedParameter/example: Fail
 MethodNotFound/analyzerCode: Fail
 MethodNotFound/example: Fail
 MissingAssignableSelector/script1: Fail
@@ -280,6 +274,8 @@
 NamedFunctionExpression/example: Fail
 NativeClauseShouldBeAnnotation/example: Fail
 NoFormals/example: Fail
+NoSuchNamedParameter/analyzerCode: Fail
+NoSuchNamedParameter/example: Fail
 NoUnnamedConstructorInObject/analyzerCode: Fail
 NoUnnamedConstructorInObject/example: Fail
 NonAsciiIdentifier/expression: Fail
@@ -388,18 +384,10 @@
 ThisAccessInFieldInitializer/example: Fail
 ThisAsIdentifier/analyzerCode: Fail
 ThisAsIdentifier/example: Fail
-TooFewArgumentsToConstructor/analyzerCode: Fail
-TooFewArgumentsToConstructor/example: Fail
-TooFewArgumentsToFunction/analyzerCode: Fail
-TooFewArgumentsToFunction/example: Fail
-TooFewArgumentsToMethod/analyzerCode: Fail
-TooFewArgumentsToMethod/example: Fail
-TooManyArgumentsToConstructor/analyzerCode: Fail
-TooManyArgumentsToConstructor/example: Fail
-TooManyArgumentsToFunction/analyzerCode: Fail
-TooManyArgumentsToFunction/example: Fail
-TooManyArgumentsToMethod/analyzerCode: Fail
-TooManyArgumentsToMethod/example: Fail
+TooFewArguments/analyzerCode: Fail
+TooFewArguments/example: Fail
+TooManyArguments/analyzerCode: Fail
+TooManyArguments/example: Fail
 TopLevelOperator/script1: Fail
 TopLevelOperator/script2: Fail
 TopLevelOperator/script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index acbe910..1e8e061 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1065,40 +1065,16 @@
   template: "The class '#name' has a constructor that takes no arguments."
   severity: CONTEXT
 
-TooFewArgumentsToFunction:
-  template: "Too few positional arguments to function: #count required, #count2 given."
+TooFewArguments:
+  template: "Too few positional arguments: #count required, #count2 given."
   severity: ERROR_LEGACY_WARNING
 
-TooFewArgumentsToMethod:
-  template: "Too few positional arguments to method: #count required, #count2 given."
+TooManyArguments:
+  template: "Too many positional arguments: #count allowed, #count2 given."
   severity: ERROR_LEGACY_WARNING
 
-TooFewArgumentsToConstructor:
-  template: "Too few positional arguments to constructor: #count required, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToFunction:
-  template: "Too many positional arguments to function: #count allowed, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToMethod:
-  template: "Too many positional arguments to method: #count allowed, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToConstructor:
-  template: "Too many positional arguments to constructor: #count allowed, #count2 given."
-  severity: ERROR_LEGACY_WARNING
-
-FunctionHasNoSuchNamedParameter:
-  template: "Function has no named parameter with the name '#name'."
-  severity: ERROR_LEGACY_WARNING
-
-MethodHasNoSuchNamedParameter:
-  template: "Method has no named parameter with the name '#name'."
-  severity: ERROR_LEGACY_WARNING
-
-ConstructorHasNoSuchNamedParameter:
-  template: "Constructor has no named parameter with the name '#name'."
+NoSuchNamedParameter:
+  template: "No named parameter with the name '#name'."
   severity: ERROR_LEGACY_WARNING
 
 AbstractClassInstantiation:
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index de65fd9..e228c60 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -47,25 +47,25 @@
 import 'package:front_end/src/fasta/kernel/expression_generator.dart'
     show
         DeferredAccessGenerator,
-        FastaAccessor,
-        IncompleteError,
-        IncompletePropertyAccessor,
+        Generator,
+        IncompleteErrorGenerator,
+        IncompletePropertyAccessGenerator,
         IndexedAccessGenerator,
         LargeIntAccessGenerator,
         LoadLibraryGenerator,
         NullAwarePropertyAccessGenerator,
-        ParenthesizedExpression,
+        ParenthesizedExpressionGenerator,
         PropertyAccessGenerator,
         ReadOnlyAccessGenerator,
-        SendAccessor,
+        SendAccessGenerator,
         StaticAccessGenerator,
         SuperIndexedAccessGenerator,
         SuperPropertyAccessGenerator,
         ThisAccessGenerator,
         ThisIndexedAccessGenerator,
         ThisPropertyAccessGenerator,
-        TypeDeclarationAccessor,
-        UnresolvedAccessor,
+        TypeDeclarationAccessGenerator,
+        UnresolvedNameGenerator,
         VariableUseGenerator;
 
 import 'package:front_end/src/fasta/kernel/body_builder.dart'
@@ -76,7 +76,7 @@
 
 import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
 
-void check(String expected, FastaAccessor<Arguments> generator) {
+void check(String expected, Generator<Arguments> generator) {
   Expect.stringEquals(expected, "$generator");
 }
 
@@ -123,7 +123,7 @@
     KernelBodyBuilder helper = new KernelBodyBuilder(
         libraryBuilder, null, null, null, null, null, null, false, uri, null);
 
-    FastaAccessor accessor =
+    Generator generator =
         new ThisAccessGenerator<Arguments>(helper, token, false);
 
     Library library = new Library(uri);
@@ -137,12 +137,12 @@
         "DelayedAssignment(offset: 4, value: expression,"
         " assignmentOperator: +=)",
         new DelayedAssignment<Arguments>(
-            helper, token, accessor, expression, assignmentOperator));
+            helper, token, generator, expression, assignmentOperator));
     check(
         "DelayedPostfixIncrement(offset: 4, binaryOperator: +,"
         " interfaceTarget: $uri::#class1::myInterfaceTarget)",
         new DelayedPostfixIncrement<Arguments>(
-            helper, token, accessor, binaryOperator, interfaceTarget));
+            helper, token, generator, binaryOperator, interfaceTarget));
     check(
         "VariableUseGenerator(offset: 4, variable: dynamic #t1;\n,"
         " promotedType: void)",
@@ -197,19 +197,19 @@
     check(
         "ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
         new ThisAccessGenerator<Arguments>(helper, token, false));
-    check("IncompleteError(offset: 4, message: Unspecified)",
-        new IncompleteError<Arguments>(helper, token, message));
-    check("SendAccessor(offset: 4, name: bar, arguments: (\"arg\"))",
-        new SendAccessor<Arguments>(helper, token, name, arguments));
-    check("IncompletePropertyAccessor(offset: 4, name: bar)",
-        new IncompletePropertyAccessor<Arguments>(helper, token, name));
+    check("IncompleteErrorGenerator(offset: 4, message: Unspecified)",
+        new IncompleteErrorGenerator<Arguments>(helper, token, message));
+    check("SendAccessGenerator(offset: 4, name: bar, arguments: (\"arg\"))",
+        new SendAccessGenerator<Arguments>(helper, token, name, arguments));
+    check("IncompletePropertyAccessGenerator(offset: 4, name: bar)",
+        new IncompletePropertyAccessGenerator<Arguments>(helper, token, name));
     check(
         "DeferredAccessGenerator(offset: 4, "
         "builder: Instance of 'PrefixBuilder',"
-        " accessor: ThisAccessGenerator(offset: 4, isInitializer: false,"
+        " generator: ThisAccessGenerator(offset: 4, isInitializer: false,"
         " isSuper: false))",
         new DeferredAccessGenerator<Arguments>(
-            helper, token, prefixBuilder, accessor));
+            helper, token, prefixBuilder, generator));
     check(
         "ReadOnlyAccessGenerator(offset: 4, expression: expression,"
         " plainNameForRead: foo, value: null)",
@@ -218,15 +218,16 @@
     check("LargeIntAccessGenerator(offset: 4, lexeme: myToken)",
         new LargeIntAccessGenerator<Arguments>(helper, token));
     check(
-        "ParenthesizedExpression(offset: 4, expression: expression,"
+        "ParenthesizedExpressionGenerator(offset: 4, expression: expression,"
         " plainNameForRead: null, value: null)",
-        new ParenthesizedExpression<Arguments>(helper, token, expression));
+        new ParenthesizedExpressionGenerator<Arguments>(
+            helper, token, expression));
     check(
-        "TypeDeclarationAccessor(offset: 4, expression: T,"
+        "TypeDeclarationAccessGenerator(offset: 4, expression: T,"
         " plainNameForRead: foo, value: null)",
-        new TypeDeclarationAccessor<Arguments>(
+        new TypeDeclarationAccessGenerator<Arguments>(
             helper, token, prefixBuilder, -1, declaration, "foo"));
-    check("UnresolvedAccessor(offset: 4, name: bar)",
-        new UnresolvedAccessor<Arguments>(helper, token, name));
+    check("UnresolvedNameGenerator(offset: 4, name: bar)",
+        new UnresolvedNameGenerator<Arguments>(helper, token, name));
   });
 }
diff --git a/pkg/front_end/test/src/byte_store/crc32_test.dart b/pkg/front_end/test/src/byte_store/crc32_test.dart
new file mode 100644
index 0000000..0119bb8
--- /dev/null
+++ b/pkg/front_end/test/src/byte_store/crc32_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:front_end/src/byte_store/crc32.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(Crc32Test);
+  });
+}
+
+@reflectiveTest
+class Crc32Test {
+  test_bytes_0() {
+    expect(getCrc32([]), 0x00000000);
+  }
+
+  test_bytes_1() {
+    expect(getCrc32([0x00]), 0xD202EF8D);
+  }
+
+  test_bytes_2() {
+    expect(getCrc32([0x01]), 0xA505DF1B);
+  }
+
+  test_bytes_3() {
+    expect(getCrc32([0x01, 0x02]), 0xB6CC4292);
+  }
+
+  test_string() {
+    expect(getCrc32(UTF8.encode('My very long test string.')), 0x88B8252E);
+  }
+}
diff --git a/pkg/front_end/test/src/byte_store/file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
new file mode 100644
index 0000000..a2aa7ed
--- /dev/null
+++ b/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
@@ -0,0 +1,64 @@
+// 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:front_end/src/byte_store/file_byte_store.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FileByteStoreValidatorTest);
+  });
+}
+
+@reflectiveTest
+class FileByteStoreValidatorTest {
+  final validator = new FileByteStoreValidator();
+
+  test_get_bad_notEnoughBytes() {
+    List<int> bytes = <int>[1, 2, 3];
+    List<int> data = validator.getData(bytes);
+    expect(data, isNull);
+  }
+
+  test_get_bad_notEnoughBytes_zero() {
+    List<int> bytes = <int>[];
+    List<int> data = validator.getData(bytes);
+    expect(data, isNull);
+  }
+
+  test_get_bad_wrongChecksum() {
+    List<int> data = <int>[1, 2, 3];
+    List<int> bytes = validator.wrapData(data);
+
+    // Damage the checksum.
+    expect(bytes[bytes.length - 1], isNot(42));
+    bytes[bytes.length - 1] = 42;
+
+    List<int> data2 = validator.getData(bytes);
+    expect(data2, isNull);
+  }
+
+  test_get_bad_wrongVersion() {
+    List<int> bytes = <int>[0xBA, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
+    List<int> data = validator.getData(bytes);
+    expect(data, isNull);
+  }
+
+  test_get_good() {
+    List<int> data = <int>[1, 2, 3];
+    List<int> bytes = validator.wrapData(data);
+    List<int> data2 = validator.getData(bytes);
+    expect(data2, hasLength(3));
+    expect(data2, data);
+  }
+
+  test_get_good_zeroBytesData() {
+    List<int> data = <int>[];
+    List<int> bytes = validator.wrapData(data);
+    List<int> data2 = validator.getData(bytes);
+    expect(data2, hasLength(0));
+    expect(data2, data);
+  }
+}
diff --git a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
index 6bb60d3..d117bf4 100644
--- a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
+++ b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
@@ -22,6 +22,8 @@
 
 @reflectiveTest
 class ProtectedFileByteStoreTest {
+  static const PADDING = 8;
+
   io.Directory cacheDirectory;
   String cachePath;
   ProtectedFileByteStore store;
@@ -167,7 +169,7 @@
     }
     includes.forEach((expectedKey, expectedLength) {
       expect(keyToLength, contains(expectedKey));
-      expect(keyToLength, containsPair(expectedKey, expectedLength));
+      expect(keyToLength, containsPair(expectedKey, expectedLength + PADDING));
     });
     for (var excludedKey in excludes) {
       expect(keyToLength.keys, isNot(contains(excludedKey)));
diff --git a/pkg/front_end/test/src/byte_store/test_all.dart b/pkg/front_end/test/src/byte_store/test_all.dart
index f702dcb..49fb3b4 100644
--- a/pkg/front_end/test/src/byte_store/test_all.dart
+++ b/pkg/front_end/test/src/byte_store/test_all.dart
@@ -6,6 +6,8 @@
 
 import 'byte_store_test.dart' as byte_store_test;
 import 'cache_test.dart' as cache_test;
+import 'crc32_test.dart' as crc32_test;
+import 'file_byte_store_test.dart' as file_byte_store_test;
 import 'protected_file_byte_store_test.dart' as protected_file_byte_store_test;
 
 /// Utility for manually running all tests.
@@ -13,6 +15,8 @@
   defineReflectiveSuite(() {
     byte_store_test.main();
     cache_test.main();
+    crc32_test.main();
+    file_byte_store_test.main();
     protected_file_byte_store_test.main();
   }, name: 'byte_store');
 }
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index cbb6e2d..1301285 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -46,7 +46,6 @@
 regress/issue_29941: Crash
 regress/issue_29943: Crash
 regress/issue_29983: Crash # 'package:analyzer/src/fasta/ast_builder.dart': Failed assertion: line 478 pos 12: 'star == null': is not true.
-regress/issue_31155: Crash # Issue 31155.
 regress/issue_31157: Crash
 regress/issue_31180: Crash
 regress/issue_31186: Crash
diff --git a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
index 6d5759c..86b5197 100644
--- a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 static field core::List<core::String> stringList = <dynamic>["bar"];
 static method asyncString() → asy::Future<core::String> /* originally async */ {
-  final asy::Completer<core::String> :completer = asy::Completer::sync<core::String>();
+  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
   asy::FutureOr<core::String> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -19,20 +19,20 @@
         :return_value = "foo";
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method asyncString2() → asy::Future<core::String> /* originally async */ {
-  final asy::Completer<core::String> :completer = asy::Completer::sync<core::String>();
+  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
   asy::FutureOr<core::String> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -46,17 +46,17 @@
         :return_value = self::asyncString();
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
   dynamic :await_jump_var = 0;
@@ -170,7 +170,7 @@
   return :controller.{asy::_AsyncStarStreamController::stream};
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -185,15 +185,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
         core::String str = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/await.dart.direct.transformed.expect b/pkg/front_end/testcases/await.dart.direct.transformed.expect
index 7a12084..c0f0f71 100644
--- a/pkg/front_end/testcases/await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -19,15 +19,15 @@
         [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
         core::print(:result);
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
index 8716818..b8cd3f73 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -21,15 +21,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
         def::m(:result);
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
index 342fff7..57fd263 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,15 +22,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
         def::m(:result);
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 31b8193..1623e1d 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -102,7 +102,6 @@
 regress/issue_29976: RuntimeError # Issue 29976.
 regress/issue_29982: Fail # Issue 29982.
 regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31155: Crash # Issue 31155.
 
 runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
 runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
index dbae521..359d991 100644
--- a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -30,17 +30,17 @@
           :return_value = this.{self::B::a}.foo();
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class C extends core::Object {
@@ -49,7 +49,7 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -63,17 +63,17 @@
           :return_value = this.{self::C::b}.bar();
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
index b18f9fb..fa7b7ac 100644
--- a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -30,17 +30,17 @@
           :return_value = this.{self::B::a}.{self::A::foo}();
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class C extends core::Object {
@@ -49,7 +49,7 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -63,17 +63,17 @@
           :return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
index 40299a9..839f1dd 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -32,7 +32,7 @@
         asy::FutureOr<self::MyFuture> x8;
         self::MyFuture x9;
         function test0() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -46,20 +46,20 @@
                 :return_value = x0;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test1() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -73,20 +73,20 @@
                 :return_value = x1;
                 break #L3;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test2() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -100,20 +100,20 @@
                 :return_value = x2;
                 break #L4;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test3() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -127,20 +127,20 @@
                 :return_value = x3;
                 break #L5;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test4() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -154,20 +154,20 @@
                 :return_value = x4;
                 break #L6;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test5() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -181,20 +181,20 @@
                 :return_value = x5;
                 break #L7;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test6() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -208,20 +208,20 @@
                 :return_value = x6;
                 break #L8;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test7() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -235,20 +235,20 @@
                 :return_value = x7;
                 break #L9;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test8() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -262,20 +262,20 @@
                 :return_value = x8;
                 break #L10;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test9() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -289,17 +289,17 @@
                 :return_value = x9;
                 break #L11;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
         dynamic y0 = :result;
@@ -322,16 +322,16 @@
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
         dynamic y9 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
index 2e07d8f..d0c0e68 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -32,7 +32,7 @@
         asy::FutureOr<self::MyFuture> x8;
         self::MyFuture x9;
         function test0() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -46,20 +46,20 @@
                 :return_value = x0;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test1() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -73,20 +73,20 @@
                 :return_value = x1;
                 break #L3;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test2() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::Completer<asy::Future<core::int>> :completer = asy::Completer::sync<asy::Future<core::int>>();
+          final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
           asy::FutureOr<asy::Future<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -100,20 +100,20 @@
                 :return_value = x2;
                 break #L4;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test3() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::Completer<asy::FutureOr<core::int>> :completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+          final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
           asy::FutureOr<asy::FutureOr<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -127,20 +127,20 @@
                 :return_value = x3;
                 break #L5;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test4() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::Completer<self::MyFuture> :completer = asy::Completer::sync<self::MyFuture>();
+          final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
           asy::FutureOr<self::MyFuture> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -154,20 +154,20 @@
                 :return_value = x4;
                 break #L6;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test5() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -181,20 +181,20 @@
                 :return_value = x5;
                 break #L7;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test6() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::Completer<asy::Future<core::int>> :completer = asy::Completer::sync<asy::Future<core::int>>();
+          final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
           asy::FutureOr<asy::Future<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -208,20 +208,20 @@
                 :return_value = x6;
                 break #L8;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test7() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::Completer<asy::FutureOr<core::int>> :completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+          final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
           asy::FutureOr<asy::FutureOr<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -235,20 +235,20 @@
                 :return_value = x7;
                 break #L9;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test8() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::Completer<self::MyFuture> :completer = asy::Completer::sync<self::MyFuture>();
+          final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
           asy::FutureOr<self::MyFuture> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -262,20 +262,20 @@
                 :return_value = x8;
                 break #L10;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         function test9() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -289,17 +289,17 @@
                 :return_value = x9;
                 break #L11;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
         core::int y0 = :result;
@@ -322,16 +322,16 @@
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
         core::int y9 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
index a111519..cdfa0e5 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::Future<core::int> futureInt = null;
 static field dynamic f = () → dynamic => self::futureInt;
 static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
index a6aca80..e35517f 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::Future<core::int> futureInt = null;
 static field () → asy::Future<core::int> f = () → asy::Future<core::int> => self::futureInt;
 static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
index 4bf2eb0..92ac896 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:async" as asy;
 
 static field dynamic f = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,17 +17,17 @@
         :return_value = 0;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
index 5af9546..d7fa5b6 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static field () → asy::Future<core::int> f = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -18,17 +18,17 @@
         :return_value = 0;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
index 7702de6..0483a9f 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::FutureOr<core::int> futureOrInt = null;
 static field dynamic f = () → dynamic => self::futureOrInt;
 static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureOrInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
index f49a5d2..5910611 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::FutureOr<core::int> futureOrInt = null;
 static field () → asy::FutureOr<core::int> f = () → asy::FutureOr<core::int> => self::futureOrInt;
 static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,17 +20,17 @@
         :return_value = self::futureOrInt;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
   self::f;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
index ae1ed7a..cc66edb 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
index 649f426..af00522 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
index 93b15b0..b16d670 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
index 97e2f95..2087333 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
index 8c968ee..7c5e12b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
index 45d5637..08a88b2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
             break #L1;
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
   asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
index 04b9dad..642c44a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,7 +17,7 @@
       #L1:
       {
         dynamic f = () → asy::Future<dynamic> /* originally async */ {
-          final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
           asy::FutureOr<dynamic> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -31,32 +31,32 @@
                 :return_value = null;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         };
         asy::Future<dynamic> y = f.call();
         asy::Future<core::String> z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index 1afc8d9..da3ad50 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,7 +17,7 @@
       #L1:
       {
         () → asy::Future<core::Null> f = () → asy::Future<core::Null> /* originally async */ {
-          final asy::Completer<core::Null> :completer = asy::Completer::sync<core::Null>();
+          final asy::Completer<core::Null> :async_completer = asy::Completer::sync<core::Null>();
           asy::FutureOr<core::Null> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -31,32 +31,32 @@
                 :return_value = null;
                 break #L2;
               }
-              :completer.{asy::Completer::complete}(:return_value);
+              :async_completer.{asy::Completer::complete}(:return_value);
               return;
             }
             on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
             }
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
           asy::Future::microtask<dynamic>(:async_op);
-          return :completer.{asy::Completer::future};
+          return :async_completer.{asy::Completer::future};
         };
         asy::Future<dynamic> y = f.call();
         asy::Future<core::String> z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
index e58820a..3254b80 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -54,15 +54,15 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().first, :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index 1d67b45..20fe1a2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -54,15 +54,15 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
index 126c90b..48cd5f2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,15 +22,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::int> l1 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
index c7716b6..498dfc2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,15 +22,15 @@
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::List<core::int>>(<core::int>[d as{TypeError} core::int]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::int> l1 = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
index 3ef1a43..8a0ba8a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
@@ -10,7 +10,7 @@
 static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -139,20 +139,20 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -212,15 +212,15 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 7dee1bb..49348b8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -139,20 +139,20 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -212,15 +212,15 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
index 67e28bf..c86a42f 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -67,16 +67,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index 3b987da..ab6f7a7 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -67,16 +67,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
index 440a04c..39bf766 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index ab76573..7eaed28 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
index 8dd522c..4b7549d 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index a5f1b36..90bcbbb 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
index 11ee82f..7c89606 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
     return asy::Future::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 79dea19..ca483a5 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
     return asy::Future::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
index 2c1403c..746d72c 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
     return new self::MyFuture::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index d0224a3..21ecf5e 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
     return new self::MyFuture::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
index c373616..f996ff9 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 4181e8a..b19d080 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = new self::MyFuture::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
index 7ea34b6..dda0a4f 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 5013ebe..8214748 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -40,20 +40,20 @@
           :return_value = :result;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -69,20 +69,20 @@
           :return_value = :result;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,20 +96,20 @@
           :return_value = 3;
           break #L3;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -123,24 +123,24 @@
           :return_value = 3;
           break #L4;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> {
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -154,20 +154,20 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L5;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -181,17 +181,17 @@
           :return_value = asy::Future::value<core::int>(3);
           break #L6;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
index ef09e80..ee8635c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : asy::Future::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index d37757e..4edac72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
index 633179c..0d47534 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index ce0b933..f44cce1 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
index ef96253..1373697 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : asy::Future::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index cf77812..15d1ad2 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
index 8299fbb..f91e051 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
   self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index e57873c..ea24809 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
index 4d49b6e..21cf312 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index 468ec31..e258784 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
index ba9e600..1a49a72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = :result ? 2 : asy::Future::value<core::int>(3);
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index 792ef91..a172c81 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -47,20 +47,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -76,17 +76,17 @@
           :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
index e57d937..e67586a 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::int> f;
   asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -48,20 +48,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -77,17 +77,17 @@
           :return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int>(3) : #t5);
   asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index 311f23d..871bcf6 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::int> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -48,20 +48,20 @@
           :return_value = :async_temporary_0;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -77,17 +77,17 @@
           :return_value = (let final core::int #t4 = :result in #t4.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t4) as{TypeError} asy::FutureOr<core::int>;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> => (let final core::int #t5 = x in #t5.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t5) as{TypeError} asy::FutureOr<core::int>);
   asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
index 9397ba5..41c4879 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = x ? 42 : asy::Future::value<dynamic>(42);
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = x ? 42 : asy::Future::value<dynamic>(42);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index 61d62cb..c5b890a 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y as{TypeError} asy::FutureOr<core::int>;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
index f31e5ca..4d30bd8 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index ab69947..3e881c5 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -36,20 +36,20 @@
         :return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -63,20 +63,20 @@
         :return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -91,16 +91,16 @@
         :return_value = y as{TypeError} asy::FutureOr<core::int>;
         break #L3;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
index fab89fe..9c55b25 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index c8a55a9..372634f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
                                            ^" in let final core::String #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -42,20 +42,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -69,16 +69,16 @@
         :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
index b669441..8311768 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index 9dfa187..c6eedda 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
index 7e22485..d310fa8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index 55eb919..85c2fcd 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
                                            ^" in let final core::String #t2 = "hi" in null));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -42,20 +42,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -69,16 +69,16 @@
         :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
index 7d02922..5b25967 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <dynamic>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index f9e32bb..39403ea 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -39,20 +39,20 @@
         :return_value = <core::int>[3];
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -66,16 +66,16 @@
         :return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
         break #L2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
index 4851f62..a702c69 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -26,16 +26,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::List<self::A>> merged = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
index 17ee2b4..5491836 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -26,16 +26,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<core::List<self::A>>(<asy::Future<core::List<self::A>>>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
         core::List<core::List<self::A>> merged = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
index 91cb8b0..767567e 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
 static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,16 +22,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(self::id<dynamic>(f), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 92c8c6b..96f60cf 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,16 +22,16 @@
         [yield] let dynamic #t1 = asy::_awaitHelper(self::id<asy::FutureOr<core::String>>(f), :async_op_then, :async_op_error, :async_op) in null;
         core::String s = :result;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
index 0747a44..9be5e89 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
@@ -19,7 +19,7 @@
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -41,15 +41,15 @@
         core::List<self::A> list = result;
         list = result2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
index 6fc7a69..bb72272 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -41,15 +41,15 @@
         core::List<self::A> list = result;
         list = result2;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
index 95cdc12..7a13cb2 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
   function f0() → dynamic
     return 42;
   function f1() → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -21,23 +21,23 @@
           :return_value = 42;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f2() → dynamic {
     return 42;
   }
   function f3() → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -51,17 +51,17 @@
           :return_value = 42;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f4() → dynamic /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
index 5e738e7..a090131 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   function f0() → core::int
     return 42;
   function f1() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -21,23 +21,23 @@
           :return_value = 42;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f2() → core::int {
     return 42;
   }
   function f3() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -51,17 +51,17 @@
           :return_value = 42;
           break #L2;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function f4() → core::Iterable<core::int> /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
index f8f99d3..9b911b8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method foo(self::Bar::T t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -51,17 +51,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
@@ -69,7 +69,7 @@
     : super core::Object::•()
     ;
   method foo(self::Baz::S t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -107,17 +107,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
@@ -125,7 +125,7 @@
     return null;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -294,16 +294,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 9b52d11..e515591 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -54,17 +54,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = asy::Stream<dynamic>, S extends self::Baz::E = asy::Stream<dynamic>> extends core::Object {
@@ -72,7 +72,7 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -113,17 +113,17 @@
               }
           }
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
 }
 abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
@@ -131,7 +131,7 @@
     return null;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -312,16 +312,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
index 3af0dce..f151285 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
     return (dynamic x) → dynamic => x;
   }
   function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+    final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
     asy::FutureOr<(core::int) → core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -23,17 +23,17 @@
           :return_value = (dynamic x) → dynamic => x;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index 3710faf..2a29a2c 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     return (core::int x) → core::int => x;
   }
   function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+    final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
     asy::FutureOr<(core::int) → core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -26,17 +26,17 @@
                                    ^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
           break #L1;
         }
-        :completer.{asy::Completer::complete}(:return_value);
+        :async_completer.{asy::Completer::complete}(:return_value);
         return;
       }
       on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
       }
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
     asy::Future::microtask<dynamic>(:async_op);
-    return :completer.{asy::Completer::future};
+    return :async_completer.{asy::Completer::future};
   }
   function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
     dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
index 5ffcce0..129d552 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
   return (dynamic x) → dynamic => x;
 }
 static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+  final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
   asy::FutureOr<(core::int) → core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -22,17 +22,17 @@
         :return_value = (dynamic x) → dynamic => x;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
   dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index 02edb72..cb53a52 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   return (core::int x) → core::int => x;
 }
 static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+  final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
   asy::FutureOr<(core::int) → core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -25,17 +25,17 @@
                                  ^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
         break #L1;
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
   dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
index 4381b61..2b3bdf6 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -67,16 +67,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index a61a3ed..bb9b75a 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -82,16 +82,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
index c6044b0..b82a06f 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
 static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -133,16 +133,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index e8c97af..c633524 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
 static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -139,16 +139,16 @@
             }
         }
       }
-      :completer.{asy::Completer::complete}(:return_value);
+      :async_completer.{asy::Completer::complete}(:return_value);
       return;
     }
     on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
     }
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
   asy::Future::microtask<dynamic>(:async_op);
-  return :completer.{asy::Completer::future};
+  return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
index 8c7b02d..8c3bb35 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  const constructor •() → void
+  field dynamic x;
+  constructor •() → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 5462697..a3c04bd 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -423,13 +423,13 @@
     super.m -= 42;
           ^", "pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
     use(super.m -= 42);
-              ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+              ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments: 0 allowed, 1 given.
     super.m(87);
-          ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+          ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments: 0 allowed, 1 given.
     use(super.m(87));
-              ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+              ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments: 0 allowed, 1 given.
     super.n(87);
-          ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+          ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments: 0 allowed, 1 given.
     use(super.n(87));
               ^"]/* from null */;
 static method use(dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
new file mode 100644
index 0000000..4776f6a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
new file mode 100644
index 0000000..4776f6a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
index f0ee655..5b7edf4 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -12,8 +12,11 @@
 }
 class C extends core::Object {
   field dynamic f;
+  field dynamic B;
   synthetic constructor •() → void
     ;
+  operator >() → dynamic
+    ;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
new file mode 100644
index 0000000..e088ade
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = let final dynamic #t1 = core::Map<dynamic, dynamic> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  var f = Map<A, B> {};
+             ^";
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
new file mode 100644
index 0000000..3e6b682
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic f = let final core::Type #t1 = core::Map<dynamic, dynamic> in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  var f = Map<A, B> {};
+             ^";
+  field dynamic B = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+  var f = Map<A, B> {};
+                  ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+  var f = Map<A, B> {};
+                      ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart b/pkg/front_end/testcases/regress/issue_31171.dart
new file mode 100644
index 0000000..c7ffc48
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {}
+
+typedef T = 
+typedef F = Map<String, dynamic> Function();
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
new file mode 100644
index 0000000..b3a684f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T = 
+          ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart b/pkg/front_end/testcases/regress/issue_31188.dart
new file mode 100644
index 0000000..197dfae
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {}
+
+type T = Map<A, B>
+
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
new file mode 100644
index 0000000..c7b38c9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
new file mode 100644
index 0000000..c7b38c9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
new file mode 100644
index 0000000..c8bd468
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static field invalid-type T;
+static field invalid-type B;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
new file mode 100644
index 0000000..86d47c4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = let final dynamic #t1 = core::Map<dynamic, dynamic> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+type T = Map<A, B>
+            ^";
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+type T = Map<A, B>
+^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+type T = Map<A, B>
+^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+type T = Map<A, B>
+             ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
new file mode 100644
index 0000000..10e28a1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = let final core::Type #t1 = core::Map<dynamic, dynamic> in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+type T = Map<A, B>
+            ^";
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+                 ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+type T = Map<A, B>
+^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+type T = Map<A, B>
+^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+type T = Map<A, B>
+             ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
index be7bde0..1c01a1f 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -17,9 +17,9 @@
   A.foo() : m = 2;
   ^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
   int foo(int a, int b) => a + b * m;
-      ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments to constructor: 0 allowed, 2 given.
+      ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments: 0 allowed, 2 given.
   new A.foo(1, 2);
-      ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments to method: 2 required, 0 given.
+      ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments: 2 required, 0 given.
   new A().foo();
           ^"]/* from null */;
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 3ee0f85..b0858b9 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -198,7 +198,6 @@
 regress/issue_29976: RuntimeError # Issue 29976.
 regress/issue_29982: Fail # Issue 29982.
 regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31155: Crash # Issue 31155.
 regress/issue_31184: TypeCheckError
 regress/issue_31299: TypeCheckError
 
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index 1f6b644..f5230259 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -357,9 +357,9 @@
     super.m -= 42;
           ^", "pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.
     use(super.m -= 42);
-              ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+              ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments: 0 allowed, 1 given.
     super.m(87);
-          ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+          ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments: 0 allowed, 1 given.
     use(super.m(87));
               ^"]/* from null */;
 static method use(dynamic x) → dynamic {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7ff892f..afe96c6 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5011,7 +5011,7 @@
   /// argument of a dynamic invocation of a generic function.
   DartType defaultType;
 
-  TypeParameter([this.name, this.bound]);
+  TypeParameter([this.name, this.bound, this.defaultType]);
 
   // Must match serialized bit positions.
   static const int FlagGenericCovariantImpl = 1 << 0;
@@ -5041,10 +5041,14 @@
 
   visitChildren(Visitor v) {
     bound.accept(v);
+    defaultType?.accept(v);
   }
 
   transformChildren(Transformer v) {
     bound = v.visitDartType(bound);
+    if (defaultType != null) {
+      defaultType = v.visitDartType(defaultType);
+    }
   }
 
   /// Returns a possibly synthesized name for this type parameter, consistent
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 0b8053d..b75a3a3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -48,7 +48,7 @@
   int _byteOffset = 0;
   final List<String> _stringTable = <String>[];
   final List<Uri> _sourceUriTable = <Uri>[];
-  List<Constant> _constantTable;
+  Map<int, Constant> _constantTable = <int, Constant>{};
   List<CanonicalName> _linkTable;
   int _transformerFlags = 0;
   Library _currentLibrary;
@@ -175,9 +175,9 @@
 
   void readConstantTable() {
     final int length = readUInt();
-    _constantTable = new List<Constant>(length);
+    final int startOffset = byteOffset;
     for (int i = 0; i < length; i++) {
-      _constantTable[i] = readConstantTableEntry();
+      _constantTable[byteOffset - startOffset] = readConstantTableEntry();
     }
   }
 
@@ -252,8 +252,8 @@
   }
 
   Constant readConstantReference() {
-    final int index = readUInt();
-    Constant constant = _constantTable[index];
+    final int offset = readUInt();
+    Constant constant = _constantTable[offset];
     assert(constant != null);
     return constant;
   }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 0329a1f..156d80b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -31,6 +31,8 @@
 
   final BufferedSink _mainSink;
   final BufferedSink _metadataSink;
+  final BytesSink _constantsBytesSink;
+  BufferedSink _constantsSink;
   BufferedSink _sink;
 
   List<int> libraryOffsets;
@@ -54,8 +56,10 @@
   BinaryPrinter(Sink<List<int>> sink, {StringIndexer stringIndexer})
       : _mainSink = new BufferedSink(sink),
         _metadataSink = new BufferedSink(new BytesSink()),
+        _constantsBytesSink = new BytesSink(),
         stringIndexer = stringIndexer ?? new StringIndexer() {
-    _constantIndexer = new ConstantIndexer(this.stringIndexer);
+    _constantsSink = new BufferedSink(_constantsBytesSink);
+    _constantIndexer = new ConstantIndexer(this.stringIndexer, this);
     _sink = _mainSink;
   }
 
@@ -94,7 +98,7 @@
   }
 
   int getBufferOffset() {
-    return _sink.flushedLength + _sink.length;
+    return _sink.offset;
   }
 
   void writeStringTable(StringIndexer indexer) {
@@ -137,12 +141,15 @@
     _binaryOffsetForConstantTable = getBufferOffset();
 
     writeUInt30(indexer.entries.length);
-    for (final entry in indexer.entries) {
-      writeConstantTableEntry(entry);
-    }
+    assert(identical(_sink, _mainSink));
+    _constantsSink.flushAndDestroy();
+    writeBytes(_constantsBytesSink.builder.takeBytes());
   }
 
-  void writeConstantTableEntry(Constant constant) {
+  int writeConstantTableEntry(Constant constant) {
+    BufferedSink oldSink = _sink;
+    _sink = _constantsSink;
+    int initialOffset = _sink.offset;
     if (constant is NullConstant) {
       writeByte(ConstantTag.NullConstant);
     } else if (constant is BoolConstant) {
@@ -198,6 +205,8 @@
     } else {
       throw 'Unsupported constant $constant';
     }
+    _sink = oldSink;
+    return _constantsSink.offset - initialOffset;
   }
 
   void writeDartType(DartType type) {
@@ -2011,15 +2020,18 @@
   final StringIndexer stringIndexer;
 
   final List<Constant> entries = <Constant>[];
-  final Map<Constant, int> index = <Constant, int>{};
+  final Map<Constant, int> offsets = <Constant, int>{};
+  int nextOffset = 0;
 
-  ConstantIndexer(this.stringIndexer);
+  final BinaryPrinter _printer;
+
+  ConstantIndexer(this.stringIndexer, this._printer);
 
   int put(Constant constant) {
-    final int oldIndex = index[constant];
-    if (oldIndex != null) return oldIndex;
+    final int oldOffset = offsets[constant];
+    if (oldOffset != null) return oldOffset;
 
-    // Traverse DAG in post-order to ensure children have their id's assigned
+    // Traverse DAG in post-order to ensure children have their offsets assigned
     // before the parent.
     constant.visitChildren(this);
 
@@ -2034,16 +2046,17 @@
       }
     }
 
-    final int newIndex = entries.length;
+    final int newOffset = nextOffset;
     entries.add(constant);
-    return index[constant] = newIndex;
+    nextOffset += _printer.writeConstantTableEntry(constant);
+    return offsets[constant] = newOffset;
   }
 
   defaultConstantReference(Constant node) {
     put(node);
   }
 
-  int operator [](Constant node) => index[node];
+  int operator [](Constant node) => offsets[node];
 }
 
 class TypeParameterIndexer {
@@ -2117,6 +2130,8 @@
   Float64List _doubleBuffer = new Float64List(1);
   Uint8List _doubleBufferUint8;
 
+  int get offset => length + flushedLength;
+
   BufferedSink(this._sink);
 
   void addDouble(double d) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 7cfea5e..d31f70a 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -969,8 +969,8 @@
     if (syncAsync) {
       final completerType = new InterfaceType(
           helper.asyncAwaitCompleterClass, completerTypeArguments);
-      // final Completer<T> :completer = new _AsyncAwaitCompleter<T>();
-      completerVariable = new VariableDeclaration(":completer",
+      // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
+      completerVariable = new VariableDeclaration(":async_completer",
           initializer: new ConstructorInvocation(
               helper.asyncAwaitCompleterConstructor,
               new Arguments([], types: completerTypeArguments))
@@ -980,8 +980,8 @@
     } else {
       final completerType =
           new InterfaceType(helper.completerClass, completerTypeArguments);
-      // final Completer<T> :completer = new Completer<T>.sync();
-      completerVariable = new VariableDeclaration(":completer",
+      // final Completer<T> :async_completer = new Completer<T>.sync();
+      completerVariable = new VariableDeclaration(":async_completer",
           initializer: new StaticInvocation(helper.completerConstructor,
               new Arguments([], types: completerTypeArguments))
             ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
@@ -996,7 +996,7 @@
     setupAsyncContinuations(statements);
 
     if (syncAsync) {
-      // :completer.start(:async_op);
+      // :async_completer.start(:async_op);
       var startStatement = new ExpressionStatement(new MethodInvocation(
           new VariableGet(completerVariable),
           new Name('start'),
@@ -1012,7 +1012,7 @@
         ..fileOffset = enclosingFunction.fileOffset);
       statements.add(newMicrotaskStatement);
     }
-    // return :completer.future;
+    // return :async_completer.future;
     var completerGet = new VariableGet(completerVariable);
     var returnStatement = new ReturnStatement(new PropertyGet(completerGet,
         new Name('future', helper.asyncLibrary), helper.completerFuture));
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index ad6017b..821f9d5 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -229,6 +229,12 @@
   }
   for (int i = 0; i < typeParameters.length; ++i) {
     freshParameters[i].bound = substitute(typeParameters[i].bound, map);
+
+    // [defaultType] is populated using instantiate-to-bound algorithm, so it
+    // shouldn't refer to type parameters from the same declaration.  However,
+    // if a transformation changes [defaultType], it may get such references,
+    // and the line below should invoke [substitute], like for [bound] above.
+    freshParameters[i].defaultType = typeParameters[i].defaultType;
   }
   return new FreshTypeParameters(freshParameters, Substitution.fromMap(map));
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index a6d778d..70fb077 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -63,6 +63,7 @@
 analyzer_cli/test/*: SkipByDesign # Only meant to run on vm
 analyzer_plugin/test/*: SkipByDesign # Only meant to run on vm
 analyzer_plugin/tool/*: SkipByDesign # Only meant to run on vm
+build_integration/test/*: SkipByDesign # Only meant to run on vm, most use dart:mirrors and dart:io
 collection/test/equality_test/01: Fail # Issue 1533
 collection/test/equality_test/02: Fail # Issue 1533
 collection/test/equality_test/03: Fail # Issue 1533
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 0590e39..ba848ff 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -262,7 +262,8 @@
 
   if (compiler == null) {
     port.send(new CompilationResult.errors(
-        ["No incremental compiler available for this isolate."]).toResponse());
+            ["No incremental compiler available for this isolate."], null)
+        .toResponse());
     return;
   }
 
@@ -274,14 +275,15 @@
         expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
 
     if (procedure == null) {
-      port.send(new CompilationResult.errors(["Invalid scope."]).toResponse());
+      port.send(
+          new CompilationResult.errors(["Invalid scope."], null).toResponse());
       return;
     }
 
     if (compiler.errors.isNotEmpty) {
       // TODO(sigmund): the compiler prints errors to the console, so we
       // shouldn't print those messages again here.
-      result = new CompilationResult.errors(compiler.errors);
+      result = new CompilationResult.errors(compiler.errors, null);
     } else {
       result = new CompilationResult.ok(serializeProcedure(procedure));
     }
@@ -387,7 +389,8 @@
     Component component = await compiler.compile(script);
 
     if (compiler.errors.isNotEmpty) {
-      result = new CompilationResult.errors(compiler.errors);
+      result = new CompilationResult.errors(compiler.errors,
+          serializeComponent(component, filter: (lib) => !lib.isExternal));
     } else {
       // We serialize the component excluding vm_platform.dill because the VM has
       // these sources built-in. Everything loaded as a summary in
@@ -415,7 +418,7 @@
       inputFileUri,
       inputFileUri,
       null,
-      new CompilationResult.errors(<String>["unknown tag"]).payload
+      new CompilationResult.errors(<String>["unknown tag"], null).payload
     ]);
   }
 }
@@ -509,7 +512,8 @@
 
   factory CompilationResult.ok(Uint8List bytes) = _CompilationOk;
 
-  factory CompilationResult.errors(List<String> errors) = _CompilationError;
+  factory CompilationResult.errors(List<String> errors, Uint8List bytes) =
+      _CompilationError;
 
   factory CompilationResult.crash(Object exception, StackTrace stack) =
       _CompilationCrash;
@@ -545,9 +549,10 @@
 }
 
 class _CompilationError extends _CompilationFail {
+  final Uint8List bytes;
   final List<String> errors;
 
-  _CompilationError(this.errors);
+  _CompilationError(this.errors, this.bytes);
 
   @override
   Status get status => Status.error;
@@ -556,6 +561,8 @@
   String get errorString => errors.take(10).join('\n');
 
   String toString() => "_CompilationError(${errorString})";
+
+  List toResponse() => [status.index, payload, bytes];
 }
 
 class _CompilationCrash extends _CompilationFail {
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index 0b3cb58..287ed0a 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -63,8 +63,15 @@
   ConstantIndex argDesc;
 }
 
+enum InvocationKind {
+  method, // x.foo(...) or foo(...)
+  getter, // x.foo
+  setter  // x.foo = ...
+}
+
 type ConstantStaticICData extends ConstantPoolEntry {
   Byte tag = 8;
+  Byte invocationKind; // Index in InvocationKind enum.
   CanonicalNameReference target;
   ConstantIndex argDesc;
 }
@@ -468,13 +475,20 @@
   bool operator ==(other) => identical(this, other);
 }
 
+enum InvocationKind { method, getter, setter }
+
 class ConstantStaticICData extends ConstantPoolEntry {
+  final InvocationKind invocationKind;
   final Reference _reference;
   final int argDescConstantIndex;
 
-  ConstantStaticICData(Member member, int argDescConstantIndex)
-      : this.byReference(member.reference, argDescConstantIndex);
-  ConstantStaticICData.byReference(this._reference, this.argDescConstantIndex);
+  ConstantStaticICData(
+      InvocationKind invocationKind, Member member, int argDescConstantIndex)
+      : this.byReference(
+            invocationKind, member.reference, argDescConstantIndex);
+
+  ConstantStaticICData.byReference(
+      this.invocationKind, this._reference, this.argDescConstantIndex);
 
   Member get target => _reference.asMember;
 
@@ -483,17 +497,23 @@
 
   @override
   void writeValueToBinary(BinarySink sink) {
+    sink.writeByte(invocationKind.index);
     sink.writeCanonicalNameReference(getCanonicalNameOfMember(target));
     sink.writeUInt30(argDescConstantIndex);
   }
 
   ConstantStaticICData.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference(),
+      : invocationKind = InvocationKind.values[source.readByte()],
+        _reference = source.readCanonicalNameReference().getReference(),
         argDescConstantIndex = source.readUInt();
 
   @override
   String toString() =>
-      'StaticICData target \'$target\', arg-desc CP#$argDescConstantIndex';
+      'StaticICData ' +
+      (invocationKind == InvocationKind.getter
+          ? 'get '
+          : (invocationKind == InvocationKind.setter ? 'set ' : '')) +
+      'target \'$target\', arg-desc CP#$argDescConstantIndex';
 
   // ConstantStaticICData entries are created per call site and should not be
   // merged, so ConstantStaticICData class uses identity [hashCode] and
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 8d189b7..0bfd866 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -235,10 +235,15 @@
     asm.emitReturnTOS();
   }
 
-  void _genStaticCall(
-      Member target, ConstantArgDesc argDesc, int totalArgCount) {
+  void _genStaticCall(Member target, ConstantArgDesc argDesc, int totalArgCount,
+      {bool isGet: false, bool isSet: false}) {
+    assert(!isGet || !isSet);
     final argDescIndex = cp.add(argDesc);
-    final icdataIndex = cp.add(new ConstantStaticICData(target, argDescIndex));
+    final kind = isGet
+        ? InvocationKind.getter
+        : (isSet ? InvocationKind.setter : InvocationKind.method);
+    final icdataIndex =
+        cp.add(new ConstantStaticICData(kind, target, argDescIndex));
 
     asm.emitPushConstant(icdataIndex);
     asm.emitIndirectStaticCall(totalArgCount, argDescIndex);
@@ -470,7 +475,7 @@
 
   void end(Member node) {
     metadata.mapping[node] =
-        new BytecodeMetadata(asm.bytecode, asm.exceptionsTable, cp, closures);
+        new BytecodeMetadata(cp, asm.bytecode, asm.exceptionsTable, closures);
 
     if (isTraceEnabled) {
       print('Generated bytecode for $node');
@@ -848,7 +853,7 @@
     node.receiver.accept(this);
     final target = node.target;
     if (target is Field || (target is Procedure && target.isGetter)) {
-      _genStaticCall(target, new ConstantArgDesc(1), 1);
+      _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
     } else {
       throw new UnsupportedOperationError(
           'Unsupported DirectPropertyGet with ${target.runtimeType} $target');
@@ -1053,7 +1058,7 @@
           'Unsupported SuperPropertyGet without target');
     }
     if (target is Field || (target is Procedure && target.isGetter)) {
-      _genStaticCall(target, new ConstantArgDesc(1), 1);
+      _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
     } else {
       throw new UnsupportedOperationError(
           'Unsupported SuperPropertyGet with target ${target.runtimeType} $target');
@@ -1113,11 +1118,11 @@
             fieldIndex); // TODO(alexmarkov): do we really need this?
         asm.emitPushStatic(fieldIndex);
       } else {
-        _genStaticCall(target, new ConstantArgDesc(0), 0);
+        _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
       }
     } else if (target is Procedure) {
       if (target.isGetter) {
-        _genStaticCall(target, new ConstantArgDesc(0), 0);
+        _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
       } else {
         final tearOffIndex = cp.add(new ConstantTearOff(target));
         asm.emitPushConstant(tearOffIndex);
@@ -1152,7 +1157,7 @@
       int cpIndex = cp.add(new ConstantField(target));
       asm.emitStoreStaticTOS(cpIndex);
     } else {
-      _genStaticCall(target, new ConstantArgDesc(1), 1);
+      _genStaticCall(target, new ConstantArgDesc(1), 1, isSet: true);
       asm.emitDrop1();
     }
   }
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index c38213d..1c7c2f8 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -9,6 +9,7 @@
 import 'dart:io' hide FileSystemEntity;
 
 import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
 // front_end/src imports below that require lint `ignore_for_file`
 // are a temporary state of things until frontend team builds better api
 // that would replace api used below. This api was made private in
@@ -18,10 +19,7 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystemEntity;
 import 'package:front_end/src/api_prototype/front_end.dart';
-// Use of multi_root_file_system.dart directly from front_end package is a
-// temporarily solution while we are looking for better home for that
-// functionality.
-import 'package:front_end/src/multi_root_file_system.dart';
+import 'package:front_end/src/fasta/kernel/utils.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/binary/limited_ast_to_binary.dart';
@@ -123,7 +121,16 @@
 ${argParser.usage}
 ''';
 
-enum _State { READY_FOR_INSTRUCTION, RECOMPILE_LIST }
+enum _State {
+  READY_FOR_INSTRUCTION,
+  RECOMPILE_LIST,
+  COMPILE_EXPRESSION_EXPRESSION,
+  COMPILE_EXPRESSION_DEFS,
+  COMPILE_EXPRESSION_TYPEDEFS,
+  COMPILE_EXPRESSION_LIBRARY_URI,
+  COMPILE_EXPRESSION_KLASS,
+  COMPILE_EXPRESSION_IS_STATIC
+}
 
 /// Actions that every compiler should implement.
 abstract class CompilerInterface {
@@ -152,6 +159,26 @@
   /// Resets incremental compiler accept/reject status so that next time
   /// recompile is requested, complete kernel file is produced.
   void resetIncrementalCompiler();
+
+  /// Compiles [expression] with free variables listed in [definitions],
+  /// free type variables listed in [typedDefinitions]. "Free" means their
+  /// values are through evaluation API call, rather than coming from running
+  /// application.
+  /// If [klass] is not [null], expression is compiled in context of [klass]
+  /// class.
+  /// If [klass] is [null],expression is compiled at top-level of
+  /// [libraryUrl] library. If [klass] is not [null], [isStatic] determines
+  /// whether expression can refer to [this] or not.
+  Future<Null> compileExpression(
+      String expression,
+      List<String> definitions,
+      List<String> typeDefinitions,
+      String libraryUri,
+      String klass,
+      bool isStatic);
+
+  /// Communicates an error [msg] to the client.
+  void reportError(String msg);
 }
 
 abstract class ProgramTransformer {
@@ -207,7 +234,7 @@
     _kernelBinaryFilenameFull = _options['output-dill'] ?? '$filename.dill';
     _kernelBinaryFilenameIncremental = _options['output-incremental-dill'] ??
         (_options['output-dill'] != null
-            ? '${_options["output-dill"]}.incremental.dill'
+            ? '${_options['output-dill']}.incremental.dill'
             : '$filename.incremental.dill');
     _kernelBinaryFilename = _kernelBinaryFilenameFull;
     _initializeFromDill =
@@ -240,7 +267,7 @@
             break;
           case Severity.errorLegacyWarning:
           case Severity.context:
-            throw "Unexpected severity: $severity";
+            throw 'Unexpected severity: $severity';
         }
         if (printMessage) {
           _outputStream.writeln(message.formatted);
@@ -258,9 +285,9 @@
           options['filesystem-scheme'], rootUris, compilerOptions.fileSystem);
 
       if (_options['output-dill'] == null) {
-        print("When --filesystem-root is specified it is required to specify"
-            " --output-dill option that points to physical file system location"
-            " of a target dill file.");
+        print('When --filesystem-root is specified it is required to specify'
+            ' --output-dill option that points to physical file system location'
+            ' of a target dill file.');
         return false;
       }
     }
@@ -396,7 +423,37 @@
     _outputStream
         .writeln('$boundaryKey $_kernelBinaryFilename ${errors.length}');
     _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
-    return null;
+  }
+
+  @override
+  Future<Null> compileExpression(
+      String expression,
+      List<String> definitions,
+      List<String> typeDefinitions,
+      String libraryUri,
+      String klass,
+      bool isStatic) async {
+    final String boundaryKey = new Uuid().generateV4();
+    _outputStream.writeln('result $boundaryKey');
+    Procedure procedure = await _generator.compileExpression(
+        expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
+    if (procedure != null) {
+      final IOSink sink = new File(_kernelBinaryFilename).openWrite();
+      sink.add(serializeProcedure(procedure));
+      await sink.close();
+      _outputStream.writeln('$boundaryKey $_kernelBinaryFilename');
+      _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
+    } else {
+      _outputStream.writeln(boundaryKey);
+    }
+  }
+
+  @override
+  void reportError(String msg) {
+    final String boundaryKey = new Uuid().generateV4();
+    _outputStream.writeln('result $boundaryKey');
+    _outputStream.writeln(msg);
+    _outputStream.writeln(boundaryKey);
   }
 
   @override
@@ -472,12 +529,24 @@
   await file.close();
 }
 
+class _CompileExpressionRequest {
+  String expression;
+  // Note that FE will reject a compileExpression command by returning a null
+  // procedure when defs or typeDefs include an illegal identifier.
+  List<String> defs = <String>[];
+  List<String> typeDefs = <String>[];
+  String library;
+  String klass;
+  bool isStatic;
+}
+
 /// Listens for the compilation commands on [input] stream.
 /// This supports "interactive" recompilation mode of execution.
 void listenAndCompile(CompilerInterface compiler, Stream<List<int>> input,
     ArgResults options, void quit(),
     {IncrementalCompiler generator}) {
   _State state = _State.READY_FOR_INSTRUCTION;
+  _CompileExpressionRequest compileExpressionRequest;
   String boundaryKey;
   String recompileFilename;
   input
@@ -488,6 +557,8 @@
       case _State.READY_FOR_INSTRUCTION:
         const String COMPILE_INSTRUCTION_SPACE = 'compile ';
         const String RECOMPILE_INSTRUCTION_SPACE = 'recompile ';
+        const String COMPILE_EXPRESSION_INSTRUCTION_SPACE =
+            'compile-expression ';
         if (string.startsWith(COMPILE_INSTRUCTION_SPACE)) {
           final String filename =
               string.substring(COMPILE_INSTRUCTION_SPACE.length);
@@ -505,6 +576,22 @@
             boundaryKey = remainder;
           }
           state = _State.RECOMPILE_LIST;
+        } else if (string.startsWith(COMPILE_EXPRESSION_INSTRUCTION_SPACE)) {
+          // 'compile-expression <boundarykey>
+          // expression
+          // definitions (one per line)
+          // ...
+          // <boundarykey>
+          // type-defintions (one per line)
+          // ...
+          // <boundarykey>
+          // <libraryUri: String>
+          // <klass: String>
+          // <isStatic: true|false>
+          compileExpressionRequest = new _CompileExpressionRequest();
+          boundaryKey =
+              string.substring(COMPILE_EXPRESSION_INSTRUCTION_SPACE.length);
+          state = _State.COMPILE_EXPRESSION_EXPRESSION;
         } else if (string == 'accept') {
           compiler.acceptLastDelta();
         } else if (string == 'reset') {
@@ -520,6 +607,48 @@
         } else
           compiler.invalidate(Uri.base.resolve(string));
         break;
+      case _State.COMPILE_EXPRESSION_EXPRESSION:
+        compileExpressionRequest.expression = string;
+        state = _State.COMPILE_EXPRESSION_DEFS;
+        break;
+      case _State.COMPILE_EXPRESSION_DEFS:
+        if (string == boundaryKey) {
+          state = _State.COMPILE_EXPRESSION_TYPEDEFS;
+        } else {
+          compileExpressionRequest.defs.add(string);
+        }
+        break;
+      case _State.COMPILE_EXPRESSION_TYPEDEFS:
+        if (string == boundaryKey) {
+          state = _State.COMPILE_EXPRESSION_LIBRARY_URI;
+        } else {
+          compileExpressionRequest.typeDefs.add(string);
+        }
+        break;
+      case _State.COMPILE_EXPRESSION_LIBRARY_URI:
+        compileExpressionRequest.library = string;
+        state = _State.COMPILE_EXPRESSION_KLASS;
+        break;
+      case _State.COMPILE_EXPRESSION_KLASS:
+        compileExpressionRequest.klass = string.isEmpty ? null : string;
+        state = _State.COMPILE_EXPRESSION_IS_STATIC;
+        break;
+      case _State.COMPILE_EXPRESSION_IS_STATIC:
+        if (string == 'true' || string == 'false') {
+          compileExpressionRequest.isStatic = string == 'true';
+          compiler.compileExpression(
+              compileExpressionRequest.expression,
+              compileExpressionRequest.defs,
+              compileExpressionRequest.typeDefs,
+              compileExpressionRequest.library,
+              compileExpressionRequest.klass,
+              compileExpressionRequest.isStatic);
+        } else {
+          compiler
+              .reportError('Got $string. Expected either "true" or "false"');
+        }
+        state = _State.READY_FOR_INSTRUCTION;
+        break;
     }
   });
 }
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
index 3d5261f..0ba6b84 100644
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -14,9 +14,9 @@
 /// In kernel binary, bytecode metadata is encoded as following:
 ///
 /// type BytecodeMetadata {
+///   ConstantPool constantPool
 ///   List<Byte> bytecodes
 ///   ExceptionsTable exceptionsTable
-///   ConstantPool constantPool
 ///   List<ClosureBytecode> closures
 /// }
 ///
@@ -33,14 +33,15 @@
 /// pkg/vm/lib/bytecode/constant_pool.dart.
 ///
 class BytecodeMetadata {
+  final ConstantPool constantPool;
   final List<int> bytecodes;
   final ExceptionsTable exceptionsTable;
-  final ConstantPool constantPool;
   final List<ClosureBytecode> closures;
 
   BytecodeMetadata(
-      this.bytecodes, this.exceptionsTable, this.constantPool, this.closures);
+      this.constantPool, this.bytecodes, this.exceptionsTable, this.closures);
 
+  // TODO(alexmarkov): Consider printing constant pool before bytecode.
   @override
   String toString() => "\n"
       "Bytecode {\n"
@@ -96,22 +97,22 @@
 
   @override
   void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
+    metadata.constantPool.writeToBinary(node, sink);
     sink.writeByteList(metadata.bytecodes);
     metadata.exceptionsTable.writeToBinary(sink);
-    metadata.constantPool.writeToBinary(node, sink);
     sink.writeUInt30(metadata.closures.length);
     metadata.closures.forEach((c) => c.writeToBinary(sink));
   }
 
   @override
   BytecodeMetadata readFromBinary(Node node, BinarySource source) {
-    final List<int> bytecodes = source.readByteList();
-    final exceptionsTable = new ExceptionsTable.readFromBinary(source);
     final ConstantPool constantPool =
         new ConstantPool.readFromBinary(node, source);
+    final List<int> bytecodes = source.readByteList();
+    final exceptionsTable = new ExceptionsTable.readFromBinary(source);
     final List<ClosureBytecode> closures = new List<ClosureBytecode>.generate(
         source.readUInt(), (_) => new ClosureBytecode.readFromBinary(source));
     return new BytecodeMetadata(
-        bytecodes, exceptionsTable, constantPool, closures);
+        constantPool, bytecodes, exceptionsTable, closures);
   }
 }
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 66ed423..c6632f8 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -6,6 +6,7 @@
 environment:
   sdk: ">=1.8.0 <2.0.0"
 dependencies:
+  build_integration: 0.0.1
   front_end: 0.1.0-alpha.6
   kernel: 0.3.0-alpha.3
 dev_dependencies:
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index 7ea07d4..ba2cf03 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -470,6 +470,115 @@
       tempDir.delete(recursive: true);
     });
 
+    test('compile expression', () async {
+      var file = new File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("main() {}\n");
+      var dillFile = new File('${tempDir.path}/app.dill');
+      expect(dillFile.existsSync(), equals(false));
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--strong',
+        '--incremental',
+        '--platform=${platformKernel.path}',
+        '--output-dill=${dillFile.path}'
+      ];
+
+      final StreamController<List<int>> streamController =
+          new StreamController<List<int>>();
+      final StreamController<List<int>> stdoutStreamController =
+          new StreamController<List<int>>();
+      final IOSink ioSink = new IOSink(stdoutStreamController.sink);
+      StreamController<String> receivedResults = new StreamController<String>();
+
+      String boundaryKey;
+      stdoutStreamController.stream
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .listen((String s) {
+        const String RESULT_OUTPUT_SPACE = 'result ';
+        if (boundaryKey == null) {
+          if (s.startsWith(RESULT_OUTPUT_SPACE)) {
+            boundaryKey = s.substring(RESULT_OUTPUT_SPACE.length);
+          }
+        } else {
+          if (s.startsWith(boundaryKey)) {
+            receivedResults.add(s.length > boundaryKey.length
+                ? s.substring(boundaryKey.length + 1)
+                : null);
+            boundaryKey = null;
+          }
+        }
+      });
+
+      int exitcode =
+          await starter(args, input: streamController.stream, output: ioSink);
+      expect(exitcode, equals(0));
+      streamController.add('compile ${file.path}\n'.codeUnits);
+      int count = 0;
+      Completer<bool> allDone = new Completer<bool>();
+      receivedResults.stream.listen((String outputFilenameAndErrorCount) {
+        if (count == 0) {
+          // First request is to 'compile', which results in full kernel file.
+          int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
+          expect(delim > 0, equals(true));
+          String outputFilename =
+              outputFilenameAndErrorCount.substring(0, delim);
+          int errorsCount = int
+              .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+
+          expect(dillFile.existsSync(), equals(true));
+          expect(outputFilename, dillFile.path);
+          expect(errorsCount, equals(0));
+          streamController.add('accept\n'.codeUnits);
+
+          // 'compile-expression <boundarykey>
+          // expression
+          // definitions (one per line)
+          // ...
+          // <boundarykey>
+          // type-defintions (one per line)
+          // ...
+          // <boundarykey>
+          // <libraryUri: String>
+          // <klass: String>
+          // <isStatic: true|false>
+          streamController.add(
+              'compile-expression abc\n2+2\nabc\nabc\n${file.uri}\n\n\n'
+                  .codeUnits);
+          count += 1;
+        } else if (count == 1) {
+          // Previous request should have failed because isStatic was blank
+          expect(outputFilenameAndErrorCount, isNull);
+
+          streamController.add(
+              'compile-expression abc\n2+2\nabc\nabc\n${file.uri}\n\nfalse\n'
+                  .codeUnits);
+          count += 1;
+        } else if (count == 2) {
+          // Second request is to 'compile-expression', which results in
+          // kernel file with a function that wraps compiled expression.
+          expect(outputFilenameAndErrorCount, isNotNull);
+          File outputFile = new File(outputFilenameAndErrorCount);
+          expect(outputFile.existsSync(), equals(true));
+          expect(outputFile.lengthSync(), isPositive);
+
+          streamController.add('compile foo.bar\n'.codeUnits);
+          count += 1;
+        } else {
+          expect(count, 3);
+          // Third request is to 'compile' non-existent file, that should fail.
+          int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
+          expect(delim > 0, equals(true));
+          int errorsCount = int
+              .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+          expect(errorsCount, greaterThan(0));
+          allDone.complete(true);
+        }
+      });
+
+      expect(await allDone.future, true);
+    });
+
     test('recompile request keeps incremental output dill filename', () async {
       var file = new File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {}\n");
diff --git a/pkg/vm/testcases/bytecode/boostrapping.dart.expect b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
index ba4d29e..f84988b 100644
--- a/pkg/vm/testcases/bytecode/boostrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
@@ -200,7 +200,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
   [2] = ArgDesc num-args 1, num-type-args 0, names []
   [3] = StaticICData target '#lib::_NamespaceImpl::_getPointer', arg-desc CP#2
   [4] = Null
@@ -259,7 +259,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
   [2] = Null
 }
 ]  static get _namespace() → self::_Namespace
@@ -276,7 +276,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
+  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
   [2] = Null
 }
 ]  static get _namespacePointer() → core::int
@@ -714,7 +714,7 @@
   [9] = ArgDesc num-args 1, num-type-args 0, names []
   [10] = StaticICData target 'dart.core::Uri::parse', arg-desc CP#9
   [11] = ArgDesc num-args 0, num-type-args 0, names []
-  [12] = StaticICData target 'dart.core::Uri::base', arg-desc CP#11
+  [12] = StaticICData get target 'dart.core::Uri::base', arg-desc CP#11
   [13] = Null
   [14] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#9
   [15] = ICData target-name 'resolveUri', arg-desc CP#2
@@ -744,7 +744,7 @@
 ConstantPool {
   [0] = TearOff #lib::_scriptUri
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
+  [2] = StaticICData set target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
   [3] = Null
 }
 ]static method _setupHooks() → dynamic {
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index 07727bf..1d49cf2 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -125,7 +125,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::A::_name', arg-desc CP#0
+  [1] = StaticICData get target '#lib::A::_name', arg-desc CP#0
   [2] = Null
 }
 ]  method toString() → core::String
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 76e73d7..dd01633 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -187,7 +187,7 @@
 }
 
 static bool SnapshotKindAllowedFromKernel() {
-  return IsSnapshottingForPrecompilation() || (snapshot_kind == kCore);
+  return snapshot_kind != kScript;
 }
 
 // clang-format off
@@ -1454,30 +1454,43 @@
   Dart_Handle result = Dart_SetEnvironmentCallback(EnvironmentCallback);
   CHECK_RESULT(result);
 
-  if (IsSnapshottingForPrecompilation()) {
-    // The root library has to be set to generate AOT snapshots.
-    // If the input dill file has a root library, then Dart_LoadScript will
-    // ignore this dummy uri and set the root library to the one reported in
-    // the dill file. Since dill files are not dart script files,
-    // trying to resolve the root library URI based on the dill file name
-    // would not help.
-    //
-    // If the input dill file does not have a root library, then
-    // Dart_LoadScript will error.
-    Dart_Handle library =
-        Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
-    if (Dart_IsError(library)) {
-      Log::PrintErr("Unable to load root library from the input dill file.\n");
-      return kErrorExitCode;
+  switch (snapshot_kind) {
+    case kAppAOTBlobs:
+    case kAppAOTAssembly: {
+      // The root library has to be set to generate AOT snapshots.
+      // If the input dill file has a root library, then Dart_LoadScript will
+      // ignore this dummy uri and set the root library to the one reported in
+      // the dill file. Since dill files are not dart script files,
+      // trying to resolve the root library URI based on the dill file name
+      // would not help.
+      //
+      // If the input dill file does not have a root library, then
+      // Dart_LoadScript will error.
+      Dart_Handle library =
+          Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
+      if (Dart_IsError(library)) {
+        Log::PrintErr(
+            "Unable to load root library from the input dill file.\n");
+        return kErrorExitCode;
+      }
+
+      CreateAndWritePrecompiledSnapshot(entry_points);
+
+      CreateAndWriteDependenciesFile();
+
+      CleanupEntryPointsCollection(entry_points);
+
+      break;
     }
-
-    CreateAndWritePrecompiledSnapshot(entry_points);
-
-    CreateAndWriteDependenciesFile();
-
-    CleanupEntryPointsCollection(entry_points);
-  } else {
-    CreateAndWriteCoreSnapshot();
+    case kCore:
+      CreateAndWriteCoreSnapshot();
+      break;
+    case kCoreJIT:
+      LoadCompilationTrace();
+      CreateAndWriteCoreJITSnapshot();
+      break;
+    default:
+      UNREACHABLE();
   }
 
   Dart_ExitScope();
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index c7bdf82..5fb89b4 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -315,7 +315,7 @@
     }
   }
 
-  static Element _createCollectionLine() => new DivElement()
+  static HtmlElement _createCollectionLine() => new DivElement()
     ..classes = ['collection-item']
     ..children = [
       new SpanElement()
diff --git a/runtime/observatory/lib/src/elements/class_tree.dart b/runtime/observatory/lib/src/elements/class_tree.dart
index a187f24..2a74a06 100644
--- a/runtime/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/observatory/lib/src/elements/class_tree.dart
@@ -143,7 +143,7 @@
           });
   }
 
-  static Element _create(toggle) {
+  static HtmlElement _create(toggle) {
     return new DivElement()
       ..classes = ['class-tree-item']
       ..children = [
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index bedcfdb..59296ec 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -326,7 +326,7 @@
     return report;
   }
 
-  static Element _createDominator(toggle) {
+  static HtmlElement _createDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -344,7 +344,7 @@
       ];
   }
 
-  static Element _createMergedDominator(toggle) {
+  static HtmlElement _createMergedDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -362,7 +362,7 @@
       ];
   }
 
-  static Element _createGroup(toggle) {
+  static HtmlElement _createGroup(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -380,7 +380,7 @@
       ];
   }
 
-  static Element _createOwnershipClass(toggle) {
+  static HtmlElement _createOwnershipClass(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -397,7 +397,7 @@
   static const int kMaxChildren = 100;
   static const int kMinRetainedSize = 4096;
 
-  static _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
+  static Iterable _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
     final list = node.children.toList();
     list.sort((a, b) => b.retainedSize - a.retainedSize);
     return list
@@ -405,7 +405,8 @@
         .take(kMaxChildren);
   }
 
-  static _getChildrenMergedDominator(M.HeapSnapshotMergedDominatorNode node) {
+  static Iterable _getChildrenMergedDominator(
+      M.HeapSnapshotMergedDominatorNode node) {
     final list = node.children.toList();
     list.sort((a, b) => b.retainedSize - a.retainedSize);
     return list
@@ -413,7 +414,7 @@
         .take(kMaxChildren);
   }
 
-  static _getChildrenGroup(item) {
+  static Iterable _getChildrenGroup(item) {
     if (item is M.HeapSnapshotClassReferences) {
       if (item.inbounds.isNotEmpty || item.outbounds.isNotEmpty) {
         return [item.inbounds, item.outbounds];
@@ -424,7 +425,7 @@
     return const [];
   }
 
-  static _getChildrenOwnershipClass(item) {
+  static Iterable _getChildrenOwnershipClass(item) {
     return const [];
   }
 
diff --git a/runtime/observatory/lib/src/elements/instance_ref.dart b/runtime/observatory/lib/src/elements/instance_ref.dart
index 45737fa..748acbe 100644
--- a/runtime/observatory/lib/src/elements/instance_ref.dart
+++ b/runtime/observatory/lib/src/elements/instance_ref.dart
@@ -272,7 +272,7 @@
       case M.InstanceKind.list:
         var index = 0;
         return _loadedInstance.elements
-            .map((element) => new DivElement()
+            .map<Element>((element) => new DivElement()
               ..children = [
                 new SpanElement()..text = '[ ${index++} ] : ',
                 anyRef(_isolate, element, _objects, queue: _r.queue)
@@ -281,7 +281,7 @@
               ..addAll(_createShowMoreButton());
       case M.InstanceKind.map:
         return _loadedInstance.associations
-            .map((association) => new DivElement()
+            .map<Element>((association) => new DivElement()
               ..children = [
                 new SpanElement()..text = '[ ',
                 anyRef(_isolate, association.key, _objects, queue: _r.queue),
@@ -306,7 +306,7 @@
       case M.InstanceKind.float64x2List:
         var index = 0;
         return _loadedInstance.typedElements
-            .map((e) => new DivElement()..text = '[ ${index++} ] : $e')
+            .map<Element>((e) => new DivElement()..text = '[ ${index++} ] : $e')
             .toList()
               ..addAll(_createShowMoreButton());
       case M.InstanceKind.mirrorReference:
diff --git a/runtime/observatory/lib/src/elements/memory/snapshot.dart b/runtime/observatory/lib/src/elements/memory/snapshot.dart
index 67be83a..fd91ebc 100644
--- a/runtime/observatory/lib/src/elements/memory/snapshot.dart
+++ b/runtime/observatory/lib/src/elements/memory/snapshot.dart
@@ -165,7 +165,7 @@
     ];
   }
 
-  static Element _createDominator(toggle) {
+  static HtmlElement _createDominator(toggle) {
     return new DivElement()
       ..classes = ['tree-item']
       ..children = [
@@ -186,7 +186,7 @@
   static const int kMaxChildren = 100;
   static const int kMinRetainedSize = 4096;
 
-  static _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
+  static Iterable _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
     final list = node.children.toList();
     list.sort((a, b) => b.retainedSize - a.retainedSize);
     return list
diff --git a/runtime/observatory/lib/src/models/repositories/notification.dart b/runtime/observatory/lib/src/models/repositories/notification.dart
index 816bf04..c9c7824 100644
--- a/runtime/observatory/lib/src/models/repositories/notification.dart
+++ b/runtime/observatory/lib/src/models/repositories/notification.dart
@@ -11,6 +11,6 @@
 abstract class NotificationRepository {
   Stream<NotificationChangeEvent> get onChange;
   Iterable<Notification> list();
-  void delete(Notification);
+  void delete(Notification notification);
   void deleteAll();
 }
diff --git a/runtime/observatory/lib/src/models/repositories/target.dart b/runtime/observatory/lib/src/models/repositories/target.dart
index eb364e9..2c2db92 100644
--- a/runtime/observatory/lib/src/models/repositories/target.dart
+++ b/runtime/observatory/lib/src/models/repositories/target.dart
@@ -13,9 +13,9 @@
 
   Target get current;
   Iterable<Target> list();
-  void add(String);
-  void setCurrent(Target);
-  void delete(Target);
+  void add(String address);
+  void setCurrent(Target t);
+  void delete(Target o);
   Target find(String networkAddress);
   bool isConnectedVMTarget(Target target);
 }
diff --git a/runtime/observatory/lib/src/repositories/flag.dart b/runtime/observatory/lib/src/repositories/flag.dart
index b1b5349..0a080d2 100644
--- a/runtime/observatory/lib/src/repositories/flag.dart
+++ b/runtime/observatory/lib/src/repositories/flag.dart
@@ -26,7 +26,7 @@
     return flags.map(_toFlag);
   }
 
-  static _toFlag(Map map) {
+  static Flag _toFlag(Map map) {
     return new Flag(
         map['name'], map['comment'], map['modified'], map['valueAsString']);
   }
diff --git a/runtime/observatory/lib/src/repositories/target.dart b/runtime/observatory/lib/src/repositories/target.dart
index 0b5dc15..35d0dde 100644
--- a/runtime/observatory/lib/src/repositories/target.dart
+++ b/runtime/observatory/lib/src/repositories/target.dart
@@ -4,7 +4,7 @@
 
 part of repositories;
 
-typedef bool IsConnectedVMTargetDelegate(Target);
+typedef bool IsConnectedVMTargetDelegate(M.Target target);
 
 class TargetChangeEvent implements M.TargetChangeEvent {
   final TargetRepository repository;
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 1fa79a6..26ff6ab 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -460,6 +460,7 @@
   int get tokenPos;
   Future<int> getLine();
   Future<int> getColumn();
+  Future<String> toUserString();
 }
 
 /// A [SourceLocation] represents a location or range in the source code.
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 59485c1..3fb4084 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -13,7 +13,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(7));
+    expect(result['minor'], equals(8));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory/tests/service/kill_paused_test.dart b/runtime/observatory/tests/service/kill_paused_test.dart
new file mode 100644
index 0000000..c0f5c91
--- /dev/null
+++ b/runtime/observatory/tests/service/kill_paused_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_common.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+import 'dart:developer';
+import 'service_test_common.dart';
+
+testMain() async {
+  debugger(); // Stop here.
+  print('1');
+  while (true) {}
+}
+
+var tests = <IsolateTest>[
+  // Stopped at 'debugger' statement.
+  hasStoppedAtBreakpoint,
+  // Kill the app
+  (Isolate isolate) async {
+    Map<String, dynamic> params = <String, dynamic>{};
+    ServiceObject result = await isolate.invokeRpc('kill', params);
+    expect(result.type, equals('Success'));
+  }
+];
+
+main(args) async => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/kill_running_test.dart b/runtime/observatory/tests/service/kill_running_test.dart
new file mode 100644
index 0000000..15e8b9c
--- /dev/null
+++ b/runtime/observatory/tests/service/kill_running_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_common.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+testMain() async {
+  print('1');
+  while (true) {}
+}
+
+var tests = <IsolateTest>[
+  // Stopped at 'debugger' statement.
+  isolateIsRunning,
+  // Kill the app
+  (Isolate isolate) async {
+    Map<String, dynamic> params = <String, dynamic>{};
+    ServiceObject result = await isolate.invokeRpc('kill', params);
+    expect(result.type, equals('Success'));
+  }
+];
+
+main(args) async => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 8003fb4..d93a63c 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -15,7 +15,6 @@
 evaluate_activation_test/instance: RuntimeError
 evaluate_activation_test/scope: RuntimeError
 evaluate_in_sync_star_activation_test: RuntimeError
-pause_on_unhandled_async_exceptions_test: RuntimeError #  --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
 step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
 unused_changes_in_last_reload_test: RuntimeError
 
@@ -31,7 +30,6 @@
 
 [ $arch == simdbc64 && $compiler == dartk ]
 get_cpu_profile_timeline_rpc_test: Pass, RuntimeError # http://dartbug.com/31794
-pause_on_unhandled_async_exceptions_test: RuntimeError, Timeout # Issue 31765
 
 [ $arch == simdbc64 && $compiler == dartk && $mode == debug ]
 eval_test: Pass, Slow
@@ -108,7 +106,7 @@
 
 [ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
 add_breakpoint_rpc_kernel_test: RuntimeError # Issue #33087
-async_generator_breakpoint_test: Pass, RuntimeError
+async_generator_breakpoint_test: Pass, RuntimeError, Crash # dartbug.com/33175 for the crash
 bad_reload_test: Skip # Times out on sim architectures, also RuntimeError.
 break_on_activation_test: RuntimeError # Issue #33087
 complex_reload_test: Skip # Times out on sim architectures, also RuntimeError.
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d07500e..2cf1c6e 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -185,10 +185,6 @@
 [ $compiler == dartk && $runtime == vm && $system == macos ]
 cc/IsolateReload_LibraryLookup: Fail, Crash
 
-[ $compiler == dartk && $runtime == vm && $strong ]
-cc/IsolateReload_LibraryHide: Crash
-cc/IsolateReload_LibraryShow: Crash
-
 [ $compiler == dartk && $system == linux ]
 cc/IsolateReload_LibraryLookup: Fail, Crash
 
@@ -204,8 +200,6 @@
 [ $compiler == dartk && $strong ]
 cc/DartGeneratedArrayLiteralMessages: Crash # Issue 32190
 cc/FullSnapshot1: Crash # Issue 32190
-cc/IsolateReload_LibraryImportAdded: Crash # Issue 32190
-cc/IsolateReload_LibraryImportRemoved: Fail # Issue 32190
 cc/IsolateReload_LibraryLookup: Fail, Crash # Issue 32190
 cc/MismatchedSnapshotKinds: Fail, Crash, OK # Script snapshots not supported in Dart 2
 cc/ScriptSnapshot1: Fail, Crash, OK # Script snapshots not supported in Dart 2
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 66f0543..39858e9 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -386,6 +386,11 @@
   UNREACHABLE();
 }
 
+void ConstantPropagator::VisitMakeTemp(MakeTempInstr* instr) {
+  // Instruction is eliminated when translating to SSA.
+  UNREACHABLE();
+}
+
 void ConstantPropagator::VisitStoreLocal(StoreLocalInstr* instr) {
   // Instruction is eliminated when translating to SSA.
   UNREACHABLE();
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 4aedb3c..c4740e2 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1167,8 +1167,8 @@
     // 2a. Handle uses:
     // Update the expression stack renaming environment for each use by
     // removing the renamed value.
-    // For each use of a LoadLocal, StoreLocal, DropTemps or Constant: Replace
-    // it with the renamed value.
+    // For each use of a LoadLocal, StoreLocal, MakeTemp, DropTemps or Constant:
+    // replace it with the renamed value.
     for (intptr_t i = current->InputCount() - 1; i >= 0; --i) {
       Value* v = current->InputAt(i);
       // Update expression stack.
@@ -1177,8 +1177,10 @@
       Definition* reaching_defn = env->RemoveLast();
       Definition* input_defn = v->definition();
       if (input_defn != reaching_defn) {
+        // Note: constants can only be replaced with other constants.
         ASSERT(input_defn->IsLoadLocal() || input_defn->IsStoreLocal() ||
-               input_defn->IsDropTemps() || input_defn->IsConstant());
+               input_defn->IsDropTemps() || input_defn->IsMakeTemp() ||
+               (input_defn->IsConstant() && reaching_defn->IsConstant()));
         // Assert we are not referencing nulls in the initial environment.
         ASSERT(reaching_defn->ssa_temp_index() != -1);
         v->set_definition(reaching_defn);
@@ -1192,103 +1194,120 @@
       env->RemoveLast();
     }
 
-    // 2b. Handle LoadLocal, StoreLocal, DropTemps and Constant.
-    Definition* definition = current->AsDefinition();
-    if (definition != NULL) {
-      LoadLocalInstr* load = definition->AsLoadLocal();
-      StoreLocalInstr* store = definition->AsStoreLocal();
-      DropTempsInstr* drop = definition->AsDropTemps();
-      ConstantInstr* constant = definition->AsConstant();
-      if ((load != NULL) || (store != NULL) || (drop != NULL) ||
-          (constant != NULL)) {
-        Definition* result = NULL;
-        if (store != NULL) {
-          // Update renaming environment.
-          intptr_t index = store->local().BitIndexIn(num_direct_parameters_);
-          result = store->value()->definition();
+    // 2b. Handle LoadLocal/StoreLocal/MakeTemp/DropTemps/Constant and
+    // PushArgument specially. Other definitions are just pushed
+    // to the environment directly.
+    Definition* result = NULL;
+    switch (current->tag()) {
+      case Instruction::kLoadLocal: {
+        LoadLocalInstr* load = current->Cast<LoadLocalInstr>();
+        // The graph construction ensures we do not have an unused LoadLocal
+        // computation.
+        ASSERT(load->HasTemp());
+        const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
+        result = (*env)[index];
 
-          if (!FLAG_prune_dead_locals ||
-              variable_liveness->IsStoreAlive(block_entry, store)) {
-            (*env)[index] = result;
-          } else {
-            (*env)[index] = constant_dead();
-          }
-        } else if (load != NULL) {
-          // The graph construction ensures we do not have an unused LoadLocal
-          // computation.
-          ASSERT(definition->HasTemp());
-          intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
-          result = (*env)[index];
+        PhiInstr* phi = result->AsPhi();
+        if ((phi != NULL) && !phi->is_alive()) {
+          phi->mark_alive();
+          live_phis->Add(phi);
+        }
 
-          PhiInstr* phi = result->AsPhi();
-          if ((phi != NULL) && !phi->is_alive()) {
-            phi->mark_alive();
-            live_phis->Add(phi);
-          }
+        if (FLAG_prune_dead_locals &&
+            variable_liveness->IsLastLoad(block_entry, load)) {
+          (*env)[index] = constant_dead();
+        }
 
-          if (FLAG_prune_dead_locals &&
-              variable_liveness->IsLastLoad(block_entry, load)) {
-            (*env)[index] = constant_dead();
-          }
+        // Record captured parameters so that they can be skipped when
+        // emitting sync code inside optimized try-blocks.
+        if (load->local().is_captured_parameter()) {
+          captured_parameters_->Add(index);
+        }
 
-          // Record captured parameters so that they can be skipped when
-          // emitting sync code inside optimized try-blocks.
-          if (load->local().is_captured_parameter()) {
-            intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
-            captured_parameters_->Add(index);
-          }
-
-          if ((phi != NULL) && isolate()->strong() &&
-              FLAG_use_strong_mode_types) {
-            // Assign type to Phi if it doesn't have a type yet.
-            // For a Phi to appear in the local variable it either was placed
-            // there as incoming value by renaming or it was stored there by
-            // StoreLocal which took this Phi from another local via LoadLocal,
-            // to which this reasoning applies recursively.
-            // This means that we are guaranteed to process LoadLocal for a
-            // matching variable first.
-            if (!phi->HasType()) {
-              ASSERT((index < phi->block()->phis()->length()) &&
-                     ((*phi->block()->phis())[index] == phi));
-              phi->UpdateType(
-                  CompileType::FromAbstractType(load->local().type()));
-            }
-          }
-        } else if (drop != NULL) {
-          // Drop temps from the environment.
-          for (intptr_t j = 0; j < drop->num_temps(); j++) {
-            env->RemoveLast();
-          }
-          if (drop->value() != NULL) {
-            result = drop->value()->definition();
-          }
-          ASSERT((drop->value() != NULL) || !drop->HasTemp());
-        } else {
-          if (definition->HasTemp()) {
-            result = GetConstant(constant->value());
+        if ((phi != NULL) && isolate()->strong() &&
+            FLAG_use_strong_mode_types) {
+          // Assign type to Phi if it doesn't have a type yet.
+          // For a Phi to appear in the local variable it either was placed
+          // there as incoming value by renaming or it was stored there by
+          // StoreLocal which took this Phi from another local via LoadLocal,
+          // to which this reasoning applies recursively.
+          // This means that we are guaranteed to process LoadLocal for a
+          // matching variable first.
+          if (!phi->HasType()) {
+            ASSERT((index < phi->block()->phis()->length()) &&
+                   ((*phi->block()->phis())[index] == phi));
+            phi->UpdateType(
+                CompileType::FromAbstractType(load->local().type()));
           }
         }
-        // Update expression stack or remove from graph.
-        if (definition->HasTemp()) {
-          ASSERT(result != NULL);
-          env->Add(result);
-        }
-        it.RemoveCurrentFromGraph();
-      } else {
-        // Not a load, store, drop or constant.
-        if (definition->HasTemp()) {
-          // Assign fresh SSA temporary and update expression stack.
-          AllocateSSAIndexes(definition);
-          env->Add(definition);
-        }
+        break;
       }
+
+      case Instruction::kStoreLocal: {
+        StoreLocalInstr* store = current->Cast<StoreLocalInstr>();
+        const intptr_t index =
+            store->local().BitIndexIn(num_direct_parameters_);
+        result = store->value()->definition();
+
+        if (!FLAG_prune_dead_locals ||
+            variable_liveness->IsStoreAlive(block_entry, store)) {
+          (*env)[index] = result;
+        } else {
+          (*env)[index] = constant_dead();
+        }
+        break;
+      }
+
+      case Instruction::kDropTemps: {
+        // Drop temps from the environment.
+        DropTempsInstr* drop = current->Cast<DropTempsInstr>();
+        for (intptr_t j = 0; j < drop->num_temps(); j++) {
+          env->RemoveLast();
+        }
+        if (drop->value() != NULL) {
+          result = drop->value()->definition();
+        }
+        ASSERT((drop->value() != NULL) || !drop->HasTemp());
+        break;
+      }
+
+      case Instruction::kConstant: {
+        ConstantInstr* constant = current->Cast<ConstantInstr>();
+        if (constant->HasTemp()) {
+          result = GetConstant(constant->value());
+        }
+        break;
+      }
+
+      case Instruction::kMakeTemp: {
+        // Simply push a #null value to the expression stack.
+        result = constant_null_;
+        break;
+      }
+
+      case Instruction::kPushArgument:
+        env->Add(current->Cast<PushArgumentInstr>());
+        continue;
+
+      default:
+        // Other definitions directly go into the environment.
+        if (Definition* definition = current->AsDefinition()) {
+          if (definition->HasTemp()) {
+            // Assign fresh SSA temporary and update expression stack.
+            AllocateSSAIndexes(definition);
+            env->Add(definition);
+          }
+        }
+        continue;
     }
 
-    // 2c. Handle pushed argument.
-    PushArgumentInstr* push = current->AsPushArgument();
-    if (push != NULL) {
-      env->Add(push);
+    // Update expression stack and remove current instruction from the graph.
+    Definition* definition = current->Cast<Definition>();
+    if (definition->HasTemp()) {
+      ASSERT(result != NULL);
+      env->Add(result);
     }
+    it.RemoveCurrentFromGraph();
   }
 
   // 3. Process dominated blocks.
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 247a75b..ce25835a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3377,8 +3377,21 @@
   UNREACHABLE();
 }
 
+LocationSummary* MakeTempInstr::MakeLocationSummary(Zone* zone,
+                                                    bool optimizing) const {
+  ASSERT(!optimizing);
+  null_->InitializeLocationSummary(zone, optimizing);
+  return null_->locs();
+}
+
+void MakeTempInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(!compiler->is_optimizing());
+  null_->EmitNativeCode(compiler);
+}
+
 LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone,
                                                      bool optimizing) const {
+  ASSERT(!optimizing);
   return (InputCount() == 1)
              ? LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
                                      LocationSummary::kNoCall)
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 875f806..4806355 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -488,6 +488,7 @@
   M(StaticCall)                                                                \
   M(LoadLocal)                                                                 \
   M(DropTemps)                                                                 \
+  M(MakeTemp)                                                                  \
   M(StoreLocal)                                                                \
   M(StrictCompare)                                                             \
   M(EqualityCompare)                                                           \
@@ -873,6 +874,11 @@
 #undef INSTRUCTION_TYPE_CHECK
 #undef DECLARE_INSTRUCTION_TYPE_CHECK
 
+  template <typename T>
+  T* Cast() {
+    return static_cast<T*>(this);
+  }
+
   // Returns structure describing location constraints required
   // to emit native code for this instruction.
   LocationSummary* locs() {
@@ -3898,6 +3904,51 @@
   DISALLOW_COPY_AND_ASSIGN(DropTempsInstr);
 };
 
+// This instruction is used to reserve a space on the expression stack
+// that later would be filled with StoreLocal. Reserved space would be
+// filled with a null value initially.
+//
+// Note: One must not use Constant(#null) to reserve expression stack space
+// because it would lead to an incorrectly compiled unoptimized code. Graph
+// builder would set Constant(#null) as an input definition to the instruction
+// that consumes this value from the expression stack - not knowing that
+// this value represents a placeholder - which might lead issues if instruction
+// has specialization for constant inputs (see https://dartbug.com/33195).
+class MakeTempInstr : public TemplateDefinition<0, NoThrow, Pure> {
+ public:
+  explicit MakeTempInstr(Zone* zone)
+      : null_(new (zone) ConstantInstr(Object::ZoneHandle())) {
+    // Note: We put ConstantInstr inside MakeTemp to simplify code generation:
+    // having ConstantInstr allows us to use Location::Contant(null_) as an
+    // output location for this instruction.
+  }
+
+  DECLARE_INSTRUCTION(MakeTemp)
+
+  virtual CompileType ComputeType() const { return CompileType::Dynamic(); }
+
+  virtual bool ComputeCanDeoptimize() const { return false; }
+
+  virtual bool HasUnknownSideEffects() const {
+    UNREACHABLE();  // Eliminated by SSA construction.
+    return false;
+  }
+
+  virtual bool MayThrow() const {
+    UNREACHABLE();
+    return false;
+  }
+
+  virtual TokenPosition token_pos() const { return TokenPosition::kTempMove; }
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+  ConstantInstr* null_;
+
+  DISALLOW_COPY_AND_ASSIGN(MakeTempInstr);
+};
+
 class StoreLocalInstr : public TemplateDefinition<1, NoThrow> {
  public:
   StoreLocalInstr(const LocalVariable& local,
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index e9815df..c77e7d6 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -447,6 +447,8 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
+void MakeTempInstr::PrintOperandsTo(BufferFormatter* f) const {}
+
 void DropTempsInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%" Pd "", num_temps());
   if (value() != NULL) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index b943afa..58bc7fa 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -914,8 +914,7 @@
 }
 
 #if defined(DART_USE_INTERPRETER)
-void BytecodeMetadataHelper::CopyBytecode(const Function& function) {
-  // TODO(regis): Avoid copying bytecode from mapped kernel binary.
+void BytecodeMetadataHelper::ReadMetadata(const Function& function) {
   const intptr_t node_offset = function.kernel_offset();
   const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
   if (md_offset < 0) {
@@ -925,14 +924,51 @@
   AlternativeReadingScope alt(&builder_->reader_, &H.metadata_payloads(),
                               md_offset);
 
-  // Read bytecode.
-  intptr_t bytecode_size = builder_->reader_.ReadUInt();
-  intptr_t bytecode_offset = builder_->reader_.offset();
-  uint8_t* bytecode_data = builder_->reader_.CopyDataIntoZone(
-      builder_->zone_, bytecode_offset, bytecode_size);
+  // Create object pool and read pool entries.
+  const intptr_t obj_count = builder_->reader_.ReadListLength();
+  const ObjectPool& pool =
+      ObjectPool::Handle(builder_->zone_, ObjectPool::New(obj_count));
+  ReadPoolEntries(function, function, pool, 0);
 
-  // This enum and the code below reading the constant pool from kernel must be
-  // kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
+  // Read bytecode and attach to function.
+  const Code& bytecode = Code::Handle(builder_->zone_, ReadBytecode(pool));
+  function.AttachBytecode(bytecode);
+
+  // Read exceptions table.
+  ReadExceptionsTable(bytecode);
+
+  if (FLAG_dump_kernel_bytecode) {
+    KernelBytecodeDisassembler::Disassemble(function);
+  }
+
+  // Read closures.
+  Function& closure = Function::Handle(builder_->zone_);
+  Code& closure_bytecode = Code::Handle(builder_->zone_);
+  intptr_t num_closures = builder_->ReadListLength();
+  for (intptr_t i = 0; i < num_closures; i++) {
+    intptr_t closure_index = builder_->ReadUInt();
+    ASSERT(closure_index < obj_count);
+    closure ^= pool.ObjectAt(closure_index);
+
+    // Read closure bytecode and attach to closure function.
+    closure_bytecode = ReadBytecode(pool);
+    closure.AttachBytecode(closure_bytecode);
+
+    // Read closure exceptions table.
+    ReadExceptionsTable(closure_bytecode);
+
+    if (FLAG_dump_kernel_bytecode) {
+      KernelBytecodeDisassembler::Disassemble(closure);
+    }
+  }
+}
+
+intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function,
+                                                 const Function& inner_function,
+                                                 const ObjectPool& pool,
+                                                 intptr_t from_index) {
+  // These enums and the code below reading the constant pool from kernel must
+  // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
   enum ConstantPoolTag {
     kInvalid,
     kNull,
@@ -954,19 +990,25 @@
     kInstance,
     kSymbol,
     kTypeArgumentsForInstanceAllocation,
+    kContextOffset,
+    kClosureFunction,
+    kEndClosureFunctionScope,
   };
 
-  // Read object pool.
-  builder_->reader_.set_offset(bytecode_offset + bytecode_size);
-  intptr_t obj_count = builder_->reader_.ReadListLength();
-  const ObjectPool& obj_pool =
-      ObjectPool::Handle(builder_->zone_, ObjectPool::New(obj_count));
+  enum InvocationKind {
+    method,  // x.foo(...) or foo(...)
+    getter,  // x.foo
+    setter   // x.foo = ...
+  };
+
   Object& obj = Object::Handle(builder_->zone_);
   Object& elem = Object::Handle(builder_->zone_);
   Array& array = Array::Handle(builder_->zone_);
   Field& field = Field::Handle(builder_->zone_);
+  Class& cls = Class::Handle(builder_->zone_);
   String& name = String::Handle(builder_->zone_);
-  for (intptr_t i = 0; i < obj_count; ++i) {
+  const intptr_t obj_count = pool.Length();
+  for (intptr_t i = from_index; i < obj_count; ++i) {
     const intptr_t tag = builder_->ReadTag();
     switch (tag) {
       case ConstantPoolTag::kInvalid:
@@ -1018,7 +1060,7 @@
         name = H.DartSymbolPlain(target).raw();
         intptr_t arg_desc_index = builder_->ReadUInt();
         ASSERT(arg_desc_index < i);
-        array ^= obj_pool.ObjectAt(arg_desc_index);
+        array ^= pool.ObjectAt(arg_desc_index);
         // TODO(regis): Should num_args_tested be explicitly provided?
         obj = ICData::New(function, name,
                           array,  // Arguments descriptor.
@@ -1029,18 +1071,34 @@
 #endif
       } break;
       case ConstantPoolTag::kStaticICData: {
+        InvocationKind kind = static_cast<InvocationKind>(builder_->ReadByte());
         NameIndex target = builder_->ReadCanonicalNameReference();
         if (H.IsConstructor(target)) {
           name = H.DartConstructorName(target).raw();
           elem = H.LookupConstructorByKernelConstructor(target);
+        } else if (H.IsField(target)) {
+          if (kind == InvocationKind::getter) {
+            name = H.DartGetterName(target).raw();
+          } else if (kind == InvocationKind::setter) {
+            name = H.DartSetterName(target).raw();
+          } else {
+            ASSERT(kind == InvocationKind::method);
+            UNIMPLEMENTED();  // TODO(regis): Revisit.
+          }
+          field = H.LookupFieldByKernelField(target);
+          cls = field.Owner();
+          elem = cls.LookupStaticFunction(name);
         } else {
+          if ((kind == InvocationKind::method) && H.IsGetter(target)) {
+            UNIMPLEMENTED();  // TODO(regis): Revisit.
+          }
           name = H.DartProcedureName(target).raw();
           elem = H.LookupStaticMethodByKernelProcedure(target);
         }
         ASSERT(elem.IsFunction());
         intptr_t arg_desc_index = builder_->ReadUInt();
         ASSERT(arg_desc_index < i);
-        array ^= obj_pool.ObjectAt(arg_desc_index);
+        array ^= pool.ObjectAt(arg_desc_index);
         obj = ICData::New(function, name,
                           array,  // Arguments descriptor.
                           Thread::kNoDeoptId, 0 /* num_args_tested */,
@@ -1067,11 +1125,9 @@
         ASSERT(obj.IsClass());
         break;
       case ConstantPoolTag::kTypeArgumentsFieldOffset:
-        obj =
+        cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
-        obj = Smi::New(Class::Cast(obj).type_arguments_field_offset() /
-                       kWordSize);
+        obj = Smi::New(cls.type_arguments_field_offset() / kWordSize);
         break;
       case ConstantPoolTag::kTearOff:
         obj = H.LookupStaticMethodByKernelProcedure(
@@ -1101,20 +1157,19 @@
         for (intptr_t j = 0; j < length; j++) {
           intptr_t elem_index = builder_->ReadUInt();
           ASSERT(elem_index < i);
-          elem = obj_pool.ObjectAt(elem_index);
+          elem = pool.ObjectAt(elem_index);
           array.SetAt(j, elem);
         }
         obj = H.Canonicalize(Array::Cast(obj));
         ASSERT(!obj.IsNull());
       } break;
       case ConstantPoolTag::kInstance: {
-        obj =
+        cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
-        obj = Instance::New(Class::Cast(obj), Heap::kOld);
+        obj = Instance::New(cls, Heap::kOld);
         intptr_t elem_index = builder_->ReadUInt();
         ASSERT(elem_index < i);
-        elem = obj_pool.ObjectAt(elem_index);
+        elem = pool.ObjectAt(elem_index);
         if (!elem.IsNull()) {
           ASSERT(elem.IsTypeArguments());
           Instance::Cast(obj).SetTypeArguments(TypeArguments::Cast(elem));
@@ -1126,7 +1181,7 @@
           field = H.LookupFieldByKernelField(field_name);
           intptr_t elem_index = builder_->ReadUInt();
           ASSERT(elem_index < i);
-          elem = obj_pool.ObjectAt(elem_index);
+          elem = pool.ObjectAt(elem_index);
           Instance::Cast(obj).SetField(field, elem);
         }
         obj = H.Canonicalize(Instance::Cast(obj));
@@ -1136,34 +1191,193 @@
         ASSERT(String::Cast(obj).IsSymbol());
         break;
       case kTypeArgumentsForInstanceAllocation: {
-        obj =
+        cls =
             H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
-        ASSERT(obj.IsClass());
         intptr_t elem_index = builder_->ReadUInt();
         ASSERT(elem_index < i);
-        elem = obj_pool.ObjectAt(elem_index);
+        elem = pool.ObjectAt(elem_index);
         ASSERT(elem.IsNull() || elem.IsTypeArguments());
-        elem = Type::New(Class::Cast(obj), TypeArguments::Cast(elem),
-                         TokenPosition::kNoSource);
-        elem = ClassFinalizer::FinalizeType(Class::Cast(obj), Type::Cast(elem));
+        elem =
+            Type::New(cls, TypeArguments::Cast(elem), TokenPosition::kNoSource);
+        elem = ClassFinalizer::FinalizeType(cls, Type::Cast(elem));
         obj = Type::Cast(elem).arguments();
       } break;
+      case ConstantPoolTag::kContextOffset: {
+        intptr_t index = builder_->ReadUInt();
+        if (i == 0) {
+          obj = Smi::New(Context::parent_offset() / kWordSize);
+        } else {
+          obj = Smi::New(Context::variable_offset(index - 1) / kWordSize);
+        }
+      } break;
+      case ConstantPoolTag::kClosureFunction: {
+        name = H.DartSymbolPlain(builder_->ReadStringReference()).raw();
+        const Function& closure = Function::Handle(
+            builder_->zone_,
+            Function::NewClosureFunction(name, inner_function,
+                                         TokenPosition::kNoSource));
+
+        FunctionNodeHelper function_node_helper(builder_);
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kTypeParameters);
+        builder_->LoadAndSetupTypeParameters(builder_->active_class(), closure,
+                                             builder_->ReadListLength(),
+                                             closure);
+        function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+        // Scope remains opened until ConstantPoolTag::kEndClosureFunctionScope.
+        ActiveTypeParametersScope scope(
+            builder_->active_class(), &closure,
+            TypeArguments::Handle(builder_->zone_, closure.type_parameters()),
+            builder_->zone_);
+
+        function_node_helper.ReadUntilExcluding(
+            FunctionNodeHelper::kPositionalParameters);
+
+        intptr_t required_parameter_count =
+            function_node_helper.required_parameter_count_;
+        intptr_t total_parameter_count =
+            function_node_helper.total_parameter_count_;
+
+        intptr_t positional_parameter_count = builder_->ReadListLength();
+
+        intptr_t named_parameter_count =
+            total_parameter_count - positional_parameter_count;
+
+        const intptr_t extra_parameters = 1;
+        closure.set_num_fixed_parameters(extra_parameters +
+                                         required_parameter_count);
+        if (named_parameter_count > 0) {
+          closure.SetNumOptionalParameters(named_parameter_count, false);
+        } else {
+          closure.SetNumOptionalParameters(
+              positional_parameter_count - required_parameter_count, true);
+        }
+        intptr_t parameter_count = extra_parameters + total_parameter_count;
+        closure.set_parameter_types(Array::Handle(
+            builder_->zone_, Array::New(parameter_count, Heap::kOld)));
+        closure.set_parameter_names(Array::Handle(
+            builder_->zone_, Array::New(parameter_count, Heap::kOld)));
+
+        intptr_t pos = 0;
+        closure.SetParameterTypeAt(pos, AbstractType::dynamic_type());
+        closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
+        pos++;
+
+        for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
+          VariableDeclarationHelper helper(builder_);
+          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+          const AbstractType& type =
+              builder_->type_translator_.BuildVariableType();
+          Tag tag = builder_->ReadTag();  // read (first part of) initializer.
+          if (tag == kSomething) {
+            builder_->SkipExpression();  // read (actual) initializer.
+          }
+
+          closure.SetParameterTypeAt(pos, type);
+          closure.SetParameterNameAt(pos,
+                                     H.DartSymbolObfuscate(helper.name_index_));
+        }
+
+        intptr_t named_parameter_count_check = builder_->ReadListLength();
+        ASSERT(named_parameter_count_check == named_parameter_count);
+        for (intptr_t j = 0; j < named_parameter_count; ++j, ++pos) {
+          VariableDeclarationHelper helper(builder_);
+          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+          const AbstractType& type =
+              builder_->type_translator_.BuildVariableType();
+          Tag tag = builder_->ReadTag();  // read (first part of) initializer.
+          if (tag == kSomething) {
+            builder_->SkipExpression();  // read (actual) initializer.
+          }
+
+          closure.SetParameterTypeAt(pos, type);
+          closure.SetParameterNameAt(pos,
+                                     H.DartSymbolObfuscate(helper.name_index_));
+        }
+
+        function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
+
+        const AbstractType& return_type =
+            builder_->type_translator_.BuildVariableType();
+        closure.set_result_type(return_type);
+        function_node_helper.SetJustRead(FunctionNodeHelper::kReturnType);
+        // The closure has no body.
+        function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
+
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+        pool.SetObjectAt(i, closure);
+
+        // Continue reading the constant pool entries inside the opened
+        // ActiveTypeParametersScope until the scope gets closed by a
+        // kEndClosureFunctionScope tag, in which case control returns here.
+        i = ReadPoolEntries(function, closure, pool, i + 1);
+        // Pool entry at index i has been set to null, because it was a
+        // kEndClosureFunctionScope.
+        ASSERT(pool.ObjectAt(i) == Object::null());
+        continue;
+      }
+      case ConstantPoolTag::kEndClosureFunctionScope: {
+        // Entry is not used and set to null.
+        obj = Object::null();
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+        pool.SetObjectAt(i, obj);
+        return i;  // The caller will close the scope.
+      } break;
       default:
         UNREACHABLE();
     }
-    obj_pool.SetTypeAt(i, ObjectPool::kTaggedObject);
-    obj_pool.SetObjectAt(i, obj);
+    pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+    pool.SetObjectAt(i, obj);
   }
+  // Return the index of the last read pool entry.
+  return obj_count - 1;
+}
 
-  const Code& bytecode = Code::Handle(
-      builder_->zone_,
-      Code::FinalizeBytecode(reinterpret_cast<void*>(bytecode_data),
-                             bytecode_size, obj_pool));
-  function.AttachBytecode(bytecode);
+RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
+  // TODO(regis): Avoid copying bytecode from mapped kernel binary.
+  intptr_t size = builder_->reader_.ReadUInt();
+  intptr_t offset = builder_->reader_.offset();
+  uint8_t* data =
+      builder_->reader_.CopyDataIntoZone(builder_->zone_, offset, size);
+  builder_->reader_.set_offset(offset + size);
 
-  if (FLAG_dump_kernel_bytecode) {
-    KernelBytecodeDisassembler::Disassemble(function);
+  // Create and return code object.
+  return Code::FinalizeBytecode(reinterpret_cast<void*>(data), size, pool);
+}
+
+void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
+  const ObjectPool& pool =
+      ObjectPool::Handle(builder_->zone_, bytecode.object_pool());
+  AbstractType& handled_type = AbstractType::Handle(builder_->zone_);
+
+  // Encoding of ExceptionsTable is described in
+  // pkg/vm/lib/bytecode/exceptions.dart.
+  intptr_t try_block_count = builder_->reader_.ReadListLength();
+  for (intptr_t i = 0; i < try_block_count; i++) {
+    intptr_t outer_try_index_plus1 = builder_->reader_.ReadUInt();
+    intptr_t outer_try_index = outer_try_index_plus1 - 1;
+    USE(outer_try_index);
+    intptr_t start_pc = builder_->reader_.ReadUInt();
+    USE(start_pc);
+    intptr_t end_pc = builder_->reader_.ReadUInt();
+    USE(end_pc);
+    intptr_t handler_pc = builder_->reader_.ReadUInt();
+    USE(handler_pc);
+    uint8_t flags = builder_->reader_.ReadByte();
+    // flagNeedsStackTrace = 1 << 0;
+    // flagIsSynthetic = 1 << 1;
+    USE(flags);
+
+    intptr_t type_count = builder_->reader_.ReadListLength();
+    for (intptr_t j = 0; j < type_count; j++) {
+      intptr_t type_index = builder_->reader_.ReadUInt();
+      ASSERT(type_index < pool.Length());
+      handled_type ^= pool.ObjectAt(type_index);
+    }
   }
+  // TODO(regis): Generate exception handlers (as well as pc descriptors)
+  // and store in bytecode: bytecode.set_exception_handlers(exception_handlers);
 }
 #endif  // defined(DART_USE_INTERPRETER)
 
@@ -1598,8 +1812,8 @@
     first_body_token_position_ = builder_->reader_.min_position();
   }
 
-  // Ensure that :await_jump_var, :await_ctx_var, :async_op and
-  // :async_stack_trace are captured.
+  // Ensure that :await_jump_var, :await_ctx_var, :async_op,
+  // :async_completer and :async_stack_trace are captured.
   if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
     {
       LocalVariable* temp = NULL;
@@ -1620,6 +1834,13 @@
         scope_->CaptureVariable(temp);
       }
     }
+    {
+      LocalVariable* temp =
+          scope_->LookupVariable(Symbols::AsyncCompleter(), true);
+      if (temp != NULL) {
+        scope_->CaptureVariable(temp);
+      }
+    }
     if (FLAG_causal_async_stacks) {
       LocalVariable* temp =
           scope_->LookupVariable(Symbols::AsyncStackTraceVar(), true);
@@ -3914,7 +4135,9 @@
 }
 
 void StreamingConstantEvaluator::EvaluateConstantExpression() {
-  result_ ^= H.constants().At(builder_->ReadUInt());
+  KernelConstantsMap constant_map(H.constants().raw());
+  result_ ^= constant_map.GetOrDie(builder_->ReadUInt());
+  ASSERT(constant_map.Release().raw() == H.constants().raw());
 }
 
 // This depends on being about to read the list of positionals on arguments.
@@ -5446,7 +5669,7 @@
   function_node_helper.ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
 
-  body += NullConstant();
+  body += MakeTemp();
   LocalVariable* result = MakeTemporary();
 
   // Do "++argument_count" if any type arguments were passed.
@@ -5978,7 +6201,7 @@
         dispatch += Drop();
       }
       if (i == (yield_continuations().length() - 1)) {
-        // We reached the last possility, no need to build more ifs.
+        // We reached the last possibility, no need to build more ifs.
         // Continue to the last continuation.
         // Note: continuations start with nop DropTemps instruction
         // which acts like an anchor, so we need to skip it.
@@ -6162,7 +6385,7 @@
   // TODO(regis): Clean up this logic of when to compile.
   // If the bytecode was previously loaded, we really want to compile.
   if (!function.HasBytecode()) {
-    bytecode_metadata_helper_.CopyBytecode(function);
+    bytecode_metadata_helper_.ReadMetadata(function);
     if (function.HasBytecode()) {
       return NULL;
     }
@@ -7573,6 +7796,10 @@
   return flow_graph_builder_->DropTempsPreserveTop(num_temps_to_drop);
 }
 
+Fragment StreamingFlowGraphBuilder::MakeTemp() {
+  return flow_graph_builder_->MakeTemp();
+}
+
 Fragment StreamingFlowGraphBuilder::NullConstant() {
   return flow_graph_builder_->NullConstant();
 }
@@ -7844,7 +8071,7 @@
   const DirectCallMetadata direct_call =
       direct_call_metadata_helper_.GetDirectTargetForPropertySet(offset);
 
-  Fragment instructions(NullConstant());
+  Fragment instructions(MakeTemp());
   LocalVariable* variable = MakeTemporary();
 
   const TokenPosition position = ReadPosition();  // read position.
@@ -8062,7 +8289,7 @@
 
   Function& function = FindMatchingFunctionAnyArgs(klass, setter_name);
 
-  Fragment instructions(NullConstant());
+  Fragment instructions(MakeTemp());
   LocalVariable* value = MakeTemporary();  // this holds RHS value
 
   if (function.IsNull()) {
@@ -8172,7 +8399,7 @@
   const TokenPosition position = ReadPosition();  // read position.
   if (p != NULL) *p = position;
 
-  Fragment instructions(NullConstant());
+  Fragment instructions(MakeTemp());
   LocalVariable* value = MakeTemporary();
 
   instructions += BuildExpression();  // read receiver.
@@ -9411,8 +9638,12 @@
 Fragment StreamingFlowGraphBuilder::BuildConstantExpression(
     TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
-  const intptr_t constant_index = ReadUInt();
-  return Constant(Object::ZoneHandle(Z, H.constants().At(constant_index)));
+  const intptr_t constant_offset = ReadUInt();
+  KernelConstantsMap constant_map(H.constants().raw());
+  Fragment result =
+      Constant(Object::ZoneHandle(Z, constant_map.GetOrDie(constant_offset)));
+  ASSERT(constant_map.Release().raw() == H.constants().raw());
+  return result;
 }
 
 Fragment StreamingFlowGraphBuilder::BuildPartialTearoffInstantiation(
@@ -11076,9 +11307,13 @@
   temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
   ASSERT(temp_object_.IsNull());
 
-  const Array& constants =
-      Array::Handle(Z, Array::New(number_of_constants, Heap::kOld));
+  KernelConstantsMap constants(
+      HashTables::New<KernelConstantsMap>(number_of_constants, Heap::kOld));
+
+  const intptr_t start_offset = builder_.ReaderOffset();
+
   for (intptr_t i = 0; i < number_of_constants; ++i) {
+    const intptr_t offset = builder_.ReaderOffset();
     const intptr_t constant_tag = builder_.ReadByte();
     switch (constant_tag) {
       case kNullConstant:
@@ -11115,9 +11350,9 @@
         temp_array_ = ImmutableArray::New(length, Heap::kOld);
         temp_array_.SetTypeArguments(temp_type_arguments_);
         for (intptr_t j = 0; j < length; ++j) {
-          const intptr_t entry_index = builder_.ReadUInt();
-          ASSERT(entry_index < i);  // We have a DAG!
-          temp_object_ = constants.At(entry_index);
+          const intptr_t entry_offset = builder_.ReadUInt();
+          ASSERT(entry_offset < offset);  // We have a DAG!
+          temp_object_ = constants.GetOrDie(entry_offset);
           temp_array_.SetAt(j, temp_object_);
         }
 
@@ -11154,9 +11389,9 @@
         for (intptr_t j = 0; j < number_of_fields; ++j) {
           temp_field_ =
               H.LookupFieldByKernelField(builder_.ReadCanonicalNameReference());
-          const intptr_t entry_index = builder_.ReadUInt();
-          ASSERT(entry_index < i);  // We have a DAG!
-          temp_object_ = constants.At(entry_index);
+          const intptr_t entry_offset = builder_.ReadUInt();
+          ASSERT(entry_offset < offset);  // We have a DAG!
+          temp_object_ = constants.GetOrDie(entry_offset);
           temp_instance_.SetField(temp_field_, temp_object_);
         }
 
@@ -11164,8 +11399,8 @@
         break;
       }
       case kPartialInstantiationConstant: {
-        const intptr_t entry_index = builder_.ReadUInt();
-        temp_object_ = constants.At(entry_index);
+        const intptr_t entry_offset = builder_.ReadUInt();
+        temp_object_ = constants.GetOrDie(entry_offset);
 
         // Happens if the tearoff was in the vmservice library and we have
         // [skip_vm_service_library] enabled.
@@ -11219,9 +11454,9 @@
       default:
         UNREACHABLE();
     }
-    constants.SetAt(i, temp_instance_);
+    constants.InsertNewOrGetValue(offset - start_offset, temp_instance_);
   }
-  return constants;
+  return Array::Handle(Z, constants.Release().raw());
 }
 
 void ConstantHelper::InstantiateTypeArguments(const Class& receiver_class,
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index a8b39a4..169f403 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -670,7 +670,16 @@
       : MetadataHelper(builder) {}
 
 #if defined(DART_USE_INTERPRETER)
-  void CopyBytecode(const Function& function);
+  void ReadMetadata(const Function& function);
+
+ private:
+  // Returns the index of the last read pool entry.
+  intptr_t ReadPoolEntries(const Function& function,
+                           const Function& inner_function,
+                           const ObjectPool& pool,
+                           intptr_t from_index);
+  RawCode* ReadBytecode(const ObjectPool& pool);
+  void ReadExceptionsTable(const Code& bytecode);
 #endif
 };
 
@@ -1446,6 +1455,7 @@
   // Drop given number of temps from the stack but preserve top of the stack.
   Fragment DropTempsPreserveTop(intptr_t num_temps_to_drop);
 
+  Fragment MakeTemp();
   Fragment NullConstant();
   JoinEntryInstr* BuildJoinEntry();
   JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 6b5a9af..c8a1f61 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2040,6 +2040,12 @@
   return Fragment(drop_temps);
 }
 
+Fragment BaseFlowGraphBuilder::MakeTemp() {
+  MakeTempInstr* make_temp = new (Z) MakeTempInstr(Z);
+  Push(make_temp);
+  return Fragment(make_temp);
+}
+
 void FlowGraphBuilder::InlineBailout(const char* reason) {
   bool is_inlining = exit_collector_ != NULL;
   if (is_inlining) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index a22d222..97e4aaa 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -580,6 +580,7 @@
   Fragment Drop();
   // Drop given number of temps from the stack but preserve top of the stack.
   Fragment DropTempsPreserveTop(intptr_t num_temps_to_drop);
+  Fragment MakeTemp();
 
   // Create a pseudo-local variable for a location on the expression stack.
   // Note: SSA construction currently does not support inserting Phi functions
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index 4a7d49f..1649f3a 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -78,7 +78,7 @@
   Timer graphcompiler_timer;   // Included in codegen_timer.
   Timer codefinalizer_timer;   // Included in codegen_timer.
 
-  ALIGN8 int64_t num_tokens_total;  // Isolate + VM isolate
+  ALIGN8 int64_t num_tokens_total;  // Isolate + VM isolate.
   ALIGN8 int64_t num_tokens_scanned;
   ALIGN8 int64_t num_tokens_consumed;
   ALIGN8 int64_t num_cached_consts;
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 2541e0a..375fc6d 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -52,7 +52,7 @@
 #define CHECK_API_SCOPE(thread)                                                \
   do {                                                                         \
     Thread* tmpT = (thread);                                                   \
-    Isolate* tmpI = tmpT->isolate();                                           \
+    Isolate* tmpI = tmpT == NULL ? NULL : tmpT->isolate();                     \
     CHECK_ISOLATE(tmpI);                                                       \
     if (tmpT->api_top_scope() == NULL) {                                       \
       FATAL1(                                                                  \
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 559b954..00cc771 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -752,15 +752,26 @@
 }
 
 RawObject* ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
-  const Class& sync_completer_cls = Class::Handle(completer.clazz());
-  ASSERT(!sync_completer_cls.IsNull());
-  const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
-  const Field& future_field =
-      Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
-          Symbols::CompleterFuture()));
-  ASSERT(!future_field.IsNull());
   Instance& future = Instance::Handle();
-  future ^= Instance::Cast(completer).GetField(future_field);
+  if (FLAG_sync_async) {
+    const Class& completer_cls = Class::Handle(completer.clazz());
+    ASSERT(!completer_cls.IsNull());
+    const Function& future_getter = Function::Handle(
+        completer_cls.LookupGetterFunction(Symbols::CompleterFuture()));
+    ASSERT(!future_getter.IsNull());
+    const Array& args = Array::Handle(Array::New(1));
+    args.SetAt(0, Instance::Cast(completer));
+    future ^= DartEntry::InvokeFunction(future_getter, args);
+  } else {
+    const Class& sync_completer_cls = Class::Handle(completer.clazz());
+    ASSERT(!sync_completer_cls.IsNull());
+    const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
+    const Field& future_field =
+        Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
+            Symbols::CompleterFuture()));
+    ASSERT(!future_field.IsNull());
+    future ^= Instance::Cast(completer).GetField(future_field);
+  }
   if (future.IsNull()) {
     // The completer object may not be fully initialized yet.
     return Object::null();
@@ -855,11 +866,18 @@
 
 void ActivationFrame::ExtractTokenPositionFromAsyncClosure() {
   // Attempt to determine the token position from the async closure.
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Script& script = Script::Handle(zone, function().script());
+
   ASSERT(function_.IsAsyncGenClosure() || function_.IsAsyncClosure());
   // This should only be called on frames that aren't active on the stack.
   ASSERT(fp() == 0);
+
   const Array& await_to_token_map =
-      Array::Handle(code_.await_token_positions());
+      Array::Handle(zone, script.kind() == RawScript::kKernelTag
+                              ? script.yield_positions()
+                              : code_.await_token_positions());
   if (await_to_token_map.IsNull()) {
     // No mapping.
     return;
@@ -883,9 +901,15 @@
   if (await_jump_var < 0) {
     return;
   }
-  ASSERT(await_jump_var < await_to_token_map.Length());
+  intptr_t await_to_token_map_index =
+      script.kind() == RawScript::kKernelTag
+          ? await_jump_var - 1
+          :
+          // source script tokens array has first element duplicated
+          await_jump_var;
+  ASSERT(await_to_token_map_index < await_to_token_map.Length());
   const Object& token_pos =
-      Object::Handle(await_to_token_map.At(await_jump_var));
+      Object::Handle(await_to_token_map.At(await_to_token_map_index));
   if (token_pos.IsNull()) {
     return;
   }
@@ -2017,13 +2041,37 @@
   Array& deopt_frame = Array::Handle(zone);
   class StackTrace& async_stack_trace = StackTrace::Handle(zone);
   bool stack_has_async_function = false;
+
+  // Number of frames we are trying to skip that form "sync async" entry.
+  int skipSyncAsyncFramesCount = -1;
+  String& function_name = String::Handle(zone);
   for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (FLAG_trace_debugger_stacktrace) {
-      OS::PrintErr("CollectStackTrace: visiting frame:\n\t%s\n",
+      OS::PrintErr("CollectAwaiterReturnStackTrace: visiting frame:\n\t%s\n",
                    frame->ToCString());
     }
+    if (skipSyncAsyncFramesCount >= 0) {
+      if (!frame->IsDartFrame()) {
+        break;
+      }
+      // Assume that the code we are looking for is not inlined.
+      code = frame->LookupDartCode();
+      function = code.function();
+      function_name ^= function.QualifiedScrubbedName();
+      if (skipSyncAsyncFramesCount == 2) {
+        if (!function_name.Equals(Symbols::_ClosureCall())) {
+          break;
+        }
+      } else if (skipSyncAsyncFramesCount == 1) {
+        if (!function_name.Equals(Symbols::_AsyncAwaitCompleterStart())) {
+          break;
+        }
+      }
+
+      skipSyncAsyncFramesCount--;
+    }
     if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
       if (code.is_optimized()) {
@@ -2035,8 +2083,10 @@
           function = it.function();
           if (FLAG_trace_debugger_stacktrace) {
             ASSERT(!function.IsNull());
-            OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n",
-                         function.ToFullyQualifiedCString());
+            OS::PrintErr(
+                "CollectAwaiterReturnStackTrace: visiting inlined function: "
+                "%s\n",
+                function.ToFullyQualifiedCString());
           }
           intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
           if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
@@ -2072,7 +2122,16 @@
           // Grab the awaiter.
           async_activation ^= activation->GetAsyncAwaiter();
           async_stack_trace ^= activation->GetCausalStack();
-          break;
+          if (FLAG_sync_async) {
+            // async function might have been called synchronously, in which
+            // case we need to keep going down the stack.
+            // To determine how we are called we peek few more frames further
+            // expecting to see Closure_call followed by
+            // AsyncAwaitCompleter_start.
+            skipSyncAsyncFramesCount = 2;
+          } else {
+            break;
+          }
         } else {
           stack_trace->AddActivation(CollectDartFrame(
               isolate, frame->pc(), frame, code, Object::null_array(), 0));
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 7045230..24ae04c 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -544,6 +544,12 @@
     }
     return (entry == -1) ? Object::null() : BaseIterTable::GetPayload(entry, 0);
   }
+  template <typename Key>
+  RawObject* GetOrDie(const Key& key) const {
+    intptr_t entry = BaseIterTable::FindKey(key);
+    if (entry == -1) UNREACHABLE();
+    return BaseIterTable::GetPayload(entry, 0);
+  }
   bool UpdateOrInsert(const Object& key, const Object& value) const {
     EnsureCapacity();
     intptr_t entry = -1;
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 48f8763..71fbf0e 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -519,16 +519,16 @@
       "  return max(3, 4);\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
-
   const char* kReloadScript =
       "import 'dart:math';\n"
       "main() {\n"
       "  return max(3, 4);\n"
       "}\n";
 
+  Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
+  EXPECT_VALID(lib);
+  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
+
   lib = TestCase::ReloadTestScript(kReloadScript);
   EXPECT_VALID(lib);
   EXPECT_EQ(4, SimpleInvoke(lib, "main"));
@@ -551,8 +551,6 @@
       "}\n";
 
   lib = TestCase::ReloadTestScript(kReloadScript);
-  EXPECT_VALID(lib);
-
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
 }
 
@@ -1036,7 +1034,7 @@
 
   // Dart_Handle result;
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
   EXPECT_VALID(lib);
   EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
 
@@ -1069,7 +1067,7 @@
       "  return importedIntFunc();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
   EXPECT_VALID(lib);
 
   // Works.
@@ -1089,12 +1087,15 @@
       "}\n";
 
   lib = TestCase::ReloadTestScript(kReloadScript);
-  EXPECT_VALID(lib);
-
-  // Works.
-  EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
-  // Results in an error.
-  EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc");
+  if (TestCase::UsingDartFrontend() && TestCase::UsingStrongMode()) {
+    EXPECT_ERROR(lib, "importedIntFunc");
+  } else {
+    EXPECT_VALID(lib);
+    // Works.
+    EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
+    // Results in an error.
+    EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc");
+  }
 }
 
 // Verifies that we clear the ICs for the functions live on the stack in a way
@@ -1622,7 +1623,7 @@
   if (TestCase::UsingStrongMode()) {
     error =
         "file:///test-lib:8:12: Error: Too few positional"
-        " arguments to function: 1 required, 0 given.\n"
+        " arguments: 1 required, 0 given.\n"
         "  return f1();";
   } else if (TestCase::UsingDartFrontend()) {
     error =
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c22b3f5..cc0b1e6c 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -583,10 +583,25 @@
   }
 
  private:
+  void LoadKernelFromResponse(Dart_CObject* response) {
+    ASSERT((response->type == Dart_CObject_kTypedData) ||
+           (response->type == Dart_CObject_kNull));
+
+    if (response->type == Dart_CObject_kNull) {
+      return;
+    }
+
+    ASSERT(response->value.as_typed_data.type == Dart_TypedData_kUint8);
+    result_.kernel_size = response->value.as_typed_data.length;
+    result_.kernel = static_cast<uint8_t*>(malloc(result_.kernel_size));
+    memmove(result_.kernel, response->value.as_typed_data.values,
+            result_.kernel_size);
+  }
+
   // Possible responses from the Kernel isolate:
   //
   //     [Ok, Uint8List KernelBinary]
-  //     [Error, String error]
+  //     [Error, String error, Uint8List KernelBinary]
   //     [Crash, String error]
   //
   void HandleResponseImpl(Dart_CObject* message) {
@@ -602,22 +617,11 @@
         message->value.as_array.values[0]->value.as_int32);
 
     if (result_.status == Dart_KernelCompilationStatus_Ok) {
-      ASSERT((response[1]->type == Dart_CObject_kTypedData) ||
-             (response[1]->type == Dart_CObject_kNull));
-
-      if (response[1]->type == Dart_CObject_kNull) {
-        ml.Notify();
-        return;
-      }
-
-      ASSERT(response[1]->value.as_typed_data.type == Dart_TypedData_kUint8);
-      result_.kernel_size = response[1]->value.as_typed_data.length;
-      result_.kernel = static_cast<uint8_t*>(malloc(result_.kernel_size));
-      memmove(result_.kernel, response[1]->value.as_typed_data.values,
-              result_.kernel_size);
+      LoadKernelFromResponse(response[1]);
     } else {
-      ASSERT(result_.status == Dart_KernelCompilationStatus_Crash ||
-             result_.status == Dart_KernelCompilationStatus_Error);
+      if (result_.status == Dart_KernelCompilationStatus_Error) {
+        LoadKernelFromResponse(response[2]);
+      }
       // This is an error.
       ASSERT(response[1]->type == Dart_CObject_kString);
       result_.error = strdup(response[1]->value.as_string);
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index abbc676..607c1e9 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -376,7 +376,8 @@
   return helper.ReadConstantTable();
 }
 
-void KernelLoader::AnnotateNativeProcedures(const Array& constant_table) {
+void KernelLoader::AnnotateNativeProcedures(const Array& constant_table_array) {
+  KernelConstantsMap constant_table(constant_table_array.raw());
   potential_natives_ = kernel_program_info_.potential_natives();
   const intptr_t length =
       !potential_natives_.IsNull() ? potential_natives_.Length() : 0;
@@ -407,8 +408,8 @@
 
           // We have a candiate.  Let's look if it's an instance of the
           // ExternalName class.
-          const intptr_t constant_table_index = builder_.ReadUInt();
-          constant ^= constant_table.At(constant_table_index);
+          const intptr_t constant_table_offset = builder_.ReadUInt();
+          constant ^= constant_table.GetOrDie(constant_table_offset);
           if (constant.clazz() == external_name_class_.raw()) {
             // We found the annotation, let's flag the function as native and
             // set the native name!
@@ -428,6 +429,7 @@
     potential_natives_ = GrowableObjectArray::null();
     kernel_program_info_.set_potential_natives(potential_natives_);
   }
+  ASSERT(constant_table.Release().raw() == constant_table_array.raw());
 }
 
 RawString* KernelLoader::DetectExternalName() {
@@ -469,12 +471,15 @@
   return result.raw();
 }
 
-void KernelLoader::LoadNativeExtensionLibraries(const Array& constant_table) {
+void KernelLoader::LoadNativeExtensionLibraries(
+    const Array& constant_table_array) {
   const intptr_t length = !potential_extension_libraries_.IsNull()
                               ? potential_extension_libraries_.Length()
                               : 0;
   if (length == 0) return;
 
+  KernelConstantsMap constant_table(constant_table_array.raw());
+
   // Obtain `dart:_internal::ExternalName.name`.
   EnsureExternalClassIsLookedUp();
 
@@ -499,7 +504,7 @@
         builder_.ReadByte();  // Skip the tag.
 
         const intptr_t constant_table_index = builder_.ReadUInt();
-        constant ^= constant_table.At(constant_table_index);
+        constant ^= constant_table.GetOrDie(constant_table_index);
         if (constant.clazz() == external_name_class_.raw()) {
           uri_path ^= constant.GetField(external_name_field_);
         }
@@ -534,6 +539,7 @@
     }
   }
   potential_extension_libraries_ = GrowableObjectArray::null();
+  ASSERT(constant_table.Release().raw() == constant_table_array.raw());
 }
 
 RawObject* KernelLoader::LoadProgram(bool process_pending_classes) {
@@ -1334,14 +1340,16 @@
           // Obtain `dart:_internal::ExternalName.name`.
           EnsureExternalClassIsLookedUp();
 
-          const Array& constant_table =
+          const Array& constant_table_array =
               Array::Handle(kernel_program_info_.constants());
+          KernelConstantsMap constant_table(constant_table_array.raw());
 
           // We have a candiate.  Let's look if it's an instance of the
           // ExternalName class.
           const intptr_t constant_table_index = builder_.ReadUInt();
           const Object& constant =
-              Object::Handle(constant_table.At(constant_table_index));
+              Object::Handle(constant_table.GetOrDie(constant_table_index));
+          ASSERT(constant_table.Release().raw() == constant_table_array.raw());
           if (constant.clazz() == external_name_class_.raw()) {
             const Instance& instance =
                 Instance::Handle(Instance::RawCast(constant.raw()));
@@ -1390,8 +1398,16 @@
   ASSERT(function_node_tag == kSomething);
   FunctionNodeHelper function_node_helper(&builder_);
   function_node_helper.ReadUntilIncluding(FunctionNodeHelper::kDartAsyncMarker);
+  // _AsyncAwaitCompleter.future should be made non-debuggable, otherwise
+  // stepping out of async methods will keep hitting breakpoint resulting in
+  // infinite loop.
+  bool isAsyncAwaitCompleterFuture =
+      Symbols::_AsyncAwaitCompleter().Equals(
+          String::Handle(owner.ScrubbedName())) &&
+      Symbols::CompleterGetFuture().Equals(String::Handle(function.name()));
   function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
-                             FunctionNodeHelper::kSync);
+                                 FunctionNodeHelper::kSync &&
+                             !isAsyncAwaitCompleterFuture);
   switch (function_node_helper.dart_async_marker_) {
     case FunctionNodeHelper::kSyncStar:
       function.set_modifier(RawFunction::kSyncGen);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 5056ab6..cf08ad6 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3220,6 +3220,21 @@
   return true;
 }
 
+static const MethodParameter* kill_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    NULL,
+};
+
+static bool Kill(Thread* thread, JSONStream* js) {
+  const String& msg =
+      String::Handle(String::New("isolate terminated by Kill service request"));
+  const UnwindError& error = UnwindError::Handle(UnwindError::New(msg));
+  error.set_is_user_initiated(true);
+  Thread::Current()->set_sticky_error(error);
+  PrintSuccess(js);
+  return true;
+}
+
 static const MethodParameter* pause_params[] = {
     RUNNABLE_ISOLATE_PARAMETER, NULL,
 };
@@ -4347,6 +4362,7 @@
     get_vm_timeline_params },
   { "_getVMTimelineFlags", GetVMTimelineFlags,
     get_vm_timeline_flags_params },
+  { "kill", Kill, kill_params },
   { "pause", Pause,
     pause_params },
   { "removeBreakpoint", RemoveBreakpoint,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index cb81061..e084402 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 7
+#define SERVICE_PROTOCOL_MINOR_VERSION 8
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index bfbbe3f..cf548a5 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.7
+# Dart VM Service Protocol 3.8
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.7_ of the Dart VM Service Protocol. This
+This document describes of _version 3.8_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -24,74 +24,75 @@
 - [Versioning](#versioning)
 - [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
 - [Public RPCs](#public-rpcs)
-	- [addBreakpoint](#addbreakpoint)
-	- [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
-	- [addBreakpointAtEntry](#addbreakpointatentry)
-	- [evaluate](#evaluate)
-	- [evaluateInFrame](#evaluateinframe)
-	- [getFlagList](#getflaglist)
-	- [getIsolate](#getisolate)
-	- [getObject](#getobject)
-	- [getSourceReport](#getsourcereport)
-	- [getStack](#getstack)
-	- [getVersion](#getversion)
-	- [getVM](#getvm)
-	- [pause](#pause)
-	- [reloadSources](#reloadsources)
-	- [removeBreakpoint](#removebreakpoint)
-	- [resume](#resume)
-	- [setExceptionPauseMode](#setexceptionpausemode)
-	- [setFlag](#setflag)
-	- [setLibraryDebuggable](#setlibrarydebuggable)
-	- [setName](#setname)
-	- [setVMName](#setvmname)
-	- [streamCancel](#streamcancel)
-	- [streamListen](#streamlisten)
+  - [addBreakpoint](#addbreakpoint)
+  - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
+  - [addBreakpointAtEntry](#addbreakpointatentry)
+  - [evaluate](#evaluate)
+  - [evaluateInFrame](#evaluateinframe)
+  - [getFlagList](#getflaglist)
+  - [getIsolate](#getisolate)
+  - [getObject](#getobject)
+  - [getSourceReport](#getsourcereport)
+  - [getStack](#getstack)
+  - [getVersion](#getversion)
+  - [getVM](#getvm)
+  - [pause](#pause)
+  - [kill](#kill)
+  - [reloadSources](#reloadsources)
+  - [removeBreakpoint](#removebreakpoint)
+  - [resume](#resume)
+  - [setExceptionPauseMode](#setexceptionpausemode)
+  - [setFlag](#setflag)
+  - [setLibraryDebuggable](#setlibrarydebuggable)
+  - [setName](#setname)
+  - [setVMName](#setvmname)
+  - [streamCancel](#streamcancel)
+  - [streamListen](#streamlisten)
 - [Public Types](#public-types)
-	- [BoundField](#boundfield)
-	- [BoundVariable](#boundvariable)
-	- [Breakpoint](#breakpoint)
-	- [Class](#class)
-	- [ClassList](#classlist)
-	- [Code](#code)
-	- [CodeKind](#codekind)
-	- [Context](#context)
-	- [ContextElement](#contextelement)
-	- [Error](#error)
-	- [ErrorKind](#errorkind)
-	- [Event](#event)
-	- [EventKind](#eventkind)
-	- [ExtensionData](#extensiondata)
-	- [Field](#field)
-	- [Flag](#flag)
-	- [FlagList](#flaglist)
-	- [Frame](#frame)
-	- [Function](#function)
-	- [Instance](#instance)
-	- [Isolate](#isolate)
-	- [Library](#library)
-	- [LibraryDependency](#librarydependency)
-	- [MapAssociation](#mapassociation)
-	- [Message](#message)
-	- [Null](#null)
-	- [Object](#object)
-	- [ReloadReport](#reloadreport)
-	- [Response](#response)
-	- [Sentinel](#sentinel)
-	- [SentinelKind](#sentinelkind)
-	- [Script](#script)
-	- [SourceLocation](#sourcelocation)
-	- [SourceReport](#sourcereport)
-	- [SourceReportCoverage](#sourcereportcoverage)
-	- [SourceReportKind](#sourcereportkind)
-	- [SourceReportRange](#sourcereportrange)
-	- [Stack](#stack)
-	- [StepOption](#stepoption)
-	- [Success](#success)
-	- [TypeArguments](#typearguments)
-	- [UresolvedSourceLocation](#unresolvedsourcelocation)
-	- [Version](#version)
-	- [VM](#vm)
+  - [BoundField](#boundfield)
+  - [BoundVariable](#boundvariable)
+  - [Breakpoint](#breakpoint)
+  - [Class](#class)
+  - [ClassList](#classlist)
+  - [Code](#code)
+  - [CodeKind](#codekind)
+  - [Context](#context)
+  - [ContextElement](#contextelement)
+  - [Error](#error)
+  - [ErrorKind](#errorkind)
+  - [Event](#event)
+  - [EventKind](#eventkind)
+  - [ExtensionData](#extensiondata)
+  - [Field](#field)
+  - [Flag](#flag)
+  - [FlagList](#flaglist)
+  - [Frame](#frame)
+  - [Function](#function)
+  - [Instance](#instance)
+  - [Isolate](#isolate)
+  - [Library](#library)
+  - [LibraryDependency](#librarydependency)
+  - [MapAssociation](#mapassociation)
+  - [Message](#message)
+  - [Null](#null)
+  - [Object](#object)
+  - [ReloadReport](#reloadreport)
+  - [Response](#response)
+  - [Sentinel](#sentinel)
+  - [SentinelKind](#sentinelkind)
+  - [Script](#script)
+  - [SourceLocation](#sourcelocation)
+  - [SourceReport](#sourcereport)
+  - [SourceReportCoverage](#sourcereportcoverage)
+  - [SourceReportKind](#sourcereportkind)
+  - [SourceReportRange](#sourcereportrange)
+  - [Stack](#stack)
+  - [StepOption](#stepoption)
+  - [Success](#success)
+  - [TypeArguments](#typearguments)
+  - [UresolvedSourceLocation](#unresolvedsourcelocation)
+  - [Version](#version)
+  - [VM](#vm)
 - [Revision History](#revision-history)
 
 ## RPCs, Requests, and Responses
@@ -670,6 +671,18 @@
 
 See [Success](#success).
 
+### kill
+
+```
+Success kill(string isolateId)
+```
+
+The _kill_ RPC is used to kill an isolate as if by dart:isolate's `Isolate.kill(IMMEDIATE)`.
+
+The isolate is killed regardless of whether it is paused or running.
+
+See [Success](#success).
+
 ### reloadSources
 
 
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index a15efee..9426433 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1,11 +1,8 @@
-Note: this dev version of the protocol contains not yet released functionality,
-and is subject to change.
-
-# Dart VM Service Protocol 3.8-dev
+# Dart VM Service Protocol 3.9-dev
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.8-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.9-dev_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -27,74 +24,75 @@
 - [Versioning](#versioning)
 - [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
 - [Public RPCs](#public-rpcs)
-	- [addBreakpoint](#addbreakpoint)
-	- [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
-	- [addBreakpointAtEntry](#addbreakpointatentry)
-	- [evaluate](#evaluate)
-	- [evaluateInFrame](#evaluateinframe)
-	- [getFlagList](#getflaglist)
-	- [getIsolate](#getisolate)
-	- [getObject](#getobject)
-	- [getSourceReport](#getsourcereport)
-	- [getStack](#getstack)
-	- [getVersion](#getversion)
-	- [getVM](#getvm)
-	- [pause](#pause)
-	- [reloadSources](#reloadsources)
-	- [removeBreakpoint](#removebreakpoint)
-	- [resume](#resume)
-	- [setExceptionPauseMode](#setexceptionpausemode)
-	- [setFlag](#setflag)
-	- [setLibraryDebuggable](#setlibrarydebuggable)
-	- [setName](#setname)
-	- [setVMName](#setvmname)
-	- [streamCancel](#streamcancel)
-	- [streamListen](#streamlisten)
+  - [addBreakpoint](#addbreakpoint)
+  - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
+  - [addBreakpointAtEntry](#addbreakpointatentry)
+  - [evaluate](#evaluate)
+  - [evaluateInFrame](#evaluateinframe)
+  - [getFlagList](#getflaglist)
+  - [getIsolate](#getisolate)
+  - [getObject](#getobject)
+  - [getSourceReport](#getsourcereport)
+  - [getStack](#getstack)
+  - [getVersion](#getversion)
+  - [getVM](#getvm)
+  - [pause](#pause)
+  - [kill](#kill)
+  - [reloadSources](#reloadsources)
+  - [removeBreakpoint](#removebreakpoint)
+  - [resume](#resume)
+  - [setExceptionPauseMode](#setexceptionpausemode)
+  - [setFlag](#setflag)
+  - [setLibraryDebuggable](#setlibrarydebuggable)
+  - [setName](#setname)
+  - [setVMName](#setvmname)
+  - [streamCancel](#streamcancel)
+  - [streamListen](#streamlisten)
 - [Public Types](#public-types)
-	- [BoundField](#boundfield)
-	- [BoundVariable](#boundvariable)
-	- [Breakpoint](#breakpoint)
-	- [Class](#class)
-	- [ClassList](#classlist)
-	- [Code](#code)
-	- [CodeKind](#codekind)
-	- [Context](#context)
-	- [ContextElement](#contextelement)
-	- [Error](#error)
-	- [ErrorKind](#errorkind)
-	- [Event](#event)
-	- [EventKind](#eventkind)
-	- [ExtensionData](#extensiondata)
-	- [Field](#field)
-	- [Flag](#flag)
-	- [FlagList](#flaglist)
-	- [Frame](#frame)
-	- [Function](#function)
-	- [Instance](#instance)
-	- [Isolate](#isolate)
-	- [Library](#library)
-	- [LibraryDependency](#librarydependency)
-	- [MapAssociation](#mapassociation)
-	- [Message](#message)
-	- [Null](#null)
-	- [Object](#object)
-	- [ReloadReport](#reloadreport)
-	- [Response](#response)
-	- [Sentinel](#sentinel)
-	- [SentinelKind](#sentinelkind)
-	- [Script](#script)
-	- [SourceLocation](#sourcelocation)
-	- [SourceReport](#sourcereport)
-	- [SourceReportCoverage](#sourcereportcoverage)
-	- [SourceReportKind](#sourcereportkind)
-	- [SourceReportRange](#sourcereportrange)
-	- [Stack](#stack)
-	- [StepOption](#stepoption)
-	- [Success](#success)
-	- [TypeArguments](#typearguments)
-	- [UresolvedSourceLocation](#unresolvedsourcelocation)
-	- [Version](#version)
-	- [VM](#vm)
+  - [BoundField](#boundfield)
+  - [BoundVariable](#boundvariable)
+  - [Breakpoint](#breakpoint)
+  - [Class](#class)
+  - [ClassList](#classlist)
+  - [Code](#code)
+  - [CodeKind](#codekind)
+  - [Context](#context)
+  - [ContextElement](#contextelement)
+  - [Error](#error)
+  - [ErrorKind](#errorkind)
+  - [Event](#event)
+  - [EventKind](#eventkind)
+  - [ExtensionData](#extensiondata)
+  - [Field](#field)
+  - [Flag](#flag)
+  - [FlagList](#flaglist)
+  - [Frame](#frame)
+  - [Function](#function)
+  - [Instance](#instance)
+  - [Isolate](#isolate)
+  - [Library](#library)
+  - [LibraryDependency](#librarydependency)
+  - [MapAssociation](#mapassociation)
+  - [Message](#message)
+  - [Null](#null)
+  - [Object](#object)
+  - [ReloadReport](#reloadreport)
+  - [Response](#response)
+  - [Sentinel](#sentinel)
+  - [SentinelKind](#sentinelkind)
+  - [Script](#script)
+  - [SourceLocation](#sourcelocation)
+  - [SourceReport](#sourcereport)
+  - [SourceReportCoverage](#sourcereportcoverage)
+  - [SourceReportKind](#sourcereportkind)
+  - [SourceReportRange](#sourcereportrange)
+  - [Stack](#stack)
+  - [StepOption](#stepoption)
+  - [Success](#success)
+  - [TypeArguments](#typearguments)
+  - [UresolvedSourceLocation](#unresolvedsourcelocation)
+  - [Version](#version)
+  - [VM](#vm)
 - [Revision History](#revision-history)
 
 ## RPCs, Requests, and Responses
@@ -673,6 +671,18 @@
 
 See [Success](#success).
 
+### kill
+
+```
+Success kill(string isolateId)
+```
+
+The _kill_ RPC is used to kill an isolate as if by dart:isolate's `Isolate.kill(IMMEDIATE)`.
+
+The isolate is killed regardless of whether it is paused or running.
+
+See [Success](#success).
+
 ### reloadSources
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 576e903..fdd9ee4 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -150,8 +150,10 @@
   V(CompleterSyncConstructor, "Completer.sync")                                \
   V(_AsyncAwaitCompleter, "_AsyncAwaitCompleter")                              \
   V(_AsyncAwaitCompleterConstructor, "_AsyncAwaitCompleter.")                  \
+  V(_AsyncAwaitCompleterStart, "_AsyncAwaitCompleter.start")                   \
   V(_AsyncAwaitStart, "start")                                                 \
   V(CompleterFuture, "future")                                                 \
+  V(CompleterGetFuture, "get:future")                                          \
   V(StreamIterator, "StreamIterator")                                          \
   V(StreamIteratorConstructor, "StreamIterator.")                              \
   V(Native, "native")                                                          \
@@ -171,6 +173,7 @@
   V(PatchClass, "PatchClass")                                                  \
   V(Function, "Function")                                                      \
   V(_Closure, "_Closure")                                                      \
+  V(_ClosureCall, "_Closure.call")                                             \
   V(FunctionResult, "function result")                                         \
   V(FactoryResult, "factory result")                                           \
   V(ClosureData, "ClosureData")                                                \
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 08becf9..bbf3561 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -232,7 +232,8 @@
                                          const char* source,
                                          const uint8_t** kernel_buffer,
                                          intptr_t* kernel_buffer_size,
-                                         bool incrementally) {
+                                         bool incrementally,
+                                         bool allow_compile_errors) {
   // clang-format off
   Dart_SourceFile sourcefiles[] = {
     {
@@ -244,7 +245,7 @@
   // clang-format on
   return CompileTestScriptWithDFE(
       url, sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
-      kernel_buffer, kernel_buffer_size, incrementally);
+      kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors);
 }
 
 #if 0
@@ -253,7 +254,8 @@
                                          int sourcefiles_count,
                                          Dart_SourceFile sourcefiles[],
                                          void** kernel_pgm,
-                                         bool incrementally) {
+                                         bool incrementally,
+                                         bool allow_compile_errors) {
   Zone* zone = Thread::Current()->zone();
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
       url, FLAG_strong ? platform_strong_dill : platform_dill,
@@ -265,13 +267,16 @@
 char* TestCase::ValidateCompilationResult(
     Zone* zone,
     Dart_KernelCompilationResult compilation_result,
-    void** kernel_pgm) {
-  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    void** kernel_pgm,
+    bool allow_compile_errors) {
+  if (!allow_compile_errors &&
+      (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
     char* result =
         OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
     free(compilation_result.error);
     return result;
   }
+
   const uint8_t* kernel_file = compilation_result.kernel;
   intptr_t kernel_length = compilation_result.kernel_size;
   if (kernel_file == NULL) {
@@ -282,6 +287,12 @@
   if (*kernel_pgm == NULL) {
     return OS::SCreate(zone, "Failed to read generated kernel binary");
   }
+  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    char* result =
+        OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
+    free(compilation_result.error);
+    return result;
+  }
   return NULL;
 }
 #endif
@@ -291,22 +302,25 @@
                                          Dart_SourceFile sourcefiles[],
                                          const uint8_t** kernel_buffer,
                                          intptr_t* kernel_buffer_size,
-                                         bool incrementally) {
+                                         bool incrementally,
+                                         bool allow_compile_errors) {
   Zone* zone = Thread::Current()->zone();
   Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
       url, FLAG_strong ? platform_strong_dill : platform_dill,
       FLAG_strong ? platform_strong_dill_size : platform_dill_size,
       sourcefiles_count, sourcefiles, incrementally, NULL);
   return ValidateCompilationResult(zone, compilation_result, kernel_buffer,
-                                   kernel_buffer_size);
+                                   kernel_buffer_size, allow_compile_errors);
 }
 
 char* TestCase::ValidateCompilationResult(
     Zone* zone,
     Dart_KernelCompilationResult compilation_result,
     const uint8_t** kernel_buffer,
-    intptr_t* kernel_buffer_size) {
-  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    intptr_t* kernel_buffer_size,
+    bool allow_compile_errors) {
+  if (!allow_compile_errors &&
+      (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
     char* result =
         OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
     free(compilation_result.error);
@@ -459,10 +473,19 @@
   return num_test_libs + 1;
 }
 
+Dart_Handle TestCase::LoadTestScriptWithErrors(
+    const char* script,
+    Dart_NativeEntryResolver resolver,
+    const char* lib_url,
+    bool finalize_classes) {
+  return LoadTestScript(script, resolver, lib_url, finalize_classes, true);
+}
+
 Dart_Handle TestCase::LoadTestScript(const char* script,
                                      Dart_NativeEntryResolver resolver,
                                      const char* lib_url,
-                                     bool finalize_classes) {
+                                     bool finalize_classes,
+                                     bool allow_compile_errors) {
   if (FLAG_use_dart_frontend) {
 #ifndef PRODUCT
     if (strstr(script, IsolateReloadTestLibUri()) != NULL) {
@@ -472,8 +495,9 @@
 #endif  // ifndef PRODUCT
     Dart_SourceFile* sourcefiles = NULL;
     intptr_t num_sources = BuildSourceFilesArray(&sourcefiles, script);
-    Dart_Handle result = LoadTestScriptWithDFE(num_sources, sourcefiles,
-                                               resolver, finalize_classes);
+    Dart_Handle result =
+        LoadTestScriptWithDFE(num_sources, sourcefiles, resolver,
+                              finalize_classes, true, allow_compile_errors);
     delete[] sourcefiles;
     return result;
   } else {
@@ -495,7 +519,7 @@
     char* error = TestCase::CompileTestScriptWithDFE(
         sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
         &kernel_buffer_size, true);
-    if (error != NULL) {
+    if ((kernel_buffer == NULL) && (error != NULL)) {
       return Dart_NewApiError(error);
     }
     Dart_Handle lib =
@@ -521,7 +545,8 @@
                                             Dart_SourceFile sourcefiles[],
                                             Dart_NativeEntryResolver resolver,
                                             bool finalize,
-                                            bool incrementally) {
+                                            bool incrementally,
+                                            bool allow_compile_errors) {
   // First script is the main script.
   Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
   EXPECT_VALID(result);
@@ -529,8 +554,8 @@
   intptr_t kernel_buffer_size = 0;
   char* error = TestCase::CompileTestScriptWithDFE(
       sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
-      &kernel_buffer_size, incrementally);
-  if (error != NULL) {
+      &kernel_buffer_size, incrementally, allow_compile_errors);
+  if ((kernel_buffer == NULL) && error != NULL) {
     return Dart_NewApiError(error);
   }
 
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index edb8b8e..d3f2870 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -318,17 +318,25 @@
                                         const char* source,
                                         const uint8_t** kernel_buffer,
                                         intptr_t* kernel_buffer_size,
-                                        bool incrementally = true);
+                                        bool incrementally = true,
+                                        bool allow_compile_errors = false);
   static char* CompileTestScriptWithDFE(const char* url,
                                         int sourcefiles_count,
                                         Dart_SourceFile sourcefiles[],
                                         const uint8_t** kernel_buffer,
                                         intptr_t* kernel_buffer_size,
-                                        bool incrementally = true);
+                                        bool incrementally = true,
+                                        bool allow_compile_errors = false);
   static Dart_Handle LoadTestScript(const char* script,
                                     Dart_NativeEntryResolver resolver,
                                     const char* lib_uri = USER_TEST_URI,
-                                    bool finalize = true);
+                                    bool finalize = true,
+                                    bool allow_compile_errors = false);
+  static Dart_Handle LoadTestScriptWithErrors(
+      const char* script,
+      Dart_NativeEntryResolver resolver = NULL,
+      const char* lib_uri = USER_TEST_URI,
+      bool finalize = true);
   static Dart_Handle LoadTestLibrary(const char* lib_uri,
                                      const char* script,
                                      Dart_NativeEntryResolver resolver = NULL);
@@ -337,7 +345,8 @@
       Dart_SourceFile sourcefiles[],
       Dart_NativeEntryResolver resolver = NULL,
       bool finalize = true,
-      bool incrementally = true);
+      bool incrementally = true,
+      bool allow_compile_errors = false);
   static Dart_Handle LoadCoreTestScript(const char* script,
                                         Dart_NativeEntryResolver resolver);
 
@@ -385,7 +394,8 @@
   static char* ValidateCompilationResult(Zone* zone,
                                          Dart_KernelCompilationResult result,
                                          const uint8_t** kernel_buffer,
-                                         intptr_t* kernel_buffer_size);
+                                         intptr_t* kernel_buffer_size,
+                                         bool allow_compile_errors);
 
   RunEntry* const run_;
 };
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index bad9306..49f4bcc 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -31,7 +31,7 @@
 
 case $0 in
   *_developer)
-    EXTRA_VM_OPTIONS+=('--checked')
+    EXTRA_VM_OPTIONS+=('--enable-asserts')
     ;;
 esac
 
@@ -47,4 +47,4 @@
 
 DEV_OPTIONS="--use-analysis-driver-memory-byte-store"
 
-exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
+exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index 464aaee..b4a1de2 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -24,7 +24,7 @@
 set EXTRA_VM_OPTIONS=
 
 if _%DARTANALYZER_DEVELOPER_MODE%_ == _1_ (
-  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --checked
+  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --enable_asserts
 )
 
 rem We allow extra vm options to be passed in through an environment variable.
@@ -40,7 +40,7 @@
 
 set ANALYZER=%DART_ROOT%\pkg\analyzer_cli\bin\analyzer.dart
 
-"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
+"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 28f37ab..90d09de 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -28,4 +28,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "$SNAPSHOT" "$SDK_ARG" "$@"
+exec "$DART" "--preview-dart-2" "$SNAPSHOT" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index ab66885..82125f0 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -22,7 +22,7 @@
 
 set SDK_ARG=--dart-sdk=%SDK_DIR%
 
-"%DART%" "%SNAPSHOT%" "%SDK_ARG%" %*
+"%DART%" "--preview-dart-2" "%SNAPSHOT%" "%SDK_ARG%" %*
 
 endlocal
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 44df4af..d6be639 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -829,6 +829,20 @@
 bool checkSubtypeOfRuntimeType(o, t) {
   if (o == null) return isSupertypeOfNull(t);
   if (isTopType(t)) return true;
+  if (JS_GET_FLAG('STRONG_MODE') &&
+      JS('bool', 'typeof # == "object"', t) &&
+      isDartFutureOrType(t)) {
+    // `o is FutureOr<T>` is equivalent to
+    //
+    //     o is T || o is Future<T>
+    //
+    // T might be a function type, requiring extracting the closure's signature,
+    // so do the `o is T` check here and let the `Future` interface type test
+    // fall through to the `isSubtype` check at the end of this function.
+    var tTypeArgument = getFutureOrArgument(t);
+    if (checkSubtypeOfRuntimeType(o, tTypeArgument)) return true;
+  }
+
   // Get the runtime type information from the object here, because we may
   // overwrite o with the interceptor below.
   var rti = getRuntimeTypeInfo(o);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1f622c4..c440394 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -101,6 +101,46 @@
 HtmlDocument get document =>
     JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
 
+// Supoort to convert JS Promise to a Dart Future.
+Future<T> promiseToFuture<T>(thePromise) {
+  var completer = new Completer<T>();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
+Future promiseToFutureMap(thePromise) {
+  var completer = new Completer();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
+Future<Map> promiseToFutureDictionary(thePromise) {
+  var completer = new Completer<Map>();
+
+  var thenSuccessCode = (promiseValue) =>
+      completer.complete(convertNativeToDart_Dictionary(promiseValue));
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
 @Native("HTMLElement")
@@ -129,7 +169,6 @@
 @Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
-
 // Copyright (c) 2012, 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.
@@ -1810,12 +1849,15 @@
   @DomName('BackgroundFetchManager.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String id) native;
+  Future<BackgroundFetchRegistration> get(String id) =>
+      promiseToFuture<BackgroundFetchRegistration>(
+          JS("", "#.get(#)", this, id));
 
   @DomName('BackgroundFetchManager.getIds')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getIds() native;
+  Future<List<String>> getIds() =>
+      promiseToFuture<List<String>>(JS("", "#.getIds()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1869,7 +1911,7 @@
   @DomName('BackgroundFetchRegistration.abort')
   @DocsEditable()
   @Experimental() // untriaged
-  Future abort() native;
+  Future<bool> abort() => promiseToFuture<bool>(JS("", "#.abort()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1932,7 +1974,8 @@
   @DomName('BackgroundFetchedEvent.updateUI')
   @DocsEditable()
   @Experimental() // untriaged
-  Future updateUI(String title) native;
+  Future updateUI(String title) =>
+      promiseToFuture(JS("", "#.updateUI(#)", this, title));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1978,7 +2021,9 @@
   @DomName('BarcodeDetector.detect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future detect(/*ImageBitmapSource*/ image) native;
+  Future<List<DetectedBarcode>> detect(/*ImageBitmapSource*/ image) =>
+      promiseToFuture<List<DetectedBarcode>>(
+          JS("", "#.detect(#)", this, image));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2090,7 +2135,7 @@
   @DomName('BeforeInstallPromptEvent.prompt')
   @DocsEditable()
   @Experimental() // untriaged
-  Future prompt() native;
+  Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2231,12 +2276,13 @@
   @DomName('BluetoothRemoteGATTDescriptor.readValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future readValue() native;
+  Future readValue() => promiseToFuture(JS("", "#.readValue()", this));
 
   @DomName('BluetoothRemoteGATTDescriptor.writeValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future writeValue(/*BufferSource*/ value) native;
+  Future writeValue(/*BufferSource*/ value) =>
+      promiseToFuture(JS("", "#.writeValue(#)", this, value));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2260,27 +2306,28 @@
   @DomName('Body.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Future arrayBuffer() native;
+  Future arrayBuffer() => promiseToFuture(JS("", "#.arrayBuffer()", this));
 
   @DomName('Body.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Future blob() native;
+  Future<Blob> blob() => promiseToFuture<Blob>(JS("", "#.blob()", this));
 
   @DomName('Body.formData')
   @DocsEditable()
   @Experimental() // untriaged
-  Future formData() native;
+  Future<FormData> formData() =>
+      promiseToFuture<FormData>(JS("", "#.formData()", this));
 
   @DomName('Body.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Future json() native;
+  Future json() => promiseToFuture(JS("", "#.json()", this));
 
   @DomName('Body.text')
   @DocsEditable()
   @Experimental() // untriaged
-  Future text() native;
+  Future<String> text() => promiseToFuture<String>(JS("", "#.text()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2719,17 +2766,19 @@
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String cacheName) native;
+  Future delete(String cacheName) =>
+      promiseToFuture(JS("", "#.delete(#)", this, cacheName));
 
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String cacheName) native;
+  Future has(String cacheName) =>
+      promiseToFuture(JS("", "#.has(#)", this, cacheName));
 
   @DomName('CacheStorage.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() native;
+  Future keys() => promiseToFuture(JS("", "#.keys()", this));
 
   @DomName('CacheStorage.match')
   @DocsEditable()
@@ -2756,7 +2805,8 @@
   @DomName('CacheStorage.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open(String cacheName) native;
+  Future open(String cacheName) =>
+      promiseToFuture(JS("", "#.open(#)", this, cacheName));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -4031,12 +4081,12 @@
   @DomName('Clients.claim')
   @DocsEditable()
   @Experimental() // untriaged
-  Future claim() native;
+  Future claim() => promiseToFuture(JS("", "#.claim()", this));
 
   @DomName('Clients.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String id) native;
+  Future get(String id) => promiseToFuture(JS("", "#.get(#)", this, id));
 
   @DomName('Clients.matchAll')
   @DocsEditable()
@@ -4063,7 +4113,8 @@
   @DomName('Clients.openWindow')
   @DocsEditable()
   @Experimental() // untriaged
-  Future openWindow(String url) native;
+  Future<WindowClient> openWindow(String url) =>
+      promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -4457,17 +4508,20 @@
   @DomName('CredentialsContainer.preventSilentAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  Future preventSilentAccess() native;
+  Future preventSilentAccess() =>
+      promiseToFuture(JS("", "#.preventSilentAccess()", this));
 
   @DomName('CredentialsContainer.requireUserMediation')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requireUserMediation() native;
+  Future requireUserMediation() =>
+      promiseToFuture(JS("", "#.requireUserMediation()", this));
 
   @DomName('CredentialsContainer.store')
   @DocsEditable()
   @Experimental() // untriaged
-  Future store(Credential credential) native;
+  Future store(Credential credential) =>
+      promiseToFuture(JS("", "#.store(#)", this, credential));
 }
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -10270,7 +10324,8 @@
   @DomName('CustomElementRegistry.whenDefined')
   @DocsEditable()
   @Experimental() // untriaged
-  Future whenDefined(String name) native;
+  Future whenDefined(String name) =>
+      promiseToFuture(JS("", "#.whenDefined(#)", this, name));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -19259,7 +19314,8 @@
   @DomName('FaceDetector.detect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future detect(/*ImageBitmapSource*/ image) native;
+  Future<List<DetectedFace>> detect(/*ImageBitmapSource*/ image) =>
+      promiseToFuture<List<DetectedFace>>(JS("", "#.detect(#)", this, image));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -20099,7 +20155,8 @@
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load() native;
+  Future<FontFace> load() =>
+      promiseToFuture<FontFace>(JS("", "#.load()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -23312,17 +23369,21 @@
   @DomName('ImageCapture.getPhotoCapabilities')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getPhotoCapabilities() native;
+  Future<PhotoCapabilities> getPhotoCapabilities() =>
+      promiseToFuture<PhotoCapabilities>(
+          JS("", "#.getPhotoCapabilities()", this));
 
   @DomName('ImageCapture.getPhotoSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getPhotoSettings() native;
+  Future<Map> getPhotoSettings() =>
+      promiseToFutureDictionary(JS("", "#.getPhotoSettings()", this));
 
   @DomName('ImageCapture.grabFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  Future grabFrame() native;
+  Future<ImageBitmap> grabFrame() =>
+      promiseToFuture<ImageBitmap>(JS("", "#.grabFrame()", this));
 
   @DomName('ImageCapture.setOptions')
   @DocsEditable()
@@ -23504,7 +23565,7 @@
   @DomName('HTMLImageElement.decode')
   @DocsEditable()
   @Experimental() // untriaged
-  Future decode() native;
+  Future decode() => promiseToFuture(JS("", "#.decode()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25360,7 +25421,9 @@
   @DomName('MediaDevices.enumerateDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future enumerateDevices() native;
+  Future<List<MediaDeviceInfo>> enumerateDevices() =>
+      promiseToFuture<List<MediaDeviceInfo>>(
+          JS("", "#.enumerateDevices()", this));
 
   @DomName('MediaDevices.getSupportedConstraints')
   @DocsEditable()
@@ -25615,17 +25678,19 @@
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  Future play() native;
+  Future play() => promiseToFuture(JS("", "#.play()", this));
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setMediaKeys(MediaKeys mediaKeys) native;
+  Future setMediaKeys(MediaKeys mediaKeys) =>
+      promiseToFuture(JS("", "#.setMediaKeys(#)", this, mediaKeys));
 
   @DomName('HTMLMediaElement.setSinkId')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setSinkId(String sinkId) native;
+  Future setSinkId(String sinkId) =>
+      promiseToFuture(JS("", "#.setSinkId(#)", this, sinkId));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25785,22 +25850,25 @@
 
   @DomName('MediaKeySession.close')
   @DocsEditable()
-  Future close() native;
+  Future close() => promiseToFuture(JS("", "#.close()", this));
 
   @DomName('MediaKeySession.generateRequest')
   @DocsEditable()
   @Experimental() // untriaged
-  Future generateRequest(String initDataType, /*BufferSource*/ initData) native;
+  Future generateRequest(String initDataType, /*BufferSource*/ initData) =>
+      promiseToFuture(
+          JS("", "#.generateRequest(#, #)", this, initDataType, initData));
 
   @DomName('MediaKeySession.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load(String sessionId) native;
+  Future load(String sessionId) =>
+      promiseToFuture(JS("", "#.load(#)", this, sessionId));
 
   @DomName('MediaKeySession.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  Future remove() native;
+  Future remove() => promiseToFuture(JS("", "#.remove()", this));
 
   @JSName('update')
   @DomName('MediaKeySession.update')
@@ -25863,7 +25931,8 @@
   @DomName('MediaKeySystemAccess.createMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future createMediaKeys() native;
+  Future createMediaKeys() =>
+      promiseToFuture(JS("", "#.createMediaKeys()", this));
 
   @DomName('MediaKeySystemAccess.getConfiguration')
   @DocsEditable()
@@ -25901,12 +25970,15 @@
   @DomName('MediaKeys.getStatusForPolicy')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getStatusForPolicy(MediaKeysPolicy policy) native;
+  Future getStatusForPolicy(MediaKeysPolicy policy) =>
+      promiseToFuture(JS("", "#.getStatusForPolicy(#)", this, policy));
 
   @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setServerCertificate(/*BufferSource*/ serverCertificate) native;
+  Future setServerCertificate(/*BufferSource*/ serverCertificate) =>
+      promiseToFuture(
+          JS("", "#.setServerCertificate(#)", this, serverCertificate));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27241,11 +27313,68 @@
 @DomName('MIDIInputMap')
 @Experimental() // untriaged
 @Native("MIDIInputMap")
-class MidiInputMap extends Interceptor {
+class MidiInputMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory MidiInputMap._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27307,11 +27436,68 @@
 @DomName('MIDIOutputMap')
 @Experimental() // untriaged
 @Native("MIDIOutputMap")
-class MidiOutputMap extends Interceptor {
+class MidiOutputMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory MidiOutputMap._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27361,12 +27547,12 @@
   @DomName('MIDIPort.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() native;
+  Future close() => promiseToFuture(JS("", "#.close()", this));
 
   @DomName('MIDIPort.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open() native;
+  Future open() => promiseToFuture(JS("", "#.open()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28057,17 +28243,18 @@
   @DomName('NavigationPreloadManager.disable')
   @DocsEditable()
   @Experimental() // untriaged
-  Future disable() native;
+  Future disable() => promiseToFuture(JS("", "#.disable()", this));
 
   @DomName('NavigationPreloadManager.enable')
   @DocsEditable()
   @Experimental() // untriaged
-  Future enable() native;
+  Future enable() => promiseToFuture(JS("", "#.enable()", this));
 
   @DomName('NavigationPreloadManager.getState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getState() native;
+  Future<Map> getState() =>
+      promiseToFutureDictionary(JS("", "#.getState()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -28307,7 +28494,7 @@
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBattery() native;
+  Future getBattery() => promiseToFuture(JS("", "#.getBattery()", this));
 
   @JSName('getGamepads')
   @DomName('Navigator.getGamepads')
@@ -28320,12 +28507,14 @@
   @DomName('Navigator.getInstalledRelatedApps')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getInstalledRelatedApps() native;
+  Future<RelatedApplication> getInstalledRelatedApps() =>
+      promiseToFuture<RelatedApplication>(
+          JS("", "#.getInstalledRelatedApps()", this));
 
   @DomName('Navigator.getVRDisplays')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getVRDisplays() native;
+  Future getVRDisplays() => promiseToFuture(JS("", "#.getVRDisplays()", this));
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
@@ -28380,7 +28569,9 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future requestMediaKeySystemAccess(
-      String keySystem, List<Map> supportedConfigurations) native;
+          String keySystem, List<Map> supportedConfigurations) =>
+      promiseToFuture(JS("", "#.requestMediaKeySystemAccess(#, #)", this,
+          keySystem, supportedConfigurations));
 
   @DomName('Navigator.sendBeacon')
   @DocsEditable()
@@ -30139,7 +30330,7 @@
   @DomName('OffscreenCanvasRenderingContext2D.commit')
   @DocsEditable()
   @Experimental() // untriaged
-  Future commit() native;
+  Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
   @DomName('OffscreenCanvasRenderingContext2D.createImageData')
   @DocsEditable()
@@ -31380,27 +31571,31 @@
   @DomName('PaymentInstruments.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  Future clear() native;
+  Future clear() => promiseToFuture(JS("", "#.clear()", this));
 
   @DomName('PaymentInstruments.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String instrumentKey) native;
+  Future<bool> delete(String instrumentKey) =>
+      promiseToFuture<bool>(JS("", "#.delete(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String instrumentKey) native;
+  Future<Map> get(String instrumentKey) =>
+      promiseToFutureDictionary(JS("", "#.get(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String instrumentKey) native;
+  Future has(String instrumentKey) =>
+      promiseToFuture(JS("", "#.has(#)", this, instrumentKey));
 
   @DomName('PaymentInstruments.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() native;
+  Future<List<String>> keys() =>
+      promiseToFuture<List<String>>(JS("", "#.keys()", this));
 
   @DomName('PaymentInstruments.set')
   @DocsEditable()
@@ -31500,17 +31695,19 @@
   @DomName('PaymentRequest.abort')
   @DocsEditable()
   @Experimental() // untriaged
-  Future abort() native;
+  Future abort() => promiseToFuture(JS("", "#.abort()", this));
 
   @DomName('PaymentRequest.canMakePayment')
   @DocsEditable()
   @Experimental() // untriaged
-  Future canMakePayment() native;
+  Future<bool> canMakePayment() =>
+      promiseToFuture<bool>(JS("", "#.canMakePayment()", this));
 
   @DomName('PaymentRequest.show')
   @DocsEditable()
   @Experimental() // untriaged
-  Future show() native;
+  Future<PaymentResponse> show() =>
+      promiseToFuture<PaymentResponse>(JS("", "#.show()", this));
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31577,7 +31774,8 @@
   @DomName('PaymentRequestEvent.openWindow')
   @DocsEditable()
   @Experimental() // untriaged
-  Future openWindow(String url) native;
+  Future<WindowClient> openWindow(String url) =>
+      promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
 
   @DomName('PaymentRequestEvent.respondWith')
   @DocsEditable()
@@ -31677,7 +31875,8 @@
   @DomName('PaymentResponse.complete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future complete([String paymentResult]) native;
+  Future complete([String paymentResult]) =>
+      promiseToFuture(JS("", "#.complete(#)", this, paymentResult));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -32347,7 +32546,9 @@
   @DomName('Permissions.requestAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestAll(List<Map> permissions) native;
+  Future<PermissionStatus> requestAll(List<Map> permissions) =>
+      promiseToFuture<PermissionStatus>(
+          JS("", "#.requestAll(#)", this, permissions));
 
   @DomName('Permissions.revoke')
   @DocsEditable()
@@ -32984,17 +33185,22 @@
   @DomName('PresentationRequest.getAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getAvailability() native;
+  Future<PresentationAvailability> getAvailability() =>
+      promiseToFuture<PresentationAvailability>(
+          JS("", "#.getAvailability()", this));
 
   @DomName('PresentationRequest.reconnect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future reconnect(String id) native;
+  Future<PresentationConnection> reconnect(String id) =>
+      promiseToFuture<PresentationConnection>(
+          JS("", "#.reconnect(#)", this, id));
 
   @DomName('PresentationRequest.start')
   @DocsEditable()
   @Experimental() // untriaged
-  Future start() native;
+  Future<PresentationConnection> start() =>
+      promiseToFuture<PresentationConnection>(JS("", "#.start()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33221,7 +33427,8 @@
   @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getSubscription() native;
+  Future<PushSubscription> getSubscription() =>
+      promiseToFuture<PushSubscription>(JS("", "#.getSubscription()", this));
 
   @DomName('PushManager.permissionState')
   @DocsEditable()
@@ -33338,7 +33545,8 @@
   @DomName('PushSubscription.unsubscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unsubscribe() native;
+  Future<bool> unsubscribe() =>
+      promiseToFuture<bool>(JS("", "#.unsubscribe()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -33687,17 +33895,19 @@
   @DomName('RemotePlayback.cancelWatchAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancelWatchAvailability([int id]) native;
+  Future cancelWatchAvailability([int id]) =>
+      promiseToFuture(JS("", "#.cancelWatchAvailability(#)", this, id));
 
   @DomName('RemotePlayback.prompt')
   @DocsEditable()
   @Experimental() // untriaged
-  Future prompt() native;
+  Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
 
   @DomName('RemotePlayback.watchAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future watchAvailability(RemotePlaybackAvailabilityCallback callback) native;
+  Future<int> watchAvailability(RemotePlaybackAvailabilityCallback callback) =>
+      promiseToFuture<int>(JS("", "#.watchAvailability(#)", this, callback));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -34301,15 +34511,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.getStats')
-  Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
-    var completer = new Completer<RtcStatsResponse>();
-    _getStats((value) {
-      completer.complete(value);
-    }, selector);
-    return completer.future;
-  }
-
   @DomName('RTCPeerConnection.generateCertificate')
   @DocsEditable()
   @Experimental() // untriaged
@@ -34422,8 +34623,10 @@
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
   Future addIceCandidate(Object candidate,
-      [VoidCallback successCallback,
-      RtcPeerConnectionErrorCallback failureCallback]) native;
+          [VoidCallback successCallback,
+          RtcPeerConnectionErrorCallback failureCallback]) =>
+      promiseToFuture(JS("", "#.addIceCandidate(#, #, #)", this, candidate,
+          successCallback, failureCallback));
 
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
@@ -34601,11 +34804,9 @@
   @Experimental() // untriaged
   List<RtcRtpSender> getSenders() native;
 
-  @JSName('getStats')
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  Future _getStats(
-      [RtcStatsCallback successCallback, MediaStreamTrack selector]) native;
+  Future getStats() => promiseToFutureMap(JS("", "#.getStats()", this));
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
@@ -34876,11 +35077,68 @@
 // http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
 @Experimental()
 @Native("RTCStatsReport")
-class RtcStatsReport extends Interceptor {
+class RtcStatsReport extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory RtcStatsReport._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -35043,7 +35301,8 @@
   @DomName('ScreenOrientation.lock')
   @DocsEditable()
   @Experimental() // untriaged
-  Future lock(String orientation) native;
+  Future lock(String orientation) =>
+      promiseToFuture(JS("", "#.lock(#)", this, orientation));
 
   @DomName('ScreenOrientation.unlock')
   @DocsEditable()
@@ -35771,12 +36030,16 @@
   @DomName('ServiceWorkerContainer.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration([String documentURL]) native;
+  Future<ServiceWorkerRegistration> getRegistration([String documentURL]) =>
+      promiseToFuture<ServiceWorkerRegistration>(
+          JS("", "#.getRegistration(#)", this, documentURL));
 
   @DomName('ServiceWorkerContainer.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() native;
+  Future<List<ServiceWorkerRegistration>> getRegistrations() =>
+      promiseToFuture<List<ServiceWorkerRegistration>>(
+          JS("", "#.getRegistrations()", this));
 
   @DomName('ServiceWorkerContainer.register')
   @DocsEditable()
@@ -35862,7 +36125,7 @@
   @DomName('ServiceWorkerGlobalScope.skipWaiting')
   @DocsEditable()
   @Experimental() // untriaged
-  Future skipWaiting() native;
+  Future skipWaiting() => promiseToFuture(JS("", "#.skipWaiting()", this));
 
   @DomName('ServiceWorkerGlobalScope.onactivate')
   @DocsEditable()
@@ -35996,12 +36259,13 @@
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() native;
+  Future<bool> unregister() =>
+      promiseToFuture<bool>(JS("", "#.unregister()", this));
 
   @DomName('ServiceWorkerRegistration.update')
   @DocsEditable()
   @Experimental() // untriaged
-  Future update() native;
+  Future update() => promiseToFuture(JS("", "#.update()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37639,17 +37903,19 @@
   @DomName('StorageManager.estimate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future estimate() native;
+  Future<Map> estimate() =>
+      promiseToFutureDictionary(JS("", "#.estimate()", this));
 
   @DomName('StorageManager.persist')
   @DocsEditable()
   @Experimental() // untriaged
-  Future persist() native;
+  Future<bool> persist() => promiseToFuture<bool>(JS("", "#.persist()", this));
 
   @DomName('StorageManager.persisted')
   @DocsEditable()
   @Experimental() // untriaged
-  Future persisted() native;
+  Future<bool> persisted() =>
+      promiseToFuture<bool>(JS("", "#.persisted()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37892,12 +38158,14 @@
   @DomName('SyncManager.getTags')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getTags() native;
+  Future<List<String>> getTags() =>
+      promiseToFuture<List<String>>(JS("", "#.getTags()", this));
 
   @DomName('SyncManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future register(String tag) native;
+  Future register(String tag) =>
+      promiseToFuture(JS("", "#.register(#)", this, tag));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -38591,7 +38859,8 @@
   @DomName('TextDetector.detect')
   @DocsEditable()
   @Experimental() // untriaged
-  Future detect(/*ImageBitmapSource*/ image) native;
+  Future<List<DetectedText>> detect(/*ImageBitmapSource*/ image) =>
+      promiseToFuture<List<DetectedText>>(JS("", "#.detect(#)", this, image));
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -39863,7 +40132,8 @@
   @DomName('UnderlyingSourceBase.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel(Object reason) native;
+  Future cancel(Object reason) =>
+      promiseToFuture(JS("", "#.cancel(#)", this, reason));
 
   @DomName('UnderlyingSourceBase.notifyLockAcquired')
   @DocsEditable()
@@ -39878,12 +40148,13 @@
   @DomName('UnderlyingSourceBase.pull')
   @DocsEditable()
   @Experimental() // untriaged
-  Future pull() native;
+  Future pull() => promiseToFuture(JS("", "#.pull()", this));
 
   @DomName('UnderlyingSourceBase.start')
   @DocsEditable()
   @Experimental() // untriaged
-  Future start(Object stream) native;
+  Future start(Object stream) =>
+      promiseToFuture(JS("", "#.start(#)", this, stream));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40107,7 +40378,7 @@
   @DomName('VR.getDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getDevices() native;
+  Future getDevices() => promiseToFuture(JS("", "#.getDevices()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -40281,7 +40552,7 @@
   @DomName('VRDisplay.exitPresent')
   @DocsEditable()
   @Experimental() // untriaged
-  Future exitPresent() native;
+  Future exitPresent() => promiseToFuture(JS("", "#.exitPresent()", this));
 
   @DomName('VRDisplay.getEyeParameters')
   @DocsEditable()
@@ -40306,7 +40577,8 @@
   @DomName('VRDisplay.requestPresent')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPresent(List<Map> layers) native;
+  Future requestPresent(List<Map> layers) =>
+      promiseToFuture(JS("", "#.requestPresent(#)", this, layers));
 
   @DomName('VRDisplay.submitFrame')
   @DocsEditable()
@@ -40577,7 +40849,7 @@
   @DomName('VRSession.end')
   @DocsEditable()
   @Experimental() // untriaged
-  Future end() native;
+  Future end() => promiseToFuture(JS("", "#.end()", this));
 
   @DomName('VRSession.requestFrameOfReference')
   @DocsEditable()
@@ -43905,12 +44177,14 @@
   @DomName('WindowClient.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  Future focus() native;
+  Future<WindowClient> focus() =>
+      promiseToFuture<WindowClient>(JS("", "#.focus()", this));
 
   @DomName('WindowClient.navigate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future navigate(String url) native;
+  Future<WindowClient> navigate(String url) =>
+      promiseToFuture<WindowClient>(JS("", "#.navigate(#)", this, url));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -44787,17 +45061,20 @@
   @DomName('BudgetService.getBudget')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBudget() native;
+  Future<BudgetState> getBudget() =>
+      promiseToFuture<BudgetState>(JS("", "#.getBudget()", this));
 
   @DomName('BudgetService.getCost')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getCost(String operation) native;
+  Future<double> getCost(String operation) =>
+      promiseToFuture<double>(JS("", "#.getCost(#)", this, operation));
 
   @DomName('BudgetService.reserve')
   @DocsEditable()
   @Experimental() // untriaged
-  Future reserve(String operation) native;
+  Future<bool> reserve(String operation) =>
+      promiseToFuture<bool>(JS("", "#.reserve(#)", this, operation));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -44842,22 +45119,26 @@
   @DomName('Clipboard.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future read() native;
+  Future<DataTransfer> read() =>
+      promiseToFuture<DataTransfer>(JS("", "#.read()", this));
 
   @DomName('Clipboard.readText')
   @DocsEditable()
   @Experimental() // untriaged
-  Future readText() native;
+  Future<String> readText() =>
+      promiseToFuture<String>(JS("", "#.readText()", this));
 
   @DomName('Clipboard.write')
   @DocsEditable()
   @Experimental() // untriaged
-  Future write(DataTransfer data) native;
+  Future write(DataTransfer data) =>
+      promiseToFuture(JS("", "#.write(#)", this, data));
 
   @DomName('Clipboard.writeText')
   @DocsEditable()
   @Experimental() // untriaged
-  Future writeText(String data) native;
+  Future writeText(String data) =>
+      promiseToFuture(JS("", "#.writeText(#)", this, data));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/internal/async_cast.dart b/sdk/lib/internal/async_cast.dart
index eb59a7d..eee09b9 100644
--- a/sdk/lib/internal/async_cast.dart
+++ b/sdk/lib/internal/async_cast.dart
@@ -32,7 +32,8 @@
   Future cancel() => _source.cancel();
 
   void onData(void handleData(T data)) {
-    _source.onData((S data) => handleData(data as T));
+    _source
+        .onData(handleData == null ? null : (S data) => handleData(data as T));
   }
 
   void onError(Function handleError) {
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 16ba803..23c0a70 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -2683,7 +2683,7 @@
   @DomName('SVGImageElement.decode')
   @DocsEditable()
   @Experimental() // untriaged
-  Future decode() native;
+  Future decode() => promiseToFuture(JS("", "#.decode()", this));
 
   // From SVGURIReference
 
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index c927559..c12fe76 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -240,7 +240,7 @@
   @DomName('AudioContext.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() native;
+  Future close() => promiseToFuture(JS("", "#.close()", this));
 
   @DomName('AudioContext.getOutputTimestamp')
   @DocsEditable()
@@ -258,7 +258,7 @@
   @DomName('AudioContext.suspend')
   @DocsEditable()
   @Experimental() // untriaged
-  Future suspend() native;
+  Future suspend() => promiseToFuture(JS("", "#.suspend()", this));
 
   factory AudioContext() => JS('AudioContext',
       'new (window.AudioContext || window.webkitAudioContext)()');
@@ -534,11 +534,68 @@
 @DomName('AudioParamMap')
 @Experimental() // untriaged
 @Native("AudioParamMap")
-class AudioParamMap extends Interceptor {
+class AudioParamMap extends Interceptor with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory AudioParamMap._() {
     throw new UnsupportedError("Not supported");
   }
+
+  Map _getItem(String key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<String, dynamic> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue(dynamic value) => values.any((e) => e == value);
+
+  bool containsKey(dynamic key) => _getItem(key) != null;
+
+  Map operator [](dynamic key) => _getItem(key);
+
+  void forEach(void f(String key, dynamic value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('String', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<String> get keys {
+    final keys = <String>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=(String key, dynamic value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  String remove(dynamic key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -955,14 +1012,16 @@
   @DomName('BaseAudioContext.decodeAudioData')
   @DocsEditable()
   @Experimental() // untriaged
-  Future decodeAudioData(ByteBuffer audioData,
-      [DecodeSuccessCallback successCallback,
-      DecodeErrorCallback errorCallback]) native;
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
+          [DecodeSuccessCallback successCallback,
+          DecodeErrorCallback errorCallback]) =>
+      promiseToFuture<AudioBuffer>(JS("", "#.decodeAudioData(#, #, #)", this,
+          audioData, successCallback, errorCallback));
 
   @DomName('BaseAudioContext.resume')
   @DocsEditable()
   @Experimental() // untriaged
-  Future resume() native;
+  Future resume() => promiseToFuture(JS("", "#.resume()", this));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1481,13 +1540,15 @@
   @DomName('OfflineAudioContext.startRendering')
   @DocsEditable()
   @Experimental() // untriaged
-  Future startRendering() native;
+  Future<AudioBuffer> startRendering() =>
+      promiseToFuture<AudioBuffer>(JS("", "#.startRendering()", this));
 
   @JSName('suspend')
   @DomName('OfflineAudioContext.suspend')
   @DocsEditable()
   @Experimental() // untriaged
-  Future suspendFor(num suspendTime) native;
+  Future suspendFor(num suspendTime) =>
+      promiseToFuture(JS("", "#.suspendFor(#)", this, suspendTime));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 657d0a8..b3d8ba3 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -1387,7 +1387,9 @@
   @DocsEditable()
   @Experimental() // untriaged
   Future getBufferSubDataAsync(int target, int srcByteOffset, TypedData dstData,
-      [int dstOffset, int length]) native;
+          [int dstOffset, int length]) =>
+      promiseToFuture(JS("", "#.getBufferSubDataAsync(#, #, #, #, #)", this,
+          target, srcByteOffset, dstData, dstOffset, length));
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2895,7 +2897,7 @@
   @DomName('WebGLRenderingContext.commit')
   @DocsEditable()
   @Experimental() // untriaged
-  Future commit() native;
+  Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
@@ -6709,7 +6711,7 @@
   @DomName('WebGL2RenderingContext.commit')
   @DocsEditable()
   @Experimental() // untriaged
-  Future commit() native;
+  Future commit() => promiseToFuture(JS("", "#.commit()", this));
 
   @DomName('WebGL2RenderingContext.compileShader')
   @DocsEditable()
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index d758bc1..5efb0e9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -160,6 +160,10 @@
 LibTest/core/List/sort_A01_t06: Slow, Pass # Slow tests that needs extra time to finish.
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # Expected to fail because double.INFINITY is int.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # Expected to fail because double.NEGATIVE_INFINITY is int.
+LibTest/core/double/operator_addition_A01_t06: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_addition_A01_t08: Crash # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_subtraction_A01_t06: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_subtraction_A01_t09: Crash # Large integer literal. Not valid dart 2.
 LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
 LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
 LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
@@ -170,8 +174,13 @@
 LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/int/operator_multiplication_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
 LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_remainder_A01_t02: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
+LibTest/core/int/operator_subtraction_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/int/operator_truncating_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
 LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
 LibTest/html/Element/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
 LibTest/html/Element/queryAll_A01_t01: RuntimeError # See issue 143
@@ -7076,6 +7085,7 @@
 Language/Classes/Constructors/Generative_Constructors/execution_t06: Crash
 Language/Classes/Constructors/Generative_Constructors/execution_t07: Crash
 Language/Classes/Constructors/Generative_Constructors/execution_t12: Crash
+Language/Classes/Constructors/Generative_Constructors/initializers_t12: Crash # Issue 33157
 Language/Classes/Constructors/Generative_Constructors/redirection_t03: Crash
 Language/Classes/Constructors/Generative_Constructors/redirection_t07: Crash
 Language/Classes/Constructors/Generative_Constructors/redirection_t08: Crash
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index a51bd7c..8bfe28e 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions= --no_limit_ints_to_64_bits
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
@@ -14,7 +13,8 @@
   'main.dart': '''
         main() {
           print(12300000);
-          print(1234567890123456789012345);
+          // TODO(efortuna): Uncomment below when issue 33160 is fixed.
+          // print(0xffffffff00000000);
           print(double.maxFinite);
           print(-22230000);
         }'''
@@ -44,7 +44,9 @@
     Expect.isTrue(jsOutput.contains('12300000'));
     Expect.isTrue(jsOutput.contains('-22230000'));
   }
-  Expect.isTrue(jsOutput.contains('12345678901234568e8'));
+  // TODO(efortuna): Uncomment when issue 33160 is fixed.
+  //Expect.isTrue(jsOutput.contains('18446744069414584e3'));
+  //Expect.isFalse(jsOutput.contains('-4294967296'));
   Expect.isTrue(jsOutput.contains('17976931348623157e292'));
   Expect.isFalse(jsOutput.contains('1234567890123456789012345'));
   // The decimal expansion of double.maxFinite has 308 digits. We only check
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index be9df0f..774fd9a 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -8,7 +8,7 @@
 import "package:compiler/src/types/abstract_value_domain.dart";
 import "package:compiler/src/js_backend/constant_system_javascript.dart";
 
-ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
+ValueRangeInfo info = new ValueRangeInfo(JavaScriptConstantSystem.only);
 
 class AbstractValueDomainMock implements AbstractValueDomain {
   const AbstractValueDomainMock();
@@ -27,7 +27,7 @@
 Range createSingleRange(Value value) => info.newNormalizedRange(value, value);
 
 Range createSingleIntRange(int value) {
-  return createSingleRange(info.newIntValue(value));
+  return createSingleRange(info.newIntValue(new BigInt.from(value)));
 }
 
 Range createSingleInstructionRange() => createSingleRange(instructionValue);
@@ -35,16 +35,18 @@
 Range createSingleLengthRange() => createSingleRange(lengthValue);
 
 Range createIntRange(int lower, int upper) {
-  return info.newNormalizedRange(
-      info.newIntValue(lower), info.newIntValue(upper));
+  return info.newNormalizedRange(info.newIntValue(new BigInt.from(lower)),
+      info.newIntValue(new BigInt.from(upper)));
 }
 
 Range createLengthRange(int lower) {
-  return info.newNormalizedRange(info.newIntValue(lower), lengthValue);
+  return info.newNormalizedRange(
+      info.newIntValue(new BigInt.from(lower)), lengthValue);
 }
 
 Range createInstructionRange(int lower) {
-  return info.newNormalizedRange(info.newIntValue(lower), instructionValue);
+  return info.newNormalizedRange(
+      info.newIntValue(new BigInt.from(lower)), instructionValue);
 }
 
 Range instruction = createSingleInstructionRange();
@@ -60,8 +62,8 @@
 Range _0_instruction = createInstructionRange(0);
 
 checkAndRange(Range one, Range two, lower, upper) {
-  if (lower is num) lower = info.newIntValue(lower);
-  if (upper is num) upper = info.newIntValue(upper);
+  if (lower is num) lower = info.newIntValue(new BigInt.from(lower));
+  if (upper is num) upper = info.newIntValue(new BigInt.from(upper));
   Range range = info.newNormalizedRange(lower, upper);
   Expect.equals(range, one & two);
 }
@@ -89,12 +91,12 @@
   if (lower == null) {
     lower = buildBound(one.lower, two.upper);
   } else if (lower is num) {
-    lower = info.newIntValue(lower);
+    lower = info.newIntValue(new BigInt.from(lower));
   }
   if (upper == null) {
     upper = buildBound(one.upper, two.lower);
   } else if (upper is num) {
-    upper = info.newIntValue(upper);
+    upper = info.newIntValue(new BigInt.from(upper));
   }
 
   Expect.equals(info.newNormalizedRange(lower, upper), one - two);
@@ -106,14 +108,14 @@
   } else {
     Value low, up;
     if (arg1 is num) {
-      low = info.newIntValue(arg1);
+      low = info.newIntValue(new BigInt.from(arg1));
     } else if (arg1 == null) {
       low = info.newNegateValue(range.upper);
     } else {
       low = arg1;
     }
     if (arg2 is num) {
-      up = info.newIntValue(arg2);
+      up = info.newIntValue(new BigInt.from(arg2));
     } else if (arg2 == null) {
       up = info.newNegateValue(range.lower);
     } else {
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index 5d0aa37..05d5194 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_test.dart
@@ -29,12 +29,12 @@
     FieldEntity field1 = env.elementEnvironment.lookupClassMember(C, 'field1');
     FieldEntity field2 = env.elementEnvironment.lookupClassMember(C, 'field2');
     ConstructedConstantValue value1 = new ConstructedConstantValue(C_raw, {
-      field1: new IntConstantValue(0),
-      field2: new IntConstantValue(1),
+      field1: new IntConstantValue(BigInt.zero),
+      field2: new IntConstantValue(BigInt.one),
     });
     ConstantValue value2 = new ConstructedConstantValue(C_raw, {
-      field2: new IntConstantValue(1),
-      field1: new IntConstantValue(0),
+      field2: new IntConstantValue(BigInt.one),
+      field1: new IntConstantValue(BigInt.zero),
     });
     Expect.equals(value1.hashCode, value2.hashCode, "Hashcode mismatch.");
     Expect.equals(value1, value2, "Value mismatch.");
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
index 0ca8e55..13e5ecd 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -10,6 +10,6 @@
 }
 
 @NoInline()
-test() async /*2:test*/ /*kernel.3:test*/ {
+test() async /*2:test*/ {
   /*4:test*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index cf570ba..49c7a18 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -10,12 +10,12 @@
 }
 
 @NoInline()
-test1() async /*3:test1*/ /*kernel.4:test1*/ {
+test1() async /*3:test1*/ {
   // This call is on the stack when the error is thrown.
   await /*5:test1*/ test2();
 }
 
 @NoInline()
-test2() async /*7:test2*/ /*kernel.8:test2*/ {
+test2() async /*7:test2*/ {
   /*9:test2*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
index a12eaa6..5889055 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
@@ -12,7 +12,7 @@
   // TODO(johnniwinther): Investigate why kernel doesn't point to the body
   // start brace.
   // ignore: UNUSED_LOCAL_VARIABLE
-  var /*2:test*/ /*3:test*/ c = new /*4:test*/ Class();
+  var /*2:test*/ c = new /*4:test*/ Class();
 }
 
 class Class {
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index eb5d5f0..7ea1cf9 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -9,7 +9,7 @@
 }
 
 @NoInline()
-test1() async /*2:test1*/ /*kernel.3:test1*/ {
+test1() async /*2:test1*/ {
   /*9:test1*/ test2();
 }
 
diff --git a/tests/compiler/dart2js_extra/21579_test.dart b/tests/compiler/dart2js_extra/21579_test.dart
index 94197cd..a7b3079 100644
--- a/tests/compiler/dart2js_extra/21579_test.dart
+++ b/tests/compiler/dart2js_extra/21579_test.dart
@@ -12,7 +12,7 @@
 
 main() {
   var a = new List.generate(100, (i) => i);
-  a.sort((a, b) => 1000000000000000000000 * a.compareTo(b));
+  a.sort((a, b) => 10000000000000 * a.compareTo(b));
   Expect.equals(0, a.first);
   Expect.equals(99, a.last);
 }
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index 094cd95..1a09423 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
@@ -6,8 +6,8 @@
 
 // Make sure we use JavaScript semantics when compiling compile-time constants.
 
-const x = 12345678901234567891;
-const y = 12345678901234567890;
+const x = 1234567890123456789;
+const y = 1234567890123456788;
 const z = x - y;
 
 const a = 1.0;
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 443fca5..e327d40 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -151,16 +151,27 @@
 big_integer_parsed_mul_div_vm_test: RuntimeError
 bit_twiddling_bigint_test: RuntimeError
 compare_to2_test: RuntimeError
+double_ceil_test: RuntimeError # Large integer literal. Not representable in JS.
+double_floor_test: RuntimeError # Large integer literal. Not representable in JS.
 double_parse_test/01: RuntimeError
+double_round_test: RuntimeError # Large integer literal. Not representable in JS.
+double_truncate_test: RuntimeError # Large integer literal. Not representable in JS.
 hash_set_test/01: RuntimeError
+int_ceil_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_floor_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_from_environment_test: RuntimeError # Large integer literal. Not representable in JS.
 int_modulo_arith_test/bignum: RuntimeError
 int_modulo_arith_test/modPow: RuntimeError
 int_parse_radix_test/01: RuntimeError
 int_parse_radix_test/02: RuntimeError
+int_round_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_truncate_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
 integer_to_radix_string_test: RuntimeError
 integer_to_string_test/01: RuntimeError
 iterable_return_type_test/02: RuntimeError
 nan_infinity_test/01: RuntimeError
+num_parse_test/01: RuntimeError # Large integer literal. Not representable in JS.
+num_parse_test/none: RuntimeError # Large integer literal. Not representable in JS.
 regress_r21715_test: RuntimeError
 string_base_vm_test: RuntimeError
 symbol_reserved_word_test/03: RuntimeError
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 6aac957..740c6c6 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -127,6 +127,7 @@
 int_parse_radix_bad_handler_test: Pass
 
 [ $compiler == dart2analyzer && !$strong ]
+regress_33166_test: StaticWarning # Not a Dart 1 test
 symbol_reserved_word_test/05: MissingCompileTimeError # Issue 30245
 
 [ $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk ]
diff --git a/tests/corelib_2/regress_33166_test.dart b/tests/corelib_2/regress_33166_test.dart
new file mode 100644
index 0000000..03f0faf
--- /dev/null
+++ b/tests/corelib_2/regress_33166_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import "package:expect/expect.dart";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/33166
+void main() async {
+  var stream = new Stream.fromIterable([1, 2, 3]);
+  Expect.equals(await stream.cast<int>().drain().then((_) => 'Done'), 'Done');
+}
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index b9f01fd..e634a35 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -33,6 +33,7 @@
 override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
 
 [ $compiler == dart2js && $runtime == d8 && $fasta ]
+int_round_to_double_test: RuntimeError # Large integer literal. Not valid in dart2.
 regress_23408_test: RuntimeError
 
 [ $compiler == dart2js && $runtime != drt ]
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 4579ab6..953e7a2 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -540,12 +540,7 @@
 async_await_test/03: RuntimeError
 async_await_test/none: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
-async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
 bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
@@ -904,12 +899,7 @@
 async_return_types_test/nestedFuture: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_return_types_test/wrongReturnType: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
@@ -1451,12 +1441,7 @@
 async_return_types_test/nestedFuture: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_return_types_test/wrongReturnType: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_test/01: RuntimeError
 async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
 bad_override_test/01: MissingCompileTimeError
 bad_override_test/02: MissingCompileTimeError
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 90f3795..a376ae2 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -19,6 +19,7 @@
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
 convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by dart2js.
 convert/chunked_conversion_utf88_test: Slow, Pass
+convert/utf82_test: RuntimeError # Large integer literal. Not valid in dart2.
 convert/utf85_test: Slow, Pass
 developer/timeline_test: Skip # Not supported
 math/double_pow_test: RuntimeError
@@ -112,7 +113,7 @@
 mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
 mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
 profiler/metrics_num_test: Skip # Because of a int / double type test.
-typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
+typed_data/int32x4_bigint_test: Pass
 typed_data/int64_list_load_store_test: RuntimeError # Issue 10275
 typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
 
diff --git a/tests/lib_2/html/interactive_media_test.dart b/tests/lib_2/html/interactive_media_test.dart
index 1ad71c0..25d43d4 100644
--- a/tests/lib_2/html/interactive_media_test.dart
+++ b/tests/lib_2/html/interactive_media_test.dart
@@ -6,14 +6,31 @@
 
 import 'dart:async';
 import 'dart:html';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
-import 'utils.dart';
 
-main() {
-  useHtmlIndividualConfiguration();
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+// NOTE: To test enable chrome://flags/#enable-experimental-web-platform-features
+
+main() async {
+  useHtmlConfiguration();
 
   if (MediaStream.supported) {
+    test('getUserMedia audio', () async {
+      var mediaStream = await window.navigator.getUserMedia(audio: true);
+      expect(mediaStream, isNotNull);
+      expect(mediaStream is MediaStream, true);
+      var devices = window.navigator.mediaDevices;
+      var enumDevices = await devices.enumerateDevices();
+      expect(enumDevices.length > 1, true);
+      for (var device in enumDevices) {
+        var goodDevLabel = device.label.endsWith('Built-in Output') ||
+            device.label.endsWith('Built-in Microphone');
+        expect(goodDevLabel, true);
+      }
+    });
+
     test('getUserMedia', () {
       return window.navigator.getUserMedia(video: true).then((stream) {
         expect(stream, isNotNull);
diff --git a/tests/lib_2/html/storage_promise_test.dart b/tests/lib_2/html/storage_promise_test.dart
new file mode 100644
index 0000000..b1e1b13
--- /dev/null
+++ b/tests/lib_2/html/storage_promise_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library interactive_test;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+main() async {
+  useHtmlConfiguration();
+
+  bool thenEstimateBefore, thenEstimateAfter, thenEstimateDone = false;
+  Map thenEstimate;
+  test('Basic Promise Test', () async {
+    try {
+      thenEstimateBefore = true;
+      window.navigator.storage.estimate().then((value) {
+        thenEstimate = value;
+        thenEstimateDone = true;
+      });
+      thenEstimateAfter = true;
+    } catch (msg) {
+      fail("StorageManger failed: $msg");
+    }
+
+    Map estimate = await window.navigator.storage.estimate();
+
+    expect(thenEstimate['usage'] >= 0, true);
+    expect(thenEstimate['quota'] > 1, true);
+    expect(thenEstimate['usage'], estimate['usage']);
+    expect(thenEstimate['quota'], estimate['quota']);
+
+    expect(thenEstimateBefore, true);
+    expect(thenEstimateAfter, true);
+    expect(thenEstimateDone, true);
+  });
+}
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 570bc93..35184e0 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -144,6 +144,9 @@
 mirrors/redirecting_factory_different_type_test/none: RuntimeError
 mirrors/reflected_type_generics_test/02: Fail, OK # Type check for a bounded type argument.
 
+[ $compiler == none && !$fasta ]
+mirrors/abstract_class_test: RuntimeError
+
 [ $runtime == chrome && $system == linux ]
 mirrors/native_class_test: Pass, Slow
 
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 9177102..e49ac50 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -293,6 +293,7 @@
 html/shadow_dom_test: RuntimeError
 html/shadowroot_test: RuntimeError
 html/speechrecognition_test: RuntimeError
+html/storage_promise_test: RuntimeError
 html/storage_test: RuntimeError
 html/streams_test: RuntimeError
 html/svg_test: RuntimeError
@@ -341,7 +342,6 @@
 html/fontface_loaded_test: RuntimeError
 html/html_mock_test: RuntimeError # Issue 31038
 html/input_element_attributes_test: RuntimeError
-html/interactive_media_test: RuntimeError
 html/js_dart_functions_test: RuntimeError # does not implement Dart 2 implicit `.call` tearoff
 html/js_extend_class_test: RuntimeError
 
@@ -462,6 +462,7 @@
 html/file_sample_test: Skip # FileSystem not supported on Safari.
 html/fileapi_supported_throws_test: Skip # FileSystem not supported on Safari
 html/js_mock_test: RuntimeError # Issue 32286
+html/storage_promise_test: RuntimeError # Not supported on Safari
 html/xhr_test: RuntimeError
 
 [ $compiler == dart2js && $system == linux ]
@@ -789,6 +790,9 @@
 convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
 convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
 
+[ $compiler == dart2js && ($runtime != chrome || $system != macos) ]
+html/interactive_media_test: RuntimeError # # See NOTE in test on how to run.
+
 [ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
 html/custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
 html/custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index c9e3342..e2910bb 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -26,7 +26,7 @@
 
 [ $system == linux && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/interactive_geolocation_test: Skip # Requires allowing geo location.
-html/interactive_media_test: RuntimeError
+html/interactive_media_test: RuntimeError # # See NOTE in test on how to run.
 
 [ $system == macos && ($compiler == dartdevc || $compiler == dartdevk) ]
 html/client_rect_test: Pass, RuntimeError # Issue 31019
@@ -85,7 +85,7 @@
 html/element_classes_svg_test: RuntimeError # Issue 29922
 html/element_classes_test: RuntimeError # Issue 29922
 html/fontface_loaded_test: RuntimeError
-html/interactive_media_test: Skip # requests interactive permissions (camera, geolocation)
+html/interactive_media_test: RuntimeError # See NOTE in test on how to run and interactive permissions (camera, geolocation)
 html/isolates_test: RuntimeError # Issue 29922
 html/js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue 29922
 html/js_typed_interop_side_cast_exp_test/01: RuntimeError # Requires --experimental-trust-js-interop-type-annotations flag.
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 65dbd6b..f015610 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -90,7 +90,6 @@
 isolate/spawn_function_custom_class_test: Pass, Crash, Timeout # Crashes with --no-enable-malloc-hooks vm option
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
-mirrors/abstract_class_test: RuntimeError
 mirrors/apply3_test: RuntimeError
 mirrors/class_declarations_test/01: RuntimeError # Issue 31402 (Invocation arguments)
 mirrors/class_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
diff --git a/tests/lib_2/mirrors/abstract_class_test.dart b/tests/lib_2/mirrors/abstract_class_test.dart
index b7dbaf0..8cd4fae 100644
--- a/tests/lib_2/mirrors/abstract_class_test.dart
+++ b/tests/lib_2/mirrors/abstract_class_test.dart
@@ -107,28 +107,28 @@
     // Mixin is abstract.
     Expect.isFalse(reflectClass(SubMA).isAbstract);
     Expect.isTrue(reflectClass(SubMA).superclass.isAbstract);
-    Expect.isFalse(reflectClass(SubMA).superclass.superclass.isAbstract);
+    Expect.isTrue(reflectClass(SubMA).superclass.superclass.isAbstract);
     Expect.isTrue(reflectClass(MA).isAbstract);
-    Expect.isFalse(reflectClass(MA).superclass.isAbstract);
+    Expect.isTrue(reflectClass(MA).superclass.isAbstract);
 
     // Mixin is concrete.
     Expect.isFalse(reflectClass(SubMA2).isAbstract);
     Expect.isTrue(reflectClass(SubMA2).superclass.isAbstract);
-    Expect.isFalse(reflectClass(SubMA2).superclass.superclass.isAbstract);
+    Expect.isTrue(reflectClass(SubMA2).superclass.superclass.isAbstract);
     Expect.isTrue(reflectClass(MA2).isAbstract);
-    Expect.isFalse(reflectClass(MA2).superclass.isAbstract);
+    Expect.isTrue(reflectClass(MA2).superclass.isAbstract);
   }
 
   // Application is concrete.
   {
     // Mixin is abstract.
     Expect.isFalse(reflectClass(ConcreteMA).isAbstract);
-    Expect.isFalse(reflectClass(ConcreteMA).superclass.isAbstract);
+    Expect.isTrue(reflectClass(ConcreteMA).superclass.isAbstract);
     Expect.isFalse(reflectClass(ConcreteMA).superclass.superclass.isAbstract);
 
     // Mixin is concrete.
     Expect.isFalse(reflectClass(ConcreteMA2).isAbstract);
-    Expect.isFalse(reflectClass(ConcreteMA2).superclass.isAbstract);
+    Expect.isTrue(reflectClass(ConcreteMA2).superclass.isAbstract);
     Expect.isFalse(reflectClass(ConcreteMA2).superclass.superclass.isAbstract);
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index b7ef033..717dac6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 56
+PRERELEASE 57
 PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 8695c4c..0f5f4a7 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1,4 +1,7 @@
 {
+  "global": {
+    "chrome": "65"
+  },
   "filesets": {
     "analyzer": [
       "out/ReleaseX64/",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 92995fc..cf6254c 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -14628,6 +14628,9 @@
         "support_level": "untriaged"
       },
       "getStats": {},
+      "getStats2": {
+        "support_level": "untriaged"
+      },
       "getStreamById": {},
       "iceConnectionState": {},
       "iceGatheringState": {},
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 6773b11..a713b78 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -133,6 +133,9 @@
 [DartSupplemental]
 interface RTCPeerConnection {
   [DartSuppress, RaisesException] void addIceCandidate(RTCIceCandidate candidate);
+  [DartSuppress] Promise<void> getStats(RTCStatsCallback successCallback, optional MediaStreamTrack? selector);
+  [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
+  [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
 };
 
 // See implementation in tools/dom/templates for canvas and offscreenCanvas.
@@ -565,12 +568,6 @@
     [DartName=inch] readonly attribute double? in;
 };
 
-[DartSupplemental]
-interface RTCPeerConnection {
-    [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
-    [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
-};
-
 [DartSuppress]
 interface DragEvent {};
 
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index cde90fb..d0cb493 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -187,7 +187,7 @@
   html_interface_renames[interface] = '_' + interface
 
 convert_to_future_members = monitored.Set(
-    'htmlrenamer.converted_to_future_members', [
+  'htmlrenamer.converted_to_future_members', [
   'DataTransferItem.getAsString',
   'DirectoryEntry.getDirectory',
   'DirectoryEntry.getFile',
@@ -425,7 +425,6 @@
   'Range.getClientRects',
   'RTCPeerConnection.createAnswer',
   'RTCPeerConnection.createOffer',
-  'RTCPeerConnection.getStats',
   'Screen.availHeight',
   'Screen.availLeft',
   'Screen.availTop',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index a9b7fd7..b2e06d2 100644
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -854,6 +854,13 @@
     if not (self._find_first(ast, 'Partial') is None):
       self.is_supplemental = True
       self.ext_attrs['DartSupplemental'] = None
+    self.isMaplike = False
+    self.isMaplike_ro = False
+    self.maplike_key_value = [None, None]
+    if ast is not None and ast.maplike is not None:
+       self.isMaplike = True
+       self.isMaplike_ro = ast.maplike.is_read_only
+       self.maplike_key_value = [IDLType(ast.maplike.key_type), IDLType(ast.maplike.value_type)]
 
     self.operations = self._convert_all(ast, 'Operation',
       lambda ast: IDLOperation(ast, self.doc_js_name))
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index e100908..036b320 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -666,6 +666,14 @@
              self._interface.id == 'CSSStyleDeclaration')):
             base_class = 'DartHtmlDomObject'
 
+    maplikeKeyType = ''
+    maplikeValueType = ''
+    if self._interface.isMaplike:
+        maplikeKeyType = self._type_registry.\
+            _TypeInfo(self._interface.maplike_key_value[0].id).dart_type()
+        maplikeValueType = 'dynamic'
+        mixins_str = " with MapMixin<%s, %s>" % (maplikeKeyType, maplikeValueType)
+
     implementation_members_emitter = implementation_emitter.Emit(
         self._backend.ImplementationTemplate(),
         LIBRARYNAME='dart.dom.%s' % self._library_name,
@@ -676,7 +684,9 @@
         IMPLEMENTS=implements_str,
         MIXINS=mixins_str,
         DOMNAME=self._interface.doc_js_name,
-        NATIVESPEC=native_spec)
+        NATIVESPEC=native_spec,
+        KEYTYPE=maplikeKeyType,
+        VALUETYPE=maplikeValueType)
     stream_getter_signatures_emitter = None
     element_stream_getters_emitter = None
     if type(implementation_members_emitter) == tuple:
@@ -753,6 +763,102 @@
 
 # ------------------------------------------------------------------------------
 
+''' TODO(terry): Current idl_parser (Chrome) doesn't keep the Promise type e.g.,
+                 Promise<T> in the AST so there is no way to pull this out.  Need
+                 to investigate getting the Chrome folks to fix.  However, they
+                 don't use this in the C++ code generation and don't have a need
+                 for this feature.  For now I have a table that maps to the
+                 parameterized Promise type.
+'''
+promise_attributes = monitored.Dict('systemhtml.promise_attr_type', {
+    "Animation.finished": {"type": "Animation"},
+    "Animation.ready": {"type": "Animation"},
+    "FontFace.loaded": {"type": "FontFace"},
+    "FontFaceSet.ready": {"type": "FontFaceSet"},
+    "PresentationReceiver.connectionList": {"type": "PresentationConnectionList"},
+    "ServiceWorkerContainer.ready": {"type": "ServiceWorkerRegistration"},
+})
+
+promise_operations = monitored.Dict('systemhtml.promise_oper_type', {
+  "Clipboard.read": { "type": "DataTransfer" },
+  "Clipboard.readText": { "type": "String" },
+  "FontFace.load": { "type": "FontFace"},
+  "FontFaceSet.load": { "type": "List<FontFace>" },
+  "OffscreenCanvas.load": { "type": "Blob" },
+  "BackgroundFetchManager.fetch": { "type": "BackgroundFetchRegistration" },
+  "BackgroundFetchManager.get": { "type": "BackgroundFetchRegistration" },
+  "BackgroundFetchManager.getIds": { "type": "List<String>" },
+  "BackgroundFetchRegistration.abort": { "type": "bool" },
+  "SyncManager.getTags": { "type": "List<String>" },
+  "BudgetService.getCost": { "type": "double" },
+  "BudgetService.getBudget": { "type": "BudgetState" },
+  "BudgetService.reserve": { "type": "bool" },
+  "Body.blob": { "type": "Blob" },
+  "Body.formData": { "type": "FormData" },
+  "Body.text": { "type": "String" },
+  "ImageCapture.getPhotoCapabilities": { "type": "PhotoCapabilities" },
+  "ImageCapture.getPhotoSettings": { "type": "dictionary" },
+  "ImageCapture.takePhoto": { "type": "Blob" },
+  "ImageCapture.grabFrame": { "type": "ImageBitmap" },
+  "Navigator.getInstalledRelatedApps": { "type": "RelatedApplication" },
+  "MediaCapabilities.decodingInfo": { "type": "MediaCapabilitiesInfo" },
+  "MediaCapabilities.encodingInfo": { "type": "MediaCapabilitiesInfo" },
+  "MediaDevices.enumerateDevices": { "type": "List<MediaDeviceInfo>" },
+  "MediaDevices.getUserMedia": { "type": "MediaStream" },
+  "MediaStreamTrack.applyConstraints": { "type": "MediaTrackConstraints" },
+  "ServiceWorkerRegistration.getNotifications": { "type": "List<Notification>" },
+  "PaymentInstruments.delete": { "type": "bool" },
+  "PaymentInstruments.get": { "type": "dictionary" },
+  "PaymentInstruments.keys": { "type": "List<String>" },
+  "PaymentInstrumentshas.": { "type": "bool" },
+  "PaymentRequest.show": { "type": "PaymentResponse" },
+  "PaymentRequest.canMakePayment": { "type": "bool" },
+  "PaymentRequestEvent.openWindow": { "type": "WindowClient" },
+  "RTCPeerConnection.createOffer": { "type": "RtcSessionDescription" },
+  "RTCPeerConnection.createAnswer": { "type": "RtcSessionDescription" },
+  "RTCPeerConnection.getStats": { "type": "dictionary", "maplike": "RTCStatsReport"},
+  "RTCPeerConnection.generateCertificate": { "type": "RtcCertificate" },
+  "Permissions.query": { "type": "PermissionStatus" },
+  "Permissions.request": { "type": "PermissionStatus" },
+  "Permissions.revoke": { "type": "PermissionStatus" },
+  "Permissions.requestAll": { "type": "PermissionStatus" },
+  "PresentationRequest.start": { "type": "PresentationConnection" },
+  "PresentationRequest.reconnect": { "type": "PresentationConnection" },
+  "PresentationRequest.getAvailability": { "type": "PresentationAvailability" },
+  "PushManager.subscribe": { "type": "PushSubscription" },
+  "PushManager.getSubscription": { "type": "PushSubscription" },
+  "PushSubscription.unsubscribe": { "type": "bool" },
+  "StorageManager.persisted": { "type": "bool" },
+  "StorageManager.persist": { "type": "bool" },
+  "StorageManager.estimate": { "type": "dictionary" },
+  "RemotePlayback.watchAvailability": { "type": "int" },
+  "Clients.matchAll": { "type": "List<Client>" },
+  "Clients.openWindow": { "type": "WindowClient" },
+  "NavigationPreloadManager.getState": { "type": "dictionary" },
+  "ServiceWorkerContainer.register": { "type": "ServiceWorkerRegistration" },
+  "ServiceWorkerContainer.getRegistration": { "type": "ServiceWorkerRegistration" },
+  "ServiceWorkerContainer.getRegistrations": { "type": "List<ServiceWorkerRegistration>" },
+  "ServiceWorkerGlobalScope.fetch": { "type": "Response" },
+  "ServiceWorkerRegistration.unregister": { "type": "bool" },
+  "WindowClient.focus": { "type": "WindowClient" },
+  "WindowClient.navigate": { "type": "WindowClient" },
+  "BarcodeDetector.detect": { "type": "List<DetectedBarcode>" },
+  "FaceDetector.detect": { "type": "List<DetectedFace>" },
+  "TextDetector.detect": { "type": "List<DetectedText>" },
+  "BaseAudioContext.decodeAudioData": { "type": "AudioBuffer" },
+  "OfflineAudioContext.startRendering": { "type": "AudioBuffer" },
+})
+
+def _GetPromiseOperationType(interface_operation):
+  if interface_operation in promise_operations:
+    return promise_operations[interface_operation]
+  return None
+
+def _GetPromiseAttributeType(interface_operation):
+  if interface_operation in promise_attributes:
+    return promise_attributes[interface_operation]
+  return None
+
 class Dart2JSBackend(HtmlDartGenerator):
   """Generates a dart2js class for the dart:html library from a DOM IDL
   interface.
@@ -792,8 +898,14 @@
   def ImplementationTemplate(self):
     template_file = ('impl_%s.darttemplate' %
                      self._interface.doc_js_name)
-    return (self._template_loader.TryLoad(template_file) or
-            self._template_loader.Load('dart2js_impl.darttemplate'))
+    template_file_content = self._template_loader.TryLoad(template_file)
+    if not(template_file_content):
+      if self._interface.isMaplike and self._interface.isMaplike_ro:
+          # TODO(terry): There are no mutable maplikes yet.
+          template_file_content = self._template_loader.Load('dart2js_maplike_impl.darttemplate')
+      else:
+        template_file_content = self._template_loader.Load('dart2js_impl.darttemplate')
+    return template_file_content
 
   def StartInterface(self, members_emitter):
     self._members_emitter = members_emitter
@@ -1150,13 +1262,61 @@
             resultType = 'Function'
     return resultType
 
+  def _zeroArgs(self, argsNames):
+    return 'JS("", "#.$NAME()", this)'
+
+  def _manyArgs(self, numberArgs, argsNames):
+    argsPound = "#" if numberArgs == 1 else ("#, " * numberArgs)[:-2]
+    return '    JS("", "#.$NAME(%s)", this, %s)' % (argsPound, argsNames)
+
+  def _promiseToFutureCode(self, argsNames):
+    numberArgs = argsNames.count(',') + 1
+    jsCall = self._zeroArgs(argsNames) if len(argsNames) == 0 else \
+        self._manyArgs(numberArgs, argsNames)
+
+    futureTemplate = [
+    '\n'
+    '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) => $PROMISE_CALL(',
+    jsCall,
+    ');\n'
+    ]
+    return "".join(futureTemplate)
 
   def _AddDirectNativeOperation(self, info, html_name):
     force_optional = True if html_name.startswith('_') else False
-
     resultType = self._computeResultType(info.type_name)
 
-    self._members_emitter.Emit(
+    if info.type_name == 'Promise' and not(force_optional):
+      lookupOp = "%s.%s" % (self._interface.id, html_name)
+      promiseFound = _GetPromiseOperationType(lookupOp)
+      promiseType = 'Future'
+      promiseCall = 'promiseToFuture'
+      if promiseFound is not(None):
+        if 'maplike' in promiseFound:
+          promiseCall = 'promiseToFutureMap'
+          promiseType = 'Future'
+        elif promiseFound['type'] == 'dictionary':
+          # It's a dictionary so return as a Map.
+          promiseCall = 'promiseToFutureDictionary'
+          promiseType = 'Future<Map>'
+        else:
+          paramType = promiseFound['type']
+          promiseCall = 'promiseToFuture<%s>' % paramType
+          promiseType = 'Future<%s>' % paramType
+
+      argsNames = info.ParametersAsArgumentList()
+      codeTemplate = self._promiseToFutureCode(argsNames)
+      self._members_emitter.Emit(codeTemplate,
+        RENAME=self._RenamingAnnotation(info.declared_name, html_name),
+        METADATA=self._Metadata(info.type_name, info.declared_name,
+            self.SecureOutputType(info.type_name)),
+        MODIFIERS='static ' if info.IsStatic() else '',
+        TYPE=promiseType,
+        PROMISE_CALL=promiseCall,
+        NAME=html_name,
+        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
+    else:
+        self._members_emitter.Emit(
         '\n'
         '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
         RENAME=self._RenamingAnnotation(info.declared_name, html_name),
diff --git a/tools/dom/templates/dart2js_maplike_impl.darttemplate b/tools/dom/templates/dart2js_maplike_impl.darttemplate
new file mode 100644
index 0000000..c2f8f91
--- /dev/null
+++ b/tools/dom/templates/dart2js_maplike_impl.darttemplate
@@ -0,0 +1,67 @@
+// Copyright (c) 2012, 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.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
+$!MEMBERS
+
+  Map _getItem($KEYTYPE key) =>
+      convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+  void addAll(Map<$KEYTYPE, $VALUETYPE> other) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  bool containsValue($VALUETYPE value) => values.any((e) => e == value);
+
+  bool containsKey($VALUETYPE key) => _getItem(key) != null;
+
+  Map operator []($VALUETYPE key) => _getItem(key);
+
+  void forEach(void f($KEYTYPE key, $VALUETYPE value)) {
+    var entries = JS('', '#.entries()', this);
+    while (true) {
+      var entry = JS('', '#.next()', entries);
+      if (JS('bool', '#.done', entry)) return;
+      f(JS('$KEYTYPE', '#.value[0]', entry),
+          convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+    }
+  }
+
+  Iterable<$KEYTYPE> get keys {
+    final keys = <$KEYTYPE>[];
+    forEach((k, v) => keys.add(k));
+    return keys;
+  }
+
+  Iterable<Map> get values {
+    final values = <Map>[];
+    forEach((k, v) => values.add(v));
+    return values;
+  }
+
+  int get length => JS('int', '#.size', this);
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => !isEmpty;
+
+  void operator []=($KEYTYPE key, $VALUETYPE value) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  dynamic putIfAbsent($KEYTYPE key, $VALUETYPE ifAbsent()) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  $KEYTYPE remove($VALUETYPE key) {
+    throw new UnsupportedError("Not supported");
+  }
+
+  void clear() {
+    throw new UnsupportedError("Not supported");
+  }
+}
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 2baac67..2f5c1e9 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -121,6 +121,45 @@
 HtmlDocument get document =>
     JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
 
+// Supoort to convert JS Promise to a Dart Future.
+Future<T> promiseToFuture<T>(thePromise) {
+  var completer = new Completer<T>();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1), convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
+Future promiseToFutureMap(thePromise) {
+  var completer = new Completer();
+
+  var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
+Future<Map> promiseToFutureDictionary(thePromise) {
+  var completer = new Completer<Map>();
+
+  var thenSuccessCode = (promiseValue) =>
+      completer.complete(convertNativeToDart_Dictionary(promiseValue));
+  var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+  JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+      convertDartClosureToJS(thenErrorCode, 1));
+
+  return completer.future;
+}
+
 // Workaround for tags like <cite> that lack their own Element subclass --
 // Dart issue 1990.
 @Native("HTMLElement")
@@ -147,4 +186,3 @@
 @Experimental() // untriaged
 typedef void FontFaceSetForEachCallback(
     FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
-
diff --git a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
index ae468155..c1ed25a 100644
--- a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
+++ b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
@@ -50,13 +50,6 @@
     return completer.future;
   }
 
-  @DomName('RTCPeerConnection.getStats')
-  Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
-    var completer = new Completer<RtcStatsResponse>();
-    _getStats((value) { completer.complete(value); }, selector);
-    return completer.future;
-  }
-
   @DomName('RTCPeerConnection.generateCertificate')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/tools/testing/dart/pubspec.yaml b/tools/testing/dart/pubspec.yaml
index 0bcb25f..4ddbba8 100644
--- a/tools/testing/dart/pubspec.yaml
+++ b/tools/testing/dart/pubspec.yaml
@@ -4,3 +4,4 @@
 
 # This file is only here that so certain Dart editors recognize this is a Dart
 # project.
+name: testing_tools
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 096b944..3630bee 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -15,6 +15,37 @@
   }
 }
 
+# Creates an app-jit snapshot for a Dart program based on a training run.
+#
+# Parameters:
+#  main_dart (required):
+#    The entrypoint to the Dart application.
+#
+#  training_args (required):
+#    Arguments to pass to the Dart application for the training run.
+#
+#  dart_version (optional):
+#    Must be 1 or 2. Defaults to 1.
+#
+#  vm_args (optional):
+#    Additional arguments to the Dart VM. Do not put --preview-dart-2 here.
+#    Instead set dart_version = 2.
+#
+#  name (optional):
+#    The name of the snapshot if different from the target name. The output
+#    will be in $root_gen_dir/$name.dart.snapshot.
+#
+#  extra_deps (optional):
+#    Any additional build dependencies.
+#
+#  extra_inputs (optional):
+#    Any extra build inputs.
+#
+#  dot_packages (optional):
+#    The .packages file for the app. Defaults to the $_dart_root/.packages.
+#
+#  output (optional):
+#    Overrides the full output path.
 template("application_snapshot") {
   assert(defined(invoker.main_dart), "Must specify 'main_dart'")
   assert(defined(invoker.training_args), "Must specify 'training_args'")
@@ -45,8 +76,25 @@
   if (defined(invoker.output)) {
     output = invoker.output
   }
+  dart_version = 1
+  if (defined(invoker.dart_version)) {
+    dart_version = invoker.dart_version
+  }
+  assert(dart_version == 1 || dart_version == 2,
+      "For $target_name, dart_version must be 1 or 2")
   dart_action(target_name) {
     deps = extra_deps
+
+    if (dart_version == 2) {
+      # HACK: When creating app-jit snapshots for Dart 2 apps, the standalone
+      # Dart VM binary requires the app-jit snapshot for the kernel service to
+      # be adjacent to it. This deps ensures that it is there, but a different
+      # approach will be needed when the kernel service itself switches to
+      # Dart 2 to avoid creating a circular dependence.
+      deps += [ "$_dart_root/utils/kernel-service:copy_kernel_service_snapshot"]
+      snapshot_vm_args += [ "--preview-dart-2" ]
+    }
+
     depfile = "$output.d"
 
     script = main_dart
diff --git a/utils/bazel/kernel_summary_worker.dart b/utils/bazel/kernel_summary_worker.dart
index c572e88..2b1246b 100644
--- a/utils/bazel/kernel_summary_worker.dart
+++ b/utils/bazel/kernel_summary_worker.dart
@@ -14,8 +14,8 @@
 
 import 'package:args/args.dart';
 import 'package:bazel_worker/bazel_worker.dart';
+import 'package:build_integration/file_system/multi_root.dart';
 import 'package:front_end/src/api_unstable/summary_worker.dart' as fe;
-import 'package:front_end/src/multi_root_file_system.dart';
 import 'package:kernel/ast.dart' show Component, Library;
 import 'package:kernel/target/targets.dart';
 
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index e41c7f6..ff06c7b 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -21,6 +21,7 @@
                              "list lines")
 
 application_snapshot("generate_dartanalyzer_snapshot") {
+  dart_version = 2
   main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
   training_args = [
     "--dart-sdk=" + rebase_path("../../sdk"),
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 0c5c4e2..6165c85 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -11,9 +11,7 @@
 sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
 
 application_snapshot("dartdevc") {
-  vm_args = [
-    "--preview-dart-2",
-  ]
+  dart_version = 2
 
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
 
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index f34a69a..0adf27a 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -10,9 +10,7 @@
 }
 
 application_snapshot("pub2") {
+  dart_version = 2
   main_dart = "../../third_party/pkg/pub/bin/pub.dart"
   training_args = [ "--help" ]
-  vm_args = [
-    "--preview-dart-2",
-  ]
 }