Version 2.3.0-dev.0.0

Merge commit '523666a97a21a29994d8ed17cdf13a4a4b082d06' into dev
diff --git a/.packages b/.packages
index 08c0d29..c5944a1 100644
--- a/.packages
+++ b/.packages
@@ -66,6 +66,7 @@
 package_config:third_party/pkg_tested/package_config/lib
 package_resolver:third_party/pkg_tested/package_resolver/lib
 path:third_party/pkg/path/lib
+pedantic:third_party/pkg/pedantic/lib
 pool:third_party/pkg/pool/lib
 protobuf:third_party/pkg/protobuf/protobuf/lib
 pub:third_party/pkg/pub/lib
@@ -88,7 +89,9 @@
 string_scanner:third_party/pkg/string_scanner/lib
 telemetry:pkg/telemetry/lib
 term_glyph:third_party/pkg/term_glyph/lib
-test:third_party/pkg/test/lib
+test:third_party/pkg/test/pkgs/test/lib
+test_api:third_party/pkg/test/pkgs/test_api/lib
+test_core:third_party/pkg/test/pkgs/test_core/lib
 test_dart:tools/testing/dart
 test_descriptor:third_party/pkg/test_descriptor/lib
 test_process:third_party/pkg/test_process/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ebda709..124f50a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 2.3.0-dev.0.0
+
+### Tool Changes
+
+#### Linter
+
+The Linter was updated to `0.1.86` which includes the following change:
+* new lint: `prefer_inlined_adds`
+
 ## 2.2.1-dev.4.2
 
 * Cherry-pick ab66a3808b28dfc94eaf0ed151c13f4fc696b5dc to dev
@@ -19,7 +28,7 @@
 
 The Linter was updated to `0.1.85` which includes the following changes:
 
-* (**BREAKING**) renamed `spread_collections` to `prefer_spread_collections`
+* new lint: `prefer_inlined_adds`
 * new lint: `prefer_for_elements_to_map_fromIterable`
 * new lint: `prefer_if_elements_to_conditional_expressions`
 * new lint: `diagnostic_describe_all_properties`
diff --git a/DEPS b/DEPS
index 9d0806f..0ad497f 100644
--- a/DEPS
+++ b/DEPS
@@ -36,7 +36,7 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_2_rev": "7e743ef29b4c06f1a2b8b9dc70ead60b31aab526",
+  "co19_2_rev": "a0a24a4bd5e4d913264fccfd600139af5b20c8e9",
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
@@ -64,7 +64,7 @@
   "collection_tag": "1.14.11",
   "convert_tag": "2.0.2",
   "crypto_tag" : "2.0.6",
-  "csslib_tag" : "0.14.4+1",
+  "csslib_tag" : "0.15.0",
   "dart2js_info_tag" : "0.6.0",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
@@ -84,21 +84,21 @@
   "dartdoc_tag" : "v0.28.2",
   "fixnum_tag": "0.10.9",
   "glob_tag": "1.1.7",
-  "html_tag" : "0.14.0",
+  "html_tag" : "0.14.0+1",
   "http_io_rev": "57da05a66f5bf7df3dd7aebe7b7efe0dfc477baa",
   "http_multi_server_tag" : "2.0.5",
   "http_parser_tag" : "3.1.3",
   "http_retry_tag": "0.1.1",
-  "http_tag" : "0.12.0",
+  "http_tag" : "0.12.0+2",
   "http_throttle_tag" : "1.0.2",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "0.15.7",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.85",
+  "linter_tag": "0.1.86",
   "logging_tag": "0.11.3+2",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_tag": "2.0.2",
+  "markdown_tag": "2.0.3",
   "matcher_tag": "0.12.3",
   "mime_tag": "0.9.6+2",
   "mockito_tag": "d39ac507483b9891165e422ec98d9fb480037c8b",
@@ -108,6 +108,7 @@
   "package_config_tag": "1.0.5",
   "package_resolver_tag": "1.0.10",
   "path_tag": "1.6.2",
+  "pedantic_tag": "v1.5.0",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.6",
   "protobuf_rev": "0c77167b16d00b561a6055bfe26690af7f26ae88",
@@ -125,13 +126,13 @@
   "source_maps_tag": "8af7cc1a1c3a193c1fba5993ce22a546a319c40e",
   "source_span_tag": "1.5.5",
   "stack_trace_tag": "1.9.3",
-  "stream_channel_tag": "1.6.8",
+  "stream_channel_tag": "2.0.0",
   "string_scanner_tag": "1.0.3",
   "test_descriptor_tag": "1.1.1",
   "test_process_tag": "1.0.3",
   "term_glyph_tag": "1.0.1",
   "test_reflective_loader_tag": "0.1.8",
-  "test_tag": "1.3.4",
+  "test_tag": "test-v1.6.1",
   "typed_data_tag": "1.1.6",
   "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
   "usage_tag": "3.4.0",
@@ -162,7 +163,7 @@
   Var("dart_root") + "/third_party/d8": {
       "packages": [{
           "package": "dart/d8",
-          "version": "version:6.9.427.23+1",
+          "version": "version:7.5.149",
       }],
       "dep_type": "cipd",
   },
@@ -301,6 +302,8 @@
       + "@" + Var("package_resolver_tag"),
   Var("dart_root") + "/third_party/pkg/path":
       Var("dart_git") + "path.git" + "@" + Var("path_tag"),
+  Var("dart_root") + "/third_party/pkg/pedantic":
+      Var("dart_git") + "pedantic.git" + "@" + Var("pedantic_tag"),
   Var("dart_root") + "/third_party/pkg/pool":
       Var("dart_git") + "pool.git" + "@" + Var("pool_tag"),
   Var("dart_root") + "/third_party/pkg/protobuf":
diff --git a/WATCHLISTS b/WATCHLISTS
index 415a9bd..538f457 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -50,9 +50,6 @@
         ')$'
       )
     },
-    'mirrors' : {
-      'filepath': '.*mirrors.*',
-    },
     'observatory': {
       'filepath': (
         '^runtime/bin/vmservice/|'
@@ -79,8 +76,7 @@
     'kernel': [ 'karlklose@google.com', 'jensj@google.com', 'kmillikin@google.com',
                 'alexmarkov@google.com' ],
     'messages_review': [ 'dart-uxr+reviews@google.com' ],
-    'mirrors' : [ 'rmacnak@google.com' ],
-    'observatory': [ 'bkonyi@google.com', 'rmacnak@google.com' ],
+    'observatory': [ 'bkonyi@google.com' ],
     'package_vm': [ 'alexmarkov@google.com' ],
     'runtime': [ 'vm-dev@dartlang.org' ],
     'vm_compiler': [ 'dart-vm-compiler-team+reviews@google.com' ],
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index b8adeca..c4dc5b8 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -23,8 +23,8 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/manifest/manifest_validator.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/path_filter.dart';
@@ -870,6 +870,32 @@
   }
 
   /**
+   * Use the given analysis [driver] to analyze the content of the 
+   * AndroidManifest file at the given [path].
+   */
+  void _analyzeManifestFile(AnalysisDriver driver, String path) {
+    List<protocol.AnalysisError> convertedErrors;
+    try {
+      String content = _readFile(path);
+      ManifestValidator validator =
+          new ManifestValidator(resourceProvider.getFile(path).createSource());
+      LineInfo lineInfo = _computeLineInfo(content);
+      List<AnalysisError> errors = validator.validate(
+          content, driver.analysisOptions.chromeOsManifestChecks);
+      AnalyzerConverter converter = new AnalyzerConverter();
+      convertedErrors = converter.convertAnalysisErrors(errors,
+          lineInfo: lineInfo, options: driver.analysisOptions);
+    } catch (exception) {
+      // If the file cannot be analyzed, fall through to clear any previous
+      // errors.
+    }
+    callbacks.notificationManager.recordAnalysisErrors(
+        NotificationManager.serverId,
+        path,
+        convertedErrors ?? <protocol.AnalysisError>[]);
+  }
+
+  /**
    * Use the given analysis [driver] to analyze the content of the pubspec file
    * at the given [path].
    */
@@ -897,32 +923,6 @@
         convertedErrors ?? <protocol.AnalysisError>[]);
   }
 
-  /**
-   * Use the given analysis [driver] to analyze the content of the 
-   * AndroidManifest file at the given [path].
-   */
-  void _analyzeManifestFile(AnalysisDriver driver, String path) {
-    List<protocol.AnalysisError> convertedErrors;
-    try {
-      String content = _readFile(path);
-      ManifestValidator validator =
-          new ManifestValidator(resourceProvider.getFile(path).createSource());
-      LineInfo lineInfo = _computeLineInfo(content);
-      List<AnalysisError> errors = validator.validate(
-          content, driver.analysisOptions.chromeOsManifestChecks);
-      AnalyzerConverter converter = new AnalyzerConverter();
-      convertedErrors = converter.convertAnalysisErrors(errors,
-          lineInfo: lineInfo, options: driver.analysisOptions);
-    } catch (exception) {
-      // If the file cannot be analyzed, fall through to clear any previous
-      // errors.
-    }
-    callbacks.notificationManager.recordAnalysisErrors(
-        NotificationManager.serverId,
-        path,
-        convertedErrors ?? <protocol.AnalysisError>[]);
-  }
-
   void _checkForAnalysisOptionsUpdate(String path, ContextInfo info) {
     if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) {
       AnalysisDriver driver = info.analysisDriver;
@@ -938,6 +938,19 @@
     }
   }
 
+  void _checkForManifestUpdate(String path, ContextInfo info) {
+    if (_isManifest(path)) {
+      AnalysisDriver driver = info.analysisDriver;
+      if (driver == null) {
+        // I suspect that this happens as a result of a race condition: server
+        // has determined that the file (at [path]) is in a context, but hasn't
+        // yet created a driver for that context.
+        return;
+      }
+      _analyzeManifestFile(driver, path);
+    }
+  }
+
   void _checkForPackagespecUpdate(String path, ContextInfo info) {
     // Check to see if this is the .packages file for this context and if so,
     // update the context's source factory.
@@ -968,19 +981,6 @@
     }
   }
 
-  void _checkForManifestUpdate(String path, ContextInfo info) {
-    if (_isManifest(path)) {
-      AnalysisDriver driver = info.analysisDriver;
-      if (driver == null) {
-        // I suspect that this happens as a result of a race condition: server
-        // has determined that the file (at [path]) is in a context, but hasn't
-        // yet created a driver for that context.
-        return;
-      }
-      _analyzeManifestFile(driver, path);
-    }
-  }
-
   /**
    * Compute the set of files that are being flushed, this is defined as
    * the set of sources in the removed context (context.sources), that are
@@ -1139,10 +1139,23 @@
     if (pubspecFile.exists) {
       _analyzePubspecFile(info.analysisDriver, pubspecFile.path);
     }
-    File manifestFile = folder.getChildAssumingFile(MANIFEST_NAME);
-    if (manifestFile.exists) {
-      _analyzeManifestFile(info.analysisDriver, manifestFile.path);
+
+    void checkManifestFilesIn(Folder folder) {
+      for (var child in folder.getChildren()) {
+        if (child is File) {
+          if (child.shortName == MANIFEST_NAME &&
+              !excludedPaths.contains(child.path)) {
+            _analyzeManifestFile(info.analysisDriver, child.path);
+          }
+        } else if (child is Folder) {
+          if (!excludedPaths.contains(child.path)) {
+            checkManifestFilesIn(child);
+          }
+        }
+      }
     }
+
+    checkManifestFilesIn(folder);
     return info;
   }
 
@@ -1510,13 +1523,13 @@
     return false;
   }
 
+  bool _isManifest(String path) => pathContext.basename(path) == MANIFEST_NAME;
+
   bool _isPackagespec(String path) =>
       pathContext.basename(path) == PACKAGE_SPEC_NAME;
 
   bool _isPubspec(String path) => pathContext.basename(path) == PUBSPEC_NAME;
 
-  bool _isManifest(String path) => pathContext.basename(path) == MANIFEST_NAME;
-
   /**
    * Merges [info] context into its parent.
    */
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 12a1d18..dbbd2d4 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -23,6 +23,8 @@
 import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart';
+import 'package:analysis_server/src/services/correction/fix/manifest/fix_generator.dart';
+import 'package:analysis_server/src/services/correction/fix/pubspec/fix_generator.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analysis_server/src/services/correction/organize_directives.dart';
 import 'package:analysis_server/src/services/correction/sort_members.dart';
@@ -45,11 +47,17 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/parser.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/manifest/manifest_validator.dart';
+import 'package:analyzer/src/manifest/manifest_values.dart';
+import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:dart_style/dart_style.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:path/src/context.dart';
 import 'package:yaml/yaml.dart';
 
 int test_resetCount = 0;
@@ -585,7 +593,6 @@
     if (content == null) {
       return errorFixesList;
     }
-    LineInfo lineInfo = new LineInfo.fromContent(content);
     SourceFactory sourceFactory = server.getAnalysisDriver(file).sourceFactory;
     List<engine.AnalysisError> errors = analyzeAnalysisOptions(
         optionsFile.createSource(), content, sourceFactory);
@@ -599,6 +606,7 @@
       List<Fix> fixes = await generator.computeFixes();
       if (fixes.isNotEmpty) {
         fixes.sort(Fix.SORT_BY_RELEVANCE);
+        LineInfo lineInfo = new LineInfo.fromContent(content);
         AnalysisError serverError =
             newAnalysisError_fromEngine(lineInfo, error);
         AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
@@ -646,15 +654,98 @@
   }
 
   /**
+   * Compute and return the fixes associated with server-generated errors in
+   * Android manifest files.
+   */
+  Future<List<AnalysisErrorFixes>> _computeManifestFixes(
+      String file, int offset) async {
+    List<AnalysisErrorFixes> errorFixesList = <AnalysisErrorFixes>[];
+    File manifestFile = server.resourceProvider.getFile(file);
+    String content = _safelyRead(manifestFile);
+    if (content == null) {
+      return errorFixesList;
+    }
+    DocumentFragment document =
+        parseFragment(content, container: MANIFEST_TAG, generateSpans: true);
+    if (document == null) {
+      return errorFixesList;
+    }
+    ManifestValidator validator =
+        new ManifestValidator(manifestFile.createSource());
+    List<engine.AnalysisError> errors = validator.validate(content, true);
+    for (engine.AnalysisError error in errors) {
+      ManifestFixGenerator generator =
+          new ManifestFixGenerator(error, content, document);
+      List<Fix> fixes = await generator.computeFixes();
+      if (fixes.isNotEmpty) {
+        fixes.sort(Fix.SORT_BY_RELEVANCE);
+        LineInfo lineInfo = new LineInfo.fromContent(content);
+        AnalysisError serverError =
+            newAnalysisError_fromEngine(lineInfo, error);
+        AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
+        errorFixesList.add(errorFixes);
+        fixes.forEach((fix) {
+          errorFixes.fixes.add(fix.change);
+        });
+      }
+    }
+    return errorFixesList;
+  }
+
+  /**
+   * Compute and return the fixes associated with server-generated errors in
+   * pubspec.yaml files.
+   */
+  Future<List<AnalysisErrorFixes>> _computePubspecFixes(
+      String file, int offset) async {
+    List<AnalysisErrorFixes> errorFixesList = <AnalysisErrorFixes>[];
+    File pubspecFile = server.resourceProvider.getFile(file);
+    String content = _safelyRead(pubspecFile);
+    if (content == null) {
+      return errorFixesList;
+    }
+    SourceFactory sourceFactory = server.getAnalysisDriver(file).sourceFactory;
+    YamlMap pubspec = _getOptions(sourceFactory, content);
+    if (pubspec == null) {
+      return errorFixesList;
+    }
+    PubspecValidator validator = new PubspecValidator(
+        server.resourceProvider, pubspecFile.createSource());
+    List<engine.AnalysisError> errors = validator.validate(pubspec.nodes);
+    for (engine.AnalysisError error in errors) {
+      PubspecFixGenerator generator =
+          new PubspecFixGenerator(error, content, pubspec);
+      List<Fix> fixes = await generator.computeFixes();
+      if (fixes.isNotEmpty) {
+        fixes.sort(Fix.SORT_BY_RELEVANCE);
+        LineInfo lineInfo = new LineInfo.fromContent(content);
+        AnalysisError serverError =
+            newAnalysisError_fromEngine(lineInfo, error);
+        AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
+        errorFixesList.add(errorFixes);
+        fixes.forEach((fix) {
+          errorFixes.fixes.add(fix.change);
+        });
+      }
+    }
+    return errorFixesList;
+  }
+
+  /**
    * Compute and return the fixes associated with server-generated errors.
    */
   Future<List<AnalysisErrorFixes>> _computeServerErrorFixes(
       String file, int offset) async {
+    Context context = server.resourceProvider.pathContext;
     if (AnalysisEngine.isDartFileName(file)) {
       return _computeDartFixes(file, offset);
-    } else if (AnalysisEngine.isAnalysisOptionsFileName(
-        file, server.resourceProvider.pathContext)) {
+    } else if (AnalysisEngine.isAnalysisOptionsFileName(file, context)) {
       return _computeAnalysisOptionsFixes(file, offset);
+    } else if (context.basename(file) == 'pubspec.yaml') {
+      return _computePubspecFixes(file, offset);
+    } else if (context.basename(file) == 'manifest.xml') {
+      // TODO(brianwilkerson) Do we need to check more than the file name?
+      return _computeManifestFixes(file, offset);
     }
     return <AnalysisErrorFixes>[];
   }
diff --git a/pkg/analysis_server/lib/src/nullability/decorated_type.dart b/pkg/analysis_server/lib/src/nullability/decorated_type.dart
index 41fef69..c6b3256 100644
--- a/pkg/analysis_server/lib/src/nullability/decorated_type.dart
+++ b/pkg/analysis_server/lib/src/nullability/decorated_type.dart
@@ -51,8 +51,8 @@
   /// presumed to have come from code that is already migrated.
   factory DecoratedType.forElement(Element element) {
     DecoratedType decorate(DartType type) {
-      assert((type as TypeImpl).nullability ==
-          Nullability.indeterminate); // TODO(paulberry)
+      assert((type as TypeImpl).nullabilitySuffix ==
+          NullabilitySuffix.star); // TODO(paulberry)
       if (type is FunctionType) {
         var decoratedType = DecoratedType(type, NullabilityNode.never,
             returnType: decorate(type.returnType), positionalParameters: []);
diff --git a/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart b/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
index 693b94e..3d225b5 100644
--- a/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
@@ -103,13 +103,18 @@
       if (element == null || element.isSynthetic) {
         buffer.write(type.displayName);
       } else {
-        String uri = element.library.source.uri.toString();
+//        String uri = element.library.source.uri.toString();
         String name = element.name;
         if (element is ClassMemberElement) {
           String className = element.enclosingElement.name;
-          buffer.write('$uri;$className;$name');
+          // TODO(brianwilkerson) Figure out why the uri is a file: URI when it
+          //  ought to be a package: URI and restore the code below to include
+          //  the URI in the string.
+//          buffer.write('$uri;$className;$name');
+          buffer.write('$className;$name');
         } else {
-          buffer.write('$uri;$name');
+//          buffer.write('$uri;$name');
+          buffer.write('$name');
         }
       }
     } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 5f64118..b16b95c 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -131,7 +131,7 @@
       associatedErrorCodes: <String>['prefer_single_quotes']);
   static const CONVERT_TO_SPREAD = const AssistKind(
       'dart.assist.convertToSpread', 30, "Convert to a spread",
-      associatedErrorCodes: <String>['spread_collections']);
+      associatedErrorCodes: <String>['prefer_spread_collections']);
   static const ENCAPSULATE_FIELD =
       const AssistKind('dart.assist.encapsulateField', 30, "Encapsulate field");
   static const EXCHANGE_OPERANDS =
@@ -170,6 +170,9 @@
       'dart.assist.flutter.wrap.streamBuilder', 30, "Wrap with StreamBuilder");
   static const IMPORT_ADD_SHOW = const AssistKind(
       'dart.assist.addShowCombinator', 30, "Add explicit 'show' combinator");
+  static const INLINE_INVOCATION = const AssistKind(
+      'dart.assist.inline', 30, "Inline invocation of '{0}'",
+      associatedErrorCodes: <String>['prefer_inlined_adds']);
   static const INTRODUCE_LOCAL_CAST_TYPE = const AssistKind(
       'dart.assist.introduceLocalCast',
       30,
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 64d8880..9a58459 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -134,6 +134,7 @@
     await _addProposal_flutterWrapWidget();
     await _addProposal_flutterWrapWidgets();
     await _addProposal_importAddShow();
+    await _addProposal_inlineAdd();
     await _addProposal_introduceLocalTestedType();
     await _addProposal_invertIf();
     await _addProposal_joinIfStatementInner();
@@ -464,6 +465,7 @@
     NodeList<Expression> sections = cascade.cascadeSections;
     Expression target = cascade.target;
     if (target is! ListLiteral || sections[0] != invocation) {
+      // TODO(brianwilkerson) Consider extending this to handle set literals.
       _coverageMarker();
       return;
     }
@@ -474,6 +476,8 @@
     ListLiteral list = target;
     Expression argument = invocation.argumentList.arguments[0];
     String elementText;
+    AssistKind kind = DartAssistKind.CONVERT_TO_SPREAD;
+    List<String> args = null;
     if (argument is BinaryExpression &&
         argument.operator.type == TokenType.QUESTION_QUESTION) {
       Expression right = argument.rightOperand;
@@ -492,20 +496,34 @@
         String thenText = utils.getNodeText(argument.thenExpression);
         elementText = 'if ($conditionText) ...$thenText';
       }
+    } else if (argument is ListLiteral) {
+      // ..addAll([ ... ])
+      NodeList<CollectionElement> elements = argument.elements;
+      if (elements.isEmpty) {
+        // TODO(brianwilkerson) Consider adding a cleanup for the empty list
+        //  case. We can essentially remove the whole invocation because it does
+        //  nothing.
+        return;
+      }
+      int startOffset = elements.first.offset;
+      int endOffset = elements.last.end;
+      elementText = utils.getText(startOffset, endOffset - startOffset);
+      kind = DartAssistKind.INLINE_INVOCATION;
+      args = ['addAll'];
     }
     elementText ??= '...${utils.getNodeText(argument)}';
     DartChangeBuilder changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      // ['a']..addAll(['b', 'c']);
       if (list.elements.isNotEmpty) {
+        // ['a']..addAll(['b', 'c']);
         builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
       } else {
-        //
+        // []..addAll(['b', 'c']);
         builder.addSimpleInsertion(list.leftBracket.end, elementText);
-      } // []..addAll(['b', 'c']);
+      }
       builder.addDeletion(range.node(invocation));
     });
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_SPREAD);
+    _addAssistFromBuilder(changeBuilder, kind, args: args);
   }
 
   Future<void> _addProposal_convertClassToMixin() async {
@@ -1211,6 +1229,29 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_SET_LITERAL);
   }
 
+  Future<void> _addProposal_convertToAbsoluteImport() async {
+    var node = this.node;
+    if (node is StringLiteral) {
+      node = node.parent;
+    }
+    if (node is ImportDirective) {
+      var importDirective = node;
+      var importUri = node.uriSource?.uri;
+      if (importUri?.scheme != 'package') {
+        return;
+      }
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (builder) {
+        builder.addSimpleReplacement(
+            range.node(importDirective.uri), "'$importUri'");
+      });
+      _addAssistFromBuilder(
+        changeBuilder,
+        DartAssistKind.CONVERT_INTO_ABSOLUTE_IMPORT,
+      );
+    }
+  }
+
   Future<void> _addProposal_convertToAsyncFunctionBody() async {
     FunctionBody body = getEnclosingFunctionBody();
     if (body == null ||
@@ -1744,29 +1785,6 @@
         changeBuilder, DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY);
   }
 
-  Future<void> _addProposal_convertToAbsoluteImport() async {
-    var node = this.node;
-    if (node is StringLiteral) {
-      node = node.parent;
-    }
-    if (node is ImportDirective) {
-      var importDirective = node;
-      var importUri = node.uriSource?.uri;
-      if (importUri?.scheme != 'package') {
-        return;
-      }
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-            range.node(importDirective.uri), "'$importUri'");
-      });
-      _addAssistFromBuilder(
-        changeBuilder,
-        DartAssistKind.CONVERT_INTO_ABSOLUTE_IMPORT,
-      );
-    }
-  }
-
   Future<void> _addProposal_convertToMultilineString() async {
     var node = this.node;
     if (node is InterpolationElement) {
@@ -2823,6 +2841,48 @@
     _addAssistFromBuilder(changeBuilder, DartAssistKind.IMPORT_ADD_SHOW);
   }
 
+  Future<void> _addProposal_inlineAdd() async {
+    AstNode node = this.node;
+    if (node is! SimpleIdentifier || node.parent is! MethodInvocation) {
+      _coverageMarker();
+      return;
+    }
+    SimpleIdentifier name = node;
+    MethodInvocation invocation = node.parent;
+    if (name != invocation.methodName ||
+        name.name != 'add' ||
+        !invocation.isCascaded ||
+        invocation.argumentList.arguments.length != 1) {
+      _coverageMarker();
+      return;
+    }
+    CascadeExpression cascade = invocation.thisOrAncestorOfType();
+    NodeList<Expression> sections = cascade.cascadeSections;
+    Expression target = cascade.target;
+    if (target is! ListLiteral || sections[0] != invocation) {
+      // TODO(brianwilkerson) Consider extending this to handle set literals.
+      _coverageMarker();
+      return;
+    }
+    ListLiteral list = target;
+    Expression argument = invocation.argumentList.arguments[0];
+    String elementText = utils.getNodeText(argument);
+
+    DartChangeBuilder changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+      if (list.elements.isNotEmpty) {
+        // ['a']..add(e);
+        builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
+      } else {
+        // []..add(e);
+        builder.addSimpleInsertion(list.leftBracket.end, elementText);
+      }
+      builder.addDeletion(range.node(invocation));
+    });
+    _addAssistFromBuilder(changeBuilder, DartAssistKind.INLINE_INVOCATION,
+        args: ['add']);
+  }
+
   Future<void> _addProposal_introduceLocalTestedType() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 3c54bcb..7ca77e9 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -335,3 +335,10 @@
   static const USE_RETHROW =
       const FixKind('USE_RETHROW', 50, "Replace throw with rethrow");
 }
+
+/// An enumeration of quick fix kinds for the errors found in an Android
+/// manifest file.
+class ManifestFixKind {}
+
+/// An enumeration of quick fix kinds for the errors found in a pubspec file.
+class PubspecFixKind {}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
index f558372..af92ea7 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analysis_server/src/utilities/yaml_node_locator.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/source/source_range.dart';
@@ -17,8 +18,6 @@
     show SourceChange;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:meta/meta.dart';
-import 'package:source_span/src/span.dart';
 import 'package:yaml/yaml.dart';
 
 /// The generator used to generate fixes in analysis options files.
@@ -175,64 +174,3 @@
     return new SourceRange(startOffset, endOffset - startOffset);
   }
 }
-
-/// An object used to locate the [YamlNode] associated with a source range.
-/// More specifically, it will return the deepest [YamlNode] which completely
-/// encompasses the specified range.
-class YamlNodeLocator {
-  /// The inclusive start offset of the range used to identify the node.
-  int _startOffset = 0;
-
-  /// The inclusive end offset of the range used to identify the node.
-  int _endOffset = 0;
-
-  /// Initialize a newly created locator to locate the deepest [YamlNode] for
-  /// which `node.offset <= [start]` and `[end] < node.end`.
-  ///
-  /// If the [end] offset is not provided, then it is considered the same as the
-  /// [start] offset.
-  YamlNodeLocator({@required int start, int end})
-      : this._startOffset = start,
-        this._endOffset = end ?? start;
-
-  /// Search within the given Yaml [node] and return the path to the most deeply
-  /// nested node that includes the whole target range, or an empty list if no
-  /// node was found. The path is represented by all of the elements from the
-  /// starting [node] to the most deeply nested node, in reverse order.
-  List<YamlNode> searchWithin(YamlNode node) {
-    List<YamlNode> path = [];
-    _searchWithin(path, node);
-    return path;
-  }
-
-  void _searchWithin(List<YamlNode> path, YamlNode node) {
-    SourceSpan span = node.span;
-    if (span.start.offset > _endOffset || span.end.offset < _startOffset) {
-      return;
-    }
-    if (node is YamlList) {
-      for (YamlNode element in node.nodes) {
-        _searchWithin(path, element);
-        if (path.isNotEmpty) {
-          path.add(node);
-          return;
-        }
-      }
-    } else if (node is YamlMap) {
-      Map<dynamic, YamlNode> nodeMap = node.nodes;
-      for (YamlNode key in nodeMap.keys) {
-        _searchWithin(path, key);
-        if (path.isNotEmpty) {
-          path.add(node);
-          return;
-        }
-        _searchWithin(path, nodeMap[key]);
-        if (path.isNotEmpty) {
-          path.add(node);
-          return;
-        }
-      }
-    }
-    path.add(node);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
new file mode 100644
index 0000000..50ee2a7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
@@ -0,0 +1,144 @@
+// Copyright (c) 2019, 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:math' as math;
+
+import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/manifest/manifest_warning_code.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    show SourceChange;
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:html/dom.dart';
+import 'package:meta/meta.dart';
+import 'package:source_span/source_span.dart';
+
+/// An object used to locate the HTML [Node] associated with a source range.
+/// More specifically, it will return the deepest HTML [Node] which completely
+/// encompasses the specified range.
+class HtmlNodeLocator {
+  /// The inclusive start offset of the range used to identify the node.
+  int _startOffset = 0;
+
+  /// The inclusive end offset of the range used to identify the node.
+  int _endOffset = 0;
+
+  /// Initialize a newly created locator to locate the deepest [Node] for
+  /// which `node.offset <= [start]` and `[end] < node.end`.
+  ///
+  /// If the [end] offset is not provided, then it is considered the same as the
+  /// [start] offset.
+  HtmlNodeLocator({@required int start, int end})
+      : this._startOffset = start,
+        this._endOffset = end ?? start;
+
+  /// Search within the given HTML [node] and return the path to the most deeply
+  /// nested node that includes the whole target range, or an empty list if no
+  /// node was found. The path is represented by all of the elements from the
+  /// starting [node] to the most deeply nested node, in reverse order.
+  List<Node> searchWithin(Node node) {
+    List<Node> path = [];
+    _searchWithin(path, node);
+    return path;
+  }
+
+  void _searchWithin(List<Node> path, Node node) {
+    FileSpan span = node.sourceSpan;
+    if (span.start.offset > _endOffset || span.end.offset < _startOffset) {
+      return;
+    }
+    for (Element element in node.children) {
+      _searchWithin(path, element);
+      if (path.isNotEmpty) {
+        path.add(node);
+        return;
+      }
+    }
+    path.add(node);
+  }
+}
+
+/// The generator used to generate fixes in Android manifest files.
+class ManifestFixGenerator {
+  final AnalysisError error;
+
+  final int errorOffset;
+
+  final int errorLength;
+
+  final String content;
+
+  final DocumentFragment document;
+
+  final LineInfo lineInfo;
+
+  final List<Fix> fixes = <Fix>[];
+
+  List<Node> coveringNodePath;
+
+  ManifestFixGenerator(this.error, this.content, this.document)
+      : errorOffset = error.offset,
+        errorLength = error.length,
+        lineInfo = new LineInfo.fromContent(content);
+
+  /// Return the absolute, normalized path to the file in which the error was
+  /// reported.
+  String get file => error.source.fullName;
+
+  /// Return the list of fixes that apply to the error being fixed.
+  Future<List<Fix>> computeFixes() async {
+    HtmlNodeLocator locator = new HtmlNodeLocator(
+        start: errorOffset, end: errorOffset + errorLength - 1);
+    coveringNodePath = locator.searchWithin(document);
+    if (coveringNodePath.isEmpty) {
+      return fixes;
+    }
+
+    ErrorCode errorCode = error.errorCode;
+    if (errorCode == ManifestWarningCode.UNSUPPORTED_CHROME_OS_HARDWARE) {
+    } else if (errorCode ==
+        ManifestWarningCode.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE) {
+    } else if (errorCode ==
+        ManifestWarningCode.CAMERA_PERMISSIONS_INCOMPATIBLE) {}
+    return fixes;
+  }
+
+  /// Add a fix whose edits were built by the [builder] that has the given
+  /// [kind]. If [args] are provided, they will be used to fill in the message
+  /// for the fix.
+  // ignore: unused_element
+  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
+      {List args: null}) {
+    SourceChange change = builder.sourceChange;
+    if (change.edits.isEmpty) {
+      return;
+    }
+    change.message = formatList(kind.message, args);
+    fixes.add(new Fix(kind, change));
+  }
+
+  // ignore: unused_element
+  int _firstNonWhitespaceBefore(int offset) {
+    while (offset > 0 && isWhitespace(content.codeUnitAt(offset - 1))) {
+      offset--;
+    }
+    return offset;
+  }
+
+  // ignore: unused_element
+  SourceRange _lines(int start, int end) {
+    CharacterLocation startLocation = lineInfo.getLocation(start);
+    int startOffset = lineInfo.getOffsetOfLine(startLocation.lineNumber - 1);
+    CharacterLocation endLocation = lineInfo.getLocation(end);
+    int endOffset = lineInfo.getOffsetOfLine(
+        math.min(endLocation.lineNumber, lineInfo.lineCount - 1));
+    return new SourceRange(startOffset, endOffset - startOffset);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
new file mode 100644
index 0000000..36f9a32
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2019, 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:math' as math;
+
+import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analysis_server/src/utilities/yaml_node_locator.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    show SourceChange;
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:yaml/yaml.dart';
+
+/// The generator used to generate fixes in pubspec.yaml files.
+class PubspecFixGenerator {
+  final AnalysisError error;
+
+  final int errorOffset;
+
+  final int errorLength;
+
+  final String content;
+
+  final YamlMap options;
+
+  final LineInfo lineInfo;
+
+  final List<Fix> fixes = <Fix>[];
+
+  List<YamlNode> coveringNodePath;
+
+  PubspecFixGenerator(this.error, this.content, this.options)
+      : errorOffset = error.offset,
+        errorLength = error.length,
+        lineInfo = new LineInfo.fromContent(content);
+
+  /// Return the absolute, normalized path to the file in which the error was
+  /// reported.
+  String get file => error.source.fullName;
+
+  /// Return the list of fixes that apply to the error being fixed.
+  Future<List<Fix>> computeFixes() async {
+    YamlNodeLocator locator = new YamlNodeLocator(
+        start: errorOffset, end: errorOffset + errorLength - 1);
+    coveringNodePath = locator.searchWithin(options);
+    if (coveringNodePath.isEmpty) {
+      return fixes;
+    }
+
+    ErrorCode errorCode = error.errorCode;
+    if (errorCode == PubspecWarningCode.ASSET_DOES_NOT_EXIST) {
+    } else if (errorCode == PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST) {
+    } else if (errorCode == PubspecWarningCode.ASSET_FIELD_NOT_LIST) {
+    } else if (errorCode == PubspecWarningCode.ASSET_NOT_STRING) {
+    } else if (errorCode == PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP) {
+    } else if (errorCode == PubspecWarningCode.FLUTTER_FIELD_NOT_MAP) {
+    } else if (errorCode == PubspecWarningCode.MISSING_NAME) {
+    } else if (errorCode == PubspecWarningCode.NAME_NOT_STRING) {
+    } else if (errorCode == PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY) {}
+    return fixes;
+  }
+
+  /// Add a fix whose edits were built by the [builder] that has the given
+  /// [kind]. If [args] are provided, they will be used to fill in the message
+  /// for the fix.
+  // ignore: unused_element
+  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
+      {List args: null}) {
+    SourceChange change = builder.sourceChange;
+    if (change.edits.isEmpty) {
+      return;
+    }
+    change.message = formatList(kind.message, args);
+    fixes.add(new Fix(kind, change));
+  }
+
+  // ignore: unused_element
+  int _firstNonWhitespaceBefore(int offset) {
+    while (offset > 0 && isWhitespace(content.codeUnitAt(offset - 1))) {
+      offset--;
+    }
+    return offset;
+  }
+
+  // ignore: unused_element
+  SourceRange _lines(int start, int end) {
+    CharacterLocation startLocation = lineInfo.getLocation(start);
+    int startOffset = lineInfo.getOffsetOfLine(startLocation.lineNumber - 1);
+    CharacterLocation endLocation = lineInfo.getLocation(end);
+    int endOffset = lineInfo.getOffsetOfLine(
+        math.min(endLocation.lineNumber, lineInfo.lineCount - 1));
+    return new SourceRange(startOffset, endOffset - startOffset);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart b/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart
new file mode 100644
index 0000000..480bb4e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2019, 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:meta/meta.dart';
+import 'package:source_span/src/span.dart';
+import 'package:yaml/yaml.dart';
+
+/// An object used to locate the [YamlNode] associated with a source range.
+/// More specifically, it will return the deepest [YamlNode] which completely
+/// encompasses the specified range.
+class YamlNodeLocator {
+  /// The inclusive start offset of the range used to identify the node.
+  int _startOffset = 0;
+
+  /// The inclusive end offset of the range used to identify the node.
+  int _endOffset = 0;
+
+  /// Initialize a newly created locator to locate the deepest [YamlNode] for
+  /// which `node.offset <= [start]` and `[end] < node.end`.
+  ///
+  /// If the [end] offset is not provided, then it is considered the same as the
+  /// [start] offset.
+  YamlNodeLocator({@required int start, int end})
+      : this._startOffset = start,
+        this._endOffset = end ?? start;
+
+  /// Search within the given Yaml [node] and return the path to the most deeply
+  /// nested node that includes the whole target range, or an empty list if no
+  /// node was found. The path is represented by all of the elements from the
+  /// starting [node] to the most deeply nested node, in reverse order.
+  List<YamlNode> searchWithin(YamlNode node) {
+    List<YamlNode> path = [];
+    _searchWithin(path, node);
+    return path;
+  }
+
+  void _searchWithin(List<YamlNode> path, YamlNode node) {
+    SourceSpan span = node.span;
+    if (span.start.offset > _endOffset || span.end.offset < _startOffset) {
+      return;
+    }
+    if (node is YamlList) {
+      for (YamlNode element in node.nodes) {
+        _searchWithin(path, element);
+        if (path.isNotEmpty) {
+          path.add(node);
+          return;
+        }
+      }
+    } else if (node is YamlMap) {
+      Map<dynamic, YamlNode> nodeMap = node.nodes;
+      for (YamlNode key in nodeMap.keys) {
+        _searchWithin(path, key);
+        if (path.isNotEmpty) {
+          path.add(node);
+          return;
+        }
+        _searchWithin(path, nodeMap[key]);
+        if (path.isNotEmpty) {
+          path.add(node);
+          return;
+        }
+      }
+    }
+    path.add(node);
+  }
+}
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index a270f6c..df6f051 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -66,6 +66,36 @@
     expect(error.type, AnalysisErrorType.STATIC_WARNING);
   }
 
+  test_androidManifestFile() async {
+    String filePath = join(projectPath, 'android', 'AndroidManifest.xml');
+    String manifestFile = newFile(filePath, content: '''
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <uses-feature android:name="android.software.home_screen" />
+</manifest>
+''').path;
+    newFile(join(projectPath, 'analysis_options.yaml'), content: '''
+analyzer:
+  optional-checks:
+    chrome-os-manifest-checks: true
+''');
+
+    Request request =
+        new AnalysisSetAnalysisRootsParams([projectPath], []).toRequest('0');
+    handleSuccessfulRequest(request);
+    await waitForTasksFinished();
+    await pumpEventQueue();
+    //
+    // Verify the error result.
+    //
+    List<AnalysisError> errors = filesErrors[manifestFile];
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.location.file, filePath);
+    expect(error.severity, AnalysisErrorSeverity.WARNING);
+    expect(error.type, AnalysisErrorType.STATIC_WARNING);
+  }
+
   test_importError() async {
     createProject();
 
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 3f0e266..dc47e1d 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -893,25 +893,35 @@
 class D with C {}
 ''', [
       token('class', null, null),
-      token('A', 'dart:core;Type', ['declaration']),
+      token('A', 'Type',
+          ['declaration']), //token('A', 'dart:core;Type', ['declaration']),
       token('{', null, null),
       token('}', null, null),
       token('class', null, null),
-      token('B', 'dart:core;Type', ['declaration']),
+      token('B', 'Type',
+          ['declaration']), //token('B', 'dart:core;Type', ['declaration']),
       token('extends', null, null),
-      token('A', 'dart:core;Type<$testFileUri;A>', ['reference']),
+      token('A', 'dart:core;Type<A>', [
+        'reference'
+      ]), //token('A', 'dart:core;Type<$testFileUri;A>', ['reference']),
       token('{', null, null),
       token('}', null, null),
       token('class', null, null),
-      token('C', 'dart:core;Type', ['declaration']),
+      token('C', 'Type',
+          ['declaration']), //token('C', 'dart:core;Type', ['declaration']),
       token('implements', null, null),
-      token('B', 'dart:core;Type<$testFileUri;B>', ['reference']),
+      token('B', 'dart:core;Type<B>', [
+        'reference'
+      ]), //token('B', 'dart:core;Type<$testFileUri;B>', ['reference']),
       token('{', null, null),
       token('}', null, null),
       token('class', null, null),
-      token('D', 'dart:core;Type', ['declaration']),
+      token('D', 'Type',
+          ['declaration']), //token('D', 'dart:core;Type', ['declaration']),
       token('with', null, null),
-      token('C', 'dart:core;Type<$testFileUri;C>', ['reference']),
+      token('C', 'dart:core;Type<C>', [
+        'reference'
+      ]), //token('C', 'dart:core;Type<$testFileUri;C>', ['reference']),
       token('{', null, null),
       token('}', null, null),
     ]);
@@ -921,11 +931,16 @@
     await expectTokens('''
 List<int> x = null;
 ''', [
-      token('List', 'dart:core;Type<dart:core;List>', ['reference']),
+      token('List', 'dart:core;Type<List>', [
+        'reference'
+      ]), //token('List', 'dart:core;Type<dart:core;List>', ['reference']),
       token('<', null, null),
-      token('int', 'dart:core;Type<dart:core;int>', ['reference']),
+      token('int', 'dart:core;Type<int>', [
+        'reference'
+      ]), //token('int', 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', null, null),
-      token('x', 'dart:core;List', ['declaration']),
+      token('x', 'List',
+          ['declaration']), //token('x', 'dart:core;List', ['declaration']),
       token('=', null, null),
       token('null', null, null),
       token(';', null, null),
@@ -937,11 +952,13 @@
 var x = 'a'.length;
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;int', ['declaration']),
+      token('x', 'int',
+          ['declaration']), //token('x', 'dart:core;int', ['declaration']),
       token('=', null, null),
-      token("'a'", 'dart:core;String', null),
+      token("'a'", 'String', null), //token("'a'", 'dart:core;String', null),
       token('.', null, null),
-      token('length', 'dart:core;int', ['reference']),
+      token('length', 'int',
+          ['reference']), //token('length', 'dart:core;int', ['reference']),
       token(';', null, null),
     ]);
   }
@@ -951,9 +968,10 @@
 var x = true;
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;bool', ['declaration']),
+      token('x', 'bool',
+          ['declaration']), //token('x', 'dart:core;bool', ['declaration']),
       token('=', null, null),
-      token('true', 'dart:core;bool', null),
+      token('true', 'bool', null), //token('true', 'dart:core;bool', null),
       token(';', null, null),
     ]);
   }
@@ -963,9 +981,10 @@
 var x = 3.4;
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;double', ['declaration']),
+      token('x', 'double',
+          ['declaration']), //token('x', 'dart:core;double', ['declaration']),
       token('=', null, null),
-      token('3.4', 'dart:core;double', null),
+      token('3.4', 'double', null), //token('3.4', 'dart:core;double', null),
       token(';', null, null),
     ]);
   }
@@ -975,9 +994,10 @@
 var x = 7;
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;int', ['declaration']),
+      token('x', 'int',
+          ['declaration']), //token('x', 'dart:core;int', ['declaration']),
       token('=', null, null),
-      token('7', 'dart:core;int', null),
+      token('7', 'int', null), //token('7', 'dart:core;int', null),
       token(';', null, null),
     ]);
   }
@@ -987,10 +1007,13 @@
 var x = <int>[];
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;List', ['declaration']),
+      token('x', 'List',
+          ['declaration']), //token('x', 'dart:core;List', ['declaration']),
       token('=', null, null),
       token('<', null, null),
-      token("int", 'dart:core;Type<dart:core;int>', ['reference']),
+      token("int", 'dart:core;Type<int>', [
+        'reference'
+      ]), //token("int", 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', null, null),
       token('[', null, null),
       token(']', null, null),
@@ -1003,12 +1026,17 @@
 var x = <int, int>{};
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;Map', ['declaration']),
+      token('x', 'Map',
+          ['declaration']), //token('x', 'dart:core;Map', ['declaration']),
       token('=', null, null),
       token('<', null, null),
-      token("int", 'dart:core;Type<dart:core;int>', ['reference']),
+      token("int", 'dart:core;Type<int>', [
+        'reference'
+      ]), //token("int", 'dart:core;Type<dart:core;int>', ['reference']),
 //      token(',', null, null),
-      token("int", 'dart:core;Type<dart:core;int>', ['reference']),
+      token("int", 'dart:core;Type<int>', [
+        'reference'
+      ]), //token("int", 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', null, null),
       token('{', null, null),
       token('}', null, null),
@@ -1033,10 +1061,13 @@
 var x = <int>{};
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;Set', ['declaration']),
+      token('x', 'Set',
+          ['declaration']), //token('x', 'dart:core;Set', ['declaration']),
       token('=', null, null),
       token('<', null, null),
-      token("int", 'dart:core;Type<dart:core;int>', ['reference']),
+      token("int", 'dart:core;Type<int>', [
+        'reference'
+      ]), //token("int", 'dart:core;Type<dart:core;int>', ['reference']),
       token('>', null, null),
       token('{', null, null),
       token('}', null, null),
@@ -1049,9 +1080,10 @@
 var x = 'a';
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;String', ['declaration']),
+      token('x', 'String',
+          ['declaration']), //token('x', 'dart:core;String', ['declaration']),
       token('=', null, null),
-      token("'a'", 'dart:core;String', null),
+      token("'a'", 'String', null), //token("'a'", 'dart:core;String', null),
       token(';', null, null),
     ]);
   }
@@ -1063,17 +1095,27 @@
 }
 ''', [
       token('class', null, null),
-      token('A', 'dart:core;Type', ['declaration']),
+      token('A', 'Type',
+          ['declaration']), //token('A', 'dart:core;Type', ['declaration']),
       token('{', null, null),
-      token('String', 'dart:core;Type<dart:core;String>', ['reference']),
-      token('c', 'dart:core;String Function(dart:core;int, dart:core;int)',
+      token('String', 'dart:core;Type<String>', [
+        'reference'
+      ]), //token('String', 'dart:core;Type<dart:core;String>', ['reference']),
+      token('c',
+          'String Function(int, int)', //'dart:core;String Function(dart:core;int, dart:core;int)',
           ['declaration']),
       token('(', null, null),
-      token('int', 'dart:core;Type<dart:core;int>', ['reference']),
-      token('x', 'dart:core;int', ['declaration']),
+      token('int', 'dart:core;Type<int>', [
+        'reference'
+      ]), //token('int', 'dart:core;Type<dart:core;int>', ['reference']),
+      token('x', 'int',
+          ['declaration']), //token('x', 'dart:core;int', ['declaration']),
 //      token(',', null, null),
-      token('int', 'dart:core;Type<dart:core;int>', ['reference']),
-      token('y', 'dart:core;int', ['declaration']),
+      token('int', 'dart:core;Type<int>', [
+        'reference'
+      ]), //token('int', 'dart:core;Type<dart:core;int>', ['reference']),
+      token('y', 'int',
+          ['declaration']), //token('y', 'dart:core;int', ['declaration']),
       token(')', null, null),
       token('{', null, null),
       token('}', null, null),
@@ -1086,18 +1128,19 @@
 var x = 'radar'.indexOf('r', 1);
 ''', [
       token('var', null, null),
-      token('x', 'dart:core;int', ['declaration']),
+      token('x', 'int',
+          ['declaration']), //token('x', 'dart:core;int', ['declaration']),
       token('=', null, null),
-      token("'radar'", 'dart:core;String', null),
+      token("'radar'", 'String',
+          null), //token("'radar'", 'dart:core;String', null),
       token('.', null, null),
-      token(
-          'indexOf',
-          'dart:core;int Function(dart:core;Pattern, dart:core;int)',
+      token('indexOf',
+          'int Function(Pattern, int)', //'dart:core;int Function(dart:core;Pattern, dart:core;int)',
           ['reference']),
       token('(', null, null),
-      token("'r'", 'dart:core;String', null),
+      token("'r'", 'String', null), //token("'r'", 'dart:core;String', null),
 //      token(',', null, null),
-      token('1', 'dart:core;int', null),
+      token('1', 'int', null), //token('1', 'dart:core;int', null),
       token(')', null, null),
       token(';', null, null),
     ]);
@@ -1110,19 +1153,26 @@
 mixin D on A implements B {}
 ''', [
       token('class', null, null),
-      token('A', 'dart:core;Type', ['declaration']),
+      token('A', 'Type',
+          ['declaration']), //token('A', 'dart:core;Type', ['declaration']),
       token('{', null, null),
       token('}', null, null),
       token('class', null, null),
-      token('B', 'dart:core;Type', ['declaration']),
+      token('B', 'Type',
+          ['declaration']), //token('B', 'dart:core;Type', ['declaration']),
       token('{', null, null),
       token('}', null, null),
       token('mixin', null, null),
-      token('D', 'dart:core;Type', ['declaration']),
+      token('D', 'Type',
+          ['declaration']), //token('D', 'dart:core;Type', ['declaration']),
       token('on', null, null),
-      token('A', 'dart:core;Type<$testFileUri;A>', ['reference']),
+      token('A', 'dart:core;Type<A>', [
+        'reference'
+      ]), //token('A', 'dart:core;Type<$testFileUri;A>', ['reference']),
       token('implements', null, null),
-      token('B', 'dart:core;Type<$testFileUri;B>', ['reference']),
+      token('B', 'dart:core;Type<B>', [
+        'reference'
+      ]), //token('B', 'dart:core;Type<$testFileUri;B>', ['reference']),
       token('{', null, null),
       token('}', null, null),
     ]);
@@ -1134,15 +1184,23 @@
   return p;
 }
 ''', [
-      token('int', 'dart:core;Type<dart:core;int>', ['reference']),
-      token('f', 'dart:core;int Function(dart:core;int)', ['declaration']),
+      token('int', 'dart:core;Type<int>', [
+        'reference'
+      ]), //token('int', 'dart:core;Type<dart:core;int>', ['reference']),
+      token('f', 'int Function(int)', [
+        'declaration'
+      ]), //token('f', 'dart:core;int Function(dart:core;int)', ['declaration']),
       token('(', null, null),
-      token('int', 'dart:core;Type<dart:core;int>', ['reference']),
-      token('p', 'dart:core;int', ['declaration']),
+      token('int', 'dart:core;Type<int>', [
+        'reference'
+      ]), //token('int', 'dart:core;Type<dart:core;int>', ['reference']),
+      token('p', 'int',
+          ['declaration']), //token('p', 'dart:core;int', ['declaration']),
       token(')', null, null),
       token('{', null, null),
       token('return', null, null),
-      token('p', 'dart:core;int', ['reference']),
+      token('p', 'int',
+          ['reference']), //token('p', 'dart:core;int', ['reference']),
       token(';', null, null),
       token('}', null, null),
     ]);
@@ -1153,8 +1211,11 @@
 /// Doc comment [x] with reference.
 int x;
 ''', [
-      token('int', 'dart:core;Type<dart:core;int>', ['reference']),
-      token('x', 'dart:core;int', ['declaration']),
+      token('int', 'dart:core;Type<int>', [
+        'reference'
+      ]), //token('int', 'dart:core;Type<dart:core;int>', ['reference']),
+      token('x', 'int',
+          ['declaration']), //token('x', 'dart:core;int', ['declaration']),
       token(';', null, null),
     ]);
   }
diff --git a/pkg/analysis_server/test/domain_edit_dartfix_test.dart b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
index 8a0e7b0..930f08a 100644
--- a/pkg/analysis_server/test/domain_edit_dartfix_test.dart
+++ b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
@@ -68,6 +68,31 @@
     testFile = resourceProvider.convertPath('/project/lib/fileToBeFixed.dart');
   }
 
+  test_dartfix_collection_if_elements() async {
+    // Add analysis options to enable ui as code
+    newFile('/project/analysis_options.yaml', content: '''
+analyzer:
+  enable-experiment:
+    - control-flow-collections
+    - spread-collections
+''');
+    addTestFile('''
+f(bool b) {
+  return ['a', b ? 'c' : 'd', 'e'];
+}
+''');
+    createProject();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['collection-if-elements']);
+    expect(result.suggestions.length, greaterThanOrEqualTo(1));
+    expect(result.hasErrors, isFalse);
+    expectEdits(result.edits, '''
+f(bool b) {
+  return ['a', if (b) 'c' else 'd', 'e'];
+}
+''');
+  }
+
   test_dartfix_convertClassToMixin() async {
     addTestFile('''
 class A {}
@@ -98,6 +123,52 @@
     ''');
   }
 
+  test_dartfix_excludedSource() async {
+    // Add analysis options to exclude the lib directory then reanalyze
+    newFile('/project/analysis_options.yaml', content: '''
+analyzer:
+  exclude:
+    - lib/**
+''');
+
+    addTestFile('''
+const double myDouble = 42.0;
+    ''');
+    createProject();
+
+    // Assert no suggestions now that source has been excluded
+    final result = await performFix();
+    expect(result.suggestions, hasLength(0));
+    expect(result.edits, hasLength(0));
+  }
+
+  test_dartfix_map_for_elements() async {
+    // Add analysis options to enable ui as code
+    newFile('/project/analysis_options.yaml', content: '''
+analyzer:
+  enable-experiment:
+    - control-flow-collections
+    - spread-collections
+''');
+    addTestFile('''
+f(Iterable<int> i) {
+  var k = 3;
+  return Map.fromIterable(i, key: (k) => k * 2, value: (v) => k);
+}
+''');
+    createProject();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['map-for-elements']);
+    expect(result.suggestions.length, greaterThanOrEqualTo(1));
+    expect(result.hasErrors, isFalse);
+    expectEdits(result.edits, '''
+f(Iterable<int> i) {
+  var k = 3;
+  return { for (var e in i) e * 2 : k };
+}
+''');
+  }
+
   test_dartfix_moveTypeArgumentToClass() async {
     addTestFile('''
 class A<T> { A.from(Object obj) { } }
@@ -217,25 +288,6 @@
 ''');
   }
 
-  test_dartfix_excludedSource() async {
-    // Add analysis options to exclude the lib directory then reanalyze
-    newFile('/project/analysis_options.yaml', content: '''
-analyzer:
-  exclude:
-    - lib/**
-''');
-
-    addTestFile('''
-const double myDouble = 42.0;
-    ''');
-    createProject();
-
-    // Assert no suggestions now that source has been excluded
-    final result = await performFix();
-    expect(result.suggestions, hasLength(0));
-    expect(result.edits, hasLength(0));
-  }
-
   test_dartfix_partFile() async {
     newFile('/project/lib/lib.dart', content: '''
 library lib2;
@@ -283,7 +335,8 @@
     - spread-collections
 ''');
     addTestFile('''
-var l = ['a']..addAll(['b']);
+var l1 = ['b'];
+var l2 = ['a']..addAll(l1);
 ''');
     createProject();
     EditDartfixResult result =
@@ -291,59 +344,8 @@
     expect(result.suggestions.length, greaterThanOrEqualTo(1));
     expect(result.hasErrors, isFalse);
     expectEdits(result.edits, '''
-var l = ['a', ...['b']];
-''');
-  }
-
-  test_dartfix_collection_if_elements() async {
-    // Add analysis options to enable ui as code
-    newFile('/project/analysis_options.yaml', content: '''
-analyzer:
-  enable-experiment:
-    - control-flow-collections
-    - spread-collections
-''');
-    addTestFile('''
-f(bool b) {
-  return ['a', b ? 'c' : 'd', 'e'];
-}
-''');
-    createProject();
-    EditDartfixResult result =
-        await performFix(includedFixes: ['collection-if-elements']);
-    expect(result.suggestions.length, greaterThanOrEqualTo(1));
-    expect(result.hasErrors, isFalse);
-    expectEdits(result.edits, '''
-f(bool b) {
-  return ['a', if (b) 'c' else 'd', 'e'];
-}
-''');
-  }
-
-  test_dartfix_map_for_elements() async {
-    // Add analysis options to enable ui as code
-    newFile('/project/analysis_options.yaml', content: '''
-analyzer:
-  enable-experiment:
-    - control-flow-collections
-    - spread-collections
-''');
-    addTestFile('''
-f(Iterable<int> i) {
-  var k = 3;
-  return Map.fromIterable(i, key: (k) => k * 2, value: (v) => k);
-}
-''');
-    createProject();
-    EditDartfixResult result =
-        await performFix(includedFixes: ['map-for-elements']);
-    expect(result.suggestions.length, greaterThanOrEqualTo(1));
-    expect(result.hasErrors, isFalse);
-    expectEdits(result.edits, '''
-f(Iterable<int> i) {
-  var k = 3;
-  return { for (var e in i) e * 2 : k };
-}
+var l1 = ['b'];
+var l2 = ['a', ...l1];
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
index 03fa79b..d94ac33 100644
--- a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
@@ -93,7 +93,8 @@
       "startColumn": 5
     },
     "flags": 0,
-    "parameters": "()"
+    "parameters": "()",
+    "returnType": "A"
   },
   "parameterNames": [],
   "parameterTypes": [],
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
index d026fb3..6242b56 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
@@ -41,7 +41,7 @@
 ''');
   }
 
-  test_addAll_expression_to_emptyList() async {
+  test_addAll_expression_toEmptyList() async {
     await resolveTestUnit('''
 f() {
   var ints = [1, 2, 3];
@@ -57,12 +57,11 @@
   }
 
   test_addAll_literal() async {
+    // This case is covered by the INLINE_INVOCATION assist.
     await resolveTestUnit('''
 var l = ['a']..add/*caret*/All(['b'])..addAll(['c']);
 ''');
-    await assertHasAssist('''
-var l = ['a', ...['b']]..addAll(['c']);
-''');
+    await assertNoAssist();
   }
 
   test_addAll_nonLiteralTarget() async {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
new file mode 100644
index 0000000..a183e7f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2019, 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:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InlineInvocationTest);
+  });
+}
+
+@reflectiveTest
+class InlineInvocationTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.INLINE_INVOCATION;
+
+  void setUp() {
+    createAnalysisOptionsFile(experiments: [EnableString.spread_collections]);
+    super.setUp();
+  }
+
+  test_add_emptyTarget() async {
+    await resolveTestUnit('''
+var l = []..ad/*caret*/d('a')..add('b');
+''');
+    await assertHasAssist('''
+var l = ['a']..add('b');
+''');
+  }
+
+  test_add_nonEmptyTarget() async {
+    await resolveTestUnit('''
+var l = ['a']..ad/*caret*/d('b')..add('c');
+''');
+    await assertHasAssist('''
+var l = ['a', 'b']..add('c');
+''');
+  }
+
+  test_add_nonLiteralArgument() async {
+    await resolveTestUnit('''
+var e = 'b';
+var l = ['a']..add/*caret*/(e);
+''');
+    await assertHasAssist('''
+var e = 'b';
+var l = ['a', e];
+''');
+  }
+
+  test_add_nonLiteralTarget() async {
+    await resolveTestUnit('''
+var l1 = [];
+var l2 = l1..ad/*caret*/d('b')..add('c');
+''');
+    await assertNoAssist();
+  }
+
+  test_add_notFirst() async {
+    await resolveTestUnit('''
+var l = ['a']..add('b')../*caret*/add('c');
+''');
+    await assertNoAssist();
+  }
+
+  test_addAll_emptyTarget() async {
+    await resolveTestUnit('''
+var l = []..add/*caret*/All(['a'])..addAll(['b']);
+''');
+    await assertHasAssist('''
+var l = ['a']..addAll(['b']);
+''');
+  }
+
+  test_addAll_nonEmptyTarget() async {
+    await resolveTestUnit('''
+var l = ['a']..add/*caret*/All(['b'])..addAll(['c']);
+''');
+    await assertHasAssist('''
+var l = ['a', 'b']..addAll(['c']);
+''');
+  }
+
+  test_addAll_nonLiteralArgument() async {
+    await resolveTestUnit('''
+var l1 = <String>[];
+var l2 = ['a']..add/*caret*/All(l1);
+''');
+    await assertNoAssist();
+  }
+
+  test_addAll_nonLiteralTarget() async {
+    await resolveTestUnit('''
+var l1 = [];
+var l2 = l1..addAl/*caret*/l(['b'])..addAll(['c']);
+''');
+    await assertNoAssist();
+  }
+
+  test_addAll_notFirst() async {
+    await resolveTestUnit('''
+var l = ['a']..addAll(['b'])../*caret*/addAll(['c']);
+''');
+    await assertNoAssist();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index bcf631e..bc906ab 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -56,6 +56,7 @@
 import 'flutter_wrap_row_test.dart' as flutter_wrap_row;
 import 'flutter_wrap_stream_builder_test.dart' as flutter_wrap_stream_builder;
 import 'import_add_show_test.dart' as import_add_show;
+import 'inline_invocation_test.dart' as inline_invocation;
 import 'introduce_local_cast_type_test.dart' as introduce_local_cast_type;
 import 'invert_if_statement_test.dart' as invert_if_statement;
 import 'join_if_with_inner_test.dart' as join_if_with_inner;
@@ -125,6 +126,7 @@
     flutter_wrap_row.main();
     flutter_wrap_stream_builder.main();
     import_add_show.main();
+    inline_invocation.main();
     introduce_local_cast_type.main();
     invert_if_statement.main();
     join_if_with_inner.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_setting_test.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_setting_test.dart
index 5a19c8b..548d53a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_setting_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_setting_test.dart
@@ -2,21 +2,9 @@
 // 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:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/src/protocol_server.dart' show SourceEdit;
-import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart';
-import 'package:analyzer/error/error.dart' as engine;
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/options.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart'
-    show SourceFileEdit;
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'package:yaml/src/yaml_node.dart';
+
+import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -24,52 +12,16 @@
   });
 }
 
-class NonDartFixTest with ResourceProviderMixin {
-  Future<void> assertHasFix(
-      String initialContent, String location, String expectedContent) async {
-    File optionsFile = resourceProvider.getFile('/analysis_options.yaml');
-    SourceFactory sourceFactory = new SourceFactory([]);
-    List<engine.AnalysisError> errors = analyzeAnalysisOptions(
-        optionsFile.createSource(), initialContent, sourceFactory);
-    expect(errors, hasLength(1));
-    engine.AnalysisError error = errors[0];
-    YamlMap options = _getOptions(sourceFactory, initialContent);
-    AnalysisOptionsFixGenerator generator =
-        new AnalysisOptionsFixGenerator(error, initialContent, options);
-    List<Fix> fixes = await generator.computeFixes();
-    expect(fixes, hasLength(1));
-    List<SourceFileEdit> fileEdits = fixes[0].change.edits;
-    expect(fileEdits, hasLength(1));
-
-    String actualContent =
-        SourceEdit.applySequence(initialContent, fileEdits[0].edits);
-    expect(actualContent, expectedContent);
-  }
-
-  YamlMap _getOptions(SourceFactory sourceFactory, String content) {
-    AnalysisOptionsProvider optionsProvider =
-        new AnalysisOptionsProvider(sourceFactory);
-    try {
-      return optionsProvider.getOptionsFromString(content);
-    } on OptionsFormatException {
-      return null;
-    }
-  }
-}
-
 @reflectiveTest
-class RemoveSettingTest extends NonDartFixTest {
+class RemoveSettingTest extends AnalysisOptionsFixTest {
   test_enableSuperMixins() async {
-    await assertHasFix(
-        '''
+    await assertHasFix('''
 analyzer:
   enable-experiment:
     - non-nullable
   language:
     enableSuperMixins: true
-''',
-        'enable',
-        '''
+''', '''
 analyzer:
   enable-experiment:
     - non-nullable
@@ -77,15 +29,12 @@
   }
 
   test_invalidExperiment_first() async {
-    await assertHasFix(
-        '''
+    await assertHasFix('''
 analyzer:
   enable-experiment:
     - not-an-experiment
     - non-nullable
-''',
-        'not-',
-        '''
+''', '''
 analyzer:
   enable-experiment:
     - non-nullable
@@ -93,15 +42,12 @@
   }
 
   test_invalidExperiment_last() async {
-    await assertHasFix(
-        '''
+    await assertHasFix('''
 analyzer:
   enable-experiment:
     - non-nullable
     - not-an-experiment
-''',
-        'not-',
-        '''
+''', '''
 analyzer:
   enable-experiment:
     - non-nullable
@@ -109,14 +55,11 @@
   }
 
   test_invalidExperiment_only() async {
-    await assertHasFix(
-        '''
+    await assertHasFix('''
 analyzer:
   enable-experiment:
     - not-an-experiment
-''',
-        'not-',
-        '''
+''', '''
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart
new file mode 100644
index 0000000..23d6dc3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_support.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2019, 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:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/protocol_server.dart' show SourceEdit;
+import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart';
+import 'package:analyzer/error/error.dart' as engine;
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    show SourceFileEdit;
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:test/test.dart';
+import 'package:yaml/src/yaml_node.dart';
+import 'package:yaml/yaml.dart';
+
+/// A base class providing utility methods for tests of fixes associated with
+/// errors in Dart files.
+class AnalysisOptionsFixTest with ResourceProviderMixin {
+  Future<void> assertHasFix(
+      String initialContent, String expectedContent) async {
+    List<Fix> fixes = await _getFixes(initialContent);
+    expect(fixes, hasLength(1));
+    List<SourceFileEdit> fileEdits = fixes[0].change.edits;
+    expect(fileEdits, hasLength(1));
+
+    String actualContent =
+        SourceEdit.applySequence(initialContent, fileEdits[0].edits);
+    expect(actualContent, expectedContent);
+  }
+
+  Future<void> assertHasNoFix(String initialContent) async {
+    List<Fix> fixes = await _getFixes(initialContent);
+    expect(fixes, hasLength(0));
+  }
+
+  Future<List<Fix>> _getFixes(String content) {
+    File optionsFile = getFile('/analysis_options.yaml');
+    SourceFactory sourceFactory = new SourceFactory([]);
+    List<engine.AnalysisError> errors = analyzeAnalysisOptions(
+        optionsFile.createSource(), content, sourceFactory);
+    expect(errors, hasLength(1));
+    engine.AnalysisError error = errors[0];
+    YamlMap options = _parseYaml(content);
+    AnalysisOptionsFixGenerator generator =
+        new AnalysisOptionsFixGenerator(error, content, options);
+    return generator.computeFixes();
+  }
+
+  YamlMap _parseYaml(String content) {
+    if (content == null) {
+      return new YamlMap();
+    }
+    try {
+      YamlNode doc = loadYamlNode(content);
+      if (doc is YamlMap) {
+        return doc;
+      }
+      return new YamlMap();
+    } catch (exception) {
+      return null;
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/manifest/test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/manifest/test_support.dart
new file mode 100644
index 0000000..31347b93
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/manifest/test_support.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2019, 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:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/protocol_server.dart' show SourceEdit;
+import 'package:analysis_server/src/services/correction/fix/manifest/fix_generator.dart';
+import 'package:analyzer/error/error.dart' as engine;
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/manifest/manifest_validator.dart';
+import 'package:analyzer/src/manifest/manifest_values.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    show SourceFileEdit;
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:test/test.dart';
+
+/// A base class providing utility methods for tests of fixes associated with
+/// errors in Android manifest files.
+class ManifestFixTest with ResourceProviderMixin {
+  Future<void> assertHasFix(
+      String initialContent, String expectedContent) async {
+    List<Fix> fixes = await _getFixes(initialContent);
+    expect(fixes, hasLength(1));
+    List<SourceFileEdit> fileEdits = fixes[0].change.edits;
+    expect(fileEdits, hasLength(1));
+
+    String actualContent =
+        SourceEdit.applySequence(initialContent, fileEdits[0].edits);
+    expect(actualContent, expectedContent);
+  }
+
+  Future<void> assertHasNoFix(String initialContent) async {
+    List<Fix> fixes = await _getFixes(initialContent);
+    expect(fixes, hasLength(0));
+  }
+
+  Future<List<Fix>> _getFixes(String content) {
+    File manifestFile = getFile('/package/AndroidManifest.xml');
+    DocumentFragment document =
+        parseFragment(content, container: MANIFEST_TAG, generateSpans: true);
+    expect(document, isNotNull);
+    ManifestValidator validator =
+        new ManifestValidator(manifestFile.createSource());
+    List<engine.AnalysisError> errors = validator.validate(content, true);
+    expect(errors, hasLength(1));
+    engine.AnalysisError error = errors[0];
+    ManifestFixGenerator generator =
+        new ManifestFixGenerator(error, content, document);
+    return generator.computeFixes();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/pubspec/test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/pubspec/test_support.dart
new file mode 100644
index 0000000..c884474
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/pubspec/test_support.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2019, 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:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/protocol_server.dart' show SourceEdit;
+import 'package:analysis_server/src/services/correction/fix/pubspec/fix_generator.dart';
+import 'package:analyzer/error/error.dart' as engine;
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/pubspec/pubspec_validator.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    show SourceFileEdit;
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:test/test.dart';
+import 'package:yaml/src/yaml_node.dart';
+import 'package:yaml/yaml.dart';
+
+/// A base class providing utility methods for tests of fixes associated with
+/// errors in pubspec files.
+class PubspecFixTest with ResourceProviderMixin {
+  Future<void> assertHasFix(
+      String initialContent, String expectedContent) async {
+    List<Fix> fixes = await _getFixes(initialContent);
+    expect(fixes, hasLength(1));
+    List<SourceFileEdit> fileEdits = fixes[0].change.edits;
+    expect(fileEdits, hasLength(1));
+
+    String actualContent =
+        SourceEdit.applySequence(initialContent, fileEdits[0].edits);
+    expect(actualContent, expectedContent);
+  }
+
+  Future<void> assertHasNoFix(String initialContent) async {
+    List<Fix> fixes = await _getFixes(initialContent);
+    expect(fixes, hasLength(0));
+  }
+
+  Future<List<Fix>> _getFixes(String content) {
+    File pubspecFile = getFile('/package/pubspec.yaml');
+    YamlMap pubspec = _parseYaml(content);
+    expect(pubspec, isNotNull);
+    PubspecValidator validator =
+        new PubspecValidator(resourceProvider, pubspecFile.createSource());
+    List<engine.AnalysisError> errors = validator.validate(pubspec.nodes);
+    expect(errors, hasLength(1));
+    engine.AnalysisError error = errors[0];
+    PubspecFixGenerator generator =
+        new PubspecFixGenerator(error, content, pubspec);
+    return generator.computeFixes();
+  }
+
+  YamlMap _parseYaml(String content) {
+    if (content == null) {
+      return new YamlMap();
+    }
+    try {
+      YamlNode doc = loadYamlNode(content);
+      if (doc is YamlMap) {
+        return doc;
+      }
+      return new YamlMap();
+    } catch (exception) {
+      return null;
+    }
+  }
+}
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index 5a0e443..2cb3562 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -533,9 +533,11 @@
   Element element = Element.fromJson(elementObject);
   int offset = outlineObject.get("offset").getAsInt();
   int length = outlineObject.get("length").getAsInt();
+  int codeOffset = outlineObject.get("codeOffset").getAsInt();
+  int codeLength = outlineObject.get("codeLength").getAsInt();
 
   // create outline object
-  Outline outline = new Outline(parent, element, offset, length);
+  Outline outline = new Outline(parent, element, offset, length, codeOffset, codeLength);
 
   // compute children recursively
   List<Outline> childrenList = Lists.newArrayList();
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index da73811..7249cad 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AddContentOverlay.java b/pkg/analysis_server/tool/spec/generated/java/types/AddContentOverlay.java
index e3fad08..86a7416 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AddContentOverlay.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AddContentOverlay.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java
index 6bb4c35..24a3fdc 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorFixes.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorFixes.java
index 78cc51f..098fc96 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorFixes.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorFixes.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorSeverity.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorSeverity.java
index 96166f9..7206867 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorSeverity.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorSeverity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorType.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorType.java
index 3c4d6d9..f17a385 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorType.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisErrorType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java
index 8fb0076..0e1e94f 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisService.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisService.java
index 3076de6..9e6c9f1 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisService.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisStatus.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisStatus.java
index c1dfdc9..0900624 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisStatus.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisStatus.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java
index d7fc466..488d3c9 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestionSet.java b/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestionSet.java
index 570ef61..26586dc 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestionSet.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AvailableSuggestionSet.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ChangeContentOverlay.java b/pkg/analysis_server/tool/spec/generated/java/types/ChangeContentOverlay.java
index 86784d9..c1fb108 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ChangeContentOverlay.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ChangeContentOverlay.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ClosingLabel.java b/pkg/analysis_server/tool/spec/generated/java/types/ClosingLabel.java
index 75506c0..ee4c125 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ClosingLabel.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ClosingLabel.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionService.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionService.java
index d7a0d19..5007ebd 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/CompletionService.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
index 8b87048..28e0a81 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestionKind.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestionKind.java
index b94893d..e7595aa 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestionKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestionKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ContextData.java b/pkg/analysis_server/tool/spec/generated/java/types/ContextData.java
index c094e21..6d14ea8 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ContextData.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ContextData.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/DartFix.java b/pkg/analysis_server/tool/spec/generated/java/types/DartFix.java
index b441025..0669805 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/DartFix.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/DartFix.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/DartFixSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/DartFixSuggestion.java
index 7a106f8..b40cb10 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/DartFixSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/DartFixSuggestion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/Element.java b/pkg/analysis_server/tool/spec/generated/java/types/Element.java
index d1cfc65..80f51fb 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/Element.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/Element.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ElementDeclaration.java b/pkg/analysis_server/tool/spec/generated/java/types/ElementDeclaration.java
index 47b4534..393fcee 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ElementDeclaration.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ElementDeclaration.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java b/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
index 17fe527..2ac5f3e 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExecutableFile.java b/pkg/analysis_server/tool/spec/generated/java/types/ExecutableFile.java
index 00ee0b1..331332e 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExecutableFile.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExecutableFile.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExecutableKind.java b/pkg/analysis_server/tool/spec/generated/java/types/ExecutableKind.java
index 0882e91..7bbc97f 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExecutableKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExecutableKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExecutionService.java b/pkg/analysis_server/tool/spec/generated/java/types/ExecutionService.java
index 1a6e868..f8770b7 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExecutionService.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExecutionService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableFeedback.java
index 6cd016e..31d12df 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableOptions.java
index f7e951c..1bb7400 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExtractLocalVariableOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodFeedback.java
index 0a0125c..729480d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodOptions.java
index a6127cfe..399482b 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExtractMethodOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetFeedback.java
index 720c686..3a31de0 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetOptions.java
index d526b78..cb3e520 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ExtractWidgetOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FileKind.java b/pkg/analysis_server/tool/spec/generated/java/types/FileKind.java
index b282ce8..9fda96d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FileKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FileKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java
index 9bc666b..52029e0 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java
index b18dbe9..b02f3ae 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineKind.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineKind.java
index b083a9d..271fd31 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterService.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterService.java
index cc71a7c..607780d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FlutterService.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java b/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java
index d30381c..8ae6957 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FoldingKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FoldingRegion.java b/pkg/analysis_server/tool/spec/generated/java/types/FoldingRegion.java
index 8cce15c..3f6f408 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FoldingRegion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FoldingRegion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/GeneralAnalysisService.java b/pkg/analysis_server/tool/spec/generated/java/types/GeneralAnalysisService.java
index d3ac75e..075184b 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/GeneralAnalysisService.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/GeneralAnalysisService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegion.java b/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegion.java
index 8ea3562..fdb868d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java b/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java
index 4ae12e2..21d7fbc 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/HighlightRegionType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java b/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java
index a860fd2..463b420 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/HoverInformation.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ImplementedClass.java b/pkg/analysis_server/tool/spec/generated/java/types/ImplementedClass.java
index 54505e1..e81d14a 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ImplementedClass.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ImplementedClass.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ImplementedMember.java b/pkg/analysis_server/tool/spec/generated/java/types/ImplementedMember.java
index 64fab48..200ec62 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ImplementedMember.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ImplementedMember.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ImportedElements.java b/pkg/analysis_server/tool/spec/generated/java/types/ImportedElements.java
index afa9e17..cf7f31f 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ImportedElements.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ImportedElements.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java
index 0db15bd..05e9574 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionRelevanceTag.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java
index 808e465..c9e0af9 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/IncludedSuggestionSet.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/InlineLocalVariableFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/InlineLocalVariableFeedback.java
index 13f871c..30930b3 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/InlineLocalVariableFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/InlineLocalVariableFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodFeedback.java
index c9cd093..725d973 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodOptions.java
index 8f1619d..a647368 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/InlineMethodOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/KytheEntry.java b/pkg/analysis_server/tool/spec/generated/java/types/KytheEntry.java
index 76f9a30..9efb62a 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/KytheEntry.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/KytheEntry.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/KytheVName.java b/pkg/analysis_server/tool/spec/generated/java/types/KytheVName.java
index d9e6e62..eeda647 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/KytheVName.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/KytheVName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/LibraryPathSet.java b/pkg/analysis_server/tool/spec/generated/java/types/LibraryPathSet.java
index de46030..1e3c7dd 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/LibraryPathSet.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/LibraryPathSet.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditGroup.java b/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditGroup.java
index dacc0e1..c315c1c 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditGroup.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditGroup.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestion.java
index fe31f3a..2afb4f5 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestionKind.java b/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestionKind.java
index 791789a..120d83c 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestionKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/LinkedEditSuggestionKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/Location.java b/pkg/analysis_server/tool/spec/generated/java/types/Location.java
index dce3fb7..2daf9de 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/Location.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/Location.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/MoveFileOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/MoveFileOptions.java
index 29c172a..f605b97 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/MoveFileOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/MoveFileOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/NavigationRegion.java b/pkg/analysis_server/tool/spec/generated/java/types/NavigationRegion.java
index 6b4a202..00fc4ca 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/NavigationRegion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/NavigationRegion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/NavigationTarget.java b/pkg/analysis_server/tool/spec/generated/java/types/NavigationTarget.java
index d2a8fb8..a52c112 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/NavigationTarget.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/NavigationTarget.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/Occurrences.java b/pkg/analysis_server/tool/spec/generated/java/types/Occurrences.java
index e971c4c..9d2ce11 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/Occurrences.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/Occurrences.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/Outline.java b/pkg/analysis_server/tool/spec/generated/java/types/Outline.java
index 658a494..3d2c5be 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/Outline.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/Outline.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
@@ -103,9 +103,11 @@
     Element element = Element.fromJson(elementObject);
     int offset = outlineObject.get("offset").getAsInt();
     int length = outlineObject.get("length").getAsInt();
+    int codeOffset = outlineObject.get("codeOffset").getAsInt();
+    int codeLength = outlineObject.get("codeLength").getAsInt();
 
     // create outline object
-    Outline outline = new Outline(parent, element, offset, length);
+    Outline outline = new Outline(parent, element, offset, length, codeOffset, codeLength);
 
     // compute children recursively
     List<Outline> childrenList = Lists.newArrayList();
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/OverriddenMember.java b/pkg/analysis_server/tool/spec/generated/java/types/OverriddenMember.java
index 052a3e6..fd07ef6 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/OverriddenMember.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/OverriddenMember.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/OverrideMember.java b/pkg/analysis_server/tool/spec/generated/java/types/OverrideMember.java
index ca395c6..a60e46c 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/OverrideMember.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/OverrideMember.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ParameterInfo.java b/pkg/analysis_server/tool/spec/generated/java/types/ParameterInfo.java
index 7855e12..38131d3 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ParameterInfo.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ParameterInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ParameterKind.java b/pkg/analysis_server/tool/spec/generated/java/types/ParameterKind.java
index 4073993..43f3e4d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ParameterKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ParameterKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/Position.java b/pkg/analysis_server/tool/spec/generated/java/types/Position.java
index 349ec6a..7b17db3 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/Position.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/Position.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/PostfixTemplateDescriptor.java b/pkg/analysis_server/tool/spec/generated/java/types/PostfixTemplateDescriptor.java
index 7b85f64..f1099a7 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/PostfixTemplateDescriptor.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/PostfixTemplateDescriptor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/PubStatus.java b/pkg/analysis_server/tool/spec/generated/java/types/PubStatus.java
index 0d28027..77c6b5f 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/PubStatus.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/PubStatus.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringFeedback.java
index 13d2bbd..ea68aaf 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringKind.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringKind.java
index c2d9a9c..228c0ea 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameter.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameter.java
index e69bccf..362044f 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameter.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameterKind.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameterKind.java
index d7025cf..03c56d5 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameterKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringMethodParameterKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringOptions.java
index 1a352f7..64c7028 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblem.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblem.java
index f0ee4b1..4caaf12 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblem.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblem.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblemSeverity.java b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblemSeverity.java
index 684f09f..569d3ff 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblemSeverity.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RefactoringProblemSeverity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RemoveContentOverlay.java b/pkg/analysis_server/tool/spec/generated/java/types/RemoveContentOverlay.java
index 8b53cbd..4adc36c 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RemoveContentOverlay.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RemoveContentOverlay.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RenameFeedback.java b/pkg/analysis_server/tool/spec/generated/java/types/RenameFeedback.java
index 72b58a1..eac650a1 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RenameFeedback.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RenameFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RenameOptions.java b/pkg/analysis_server/tool/spec/generated/java/types/RenameOptions.java
index a9a63a5..2fa6367 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RenameOptions.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RenameOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RequestError.java b/pkg/analysis_server/tool/spec/generated/java/types/RequestError.java
index 6d9eb4d..0cdab8b 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RequestError.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RequestError.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
index dbd738a..aa8e173 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpression.java b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpression.java
index b2d6b70..85a9c41 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpression.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpression.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionType.java b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionType.java
index 5645384..c080810 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionType.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionTypeKind.java b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionTypeKind.java
index 6f74132..c63089e 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionTypeKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionExpressionTypeKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionVariable.java b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionVariable.java
index 62a0fb5..a54d799 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionVariable.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RuntimeCompletionVariable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/SearchResult.java b/pkg/analysis_server/tool/spec/generated/java/types/SearchResult.java
index f741485..f139e07 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/SearchResult.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/SearchResult.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/SearchResultKind.java b/pkg/analysis_server/tool/spec/generated/java/types/SearchResultKind.java
index fe02fb5..d22f7cb 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/SearchResultKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/SearchResultKind.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ServerService.java b/pkg/analysis_server/tool/spec/generated/java/types/ServerService.java
index 7680299..fed7a98 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ServerService.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ServerService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java b/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java
index bddcbc9..55b2761 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/SourceChange.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/SourceEdit.java b/pkg/analysis_server/tool/spec/generated/java/types/SourceEdit.java
index f5a0f86..41210ff 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/SourceEdit.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/SourceEdit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/SourceFileEdit.java b/pkg/analysis_server/tool/spec/generated/java/types/SourceFileEdit.java
index fdc0fbf..b2d6996 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/SourceFileEdit.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/SourceFileEdit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java b/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
index 071328a..b9cc17e 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/TypeHierarchyItem.java b/pkg/analysis_server/tool/spec/generated/java/types/TypeHierarchyItem.java
index 6ae2f59..156ec7d 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/TypeHierarchyItem.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/TypeHierarchyItem.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) 2019, 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.
  *
diff --git a/pkg/analysis_tool/lib/tools.dart b/pkg/analysis_tool/lib/tools.dart
index 74dd816..831014e 100644
--- a/pkg/analysis_tool/lib/tools.dart
+++ b/pkg/analysis_tool/lib/tools.dart
@@ -159,7 +159,7 @@
     if (codeGeneratorSettings.languageName == 'java') {
       header = '''
 /*
- * Copyright (c) ${year ?? '2018'}, the Dart project authors. Please see the AUTHORS file
+ * Copyright (c) ${year ?? '2019'}, 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.
  *
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 3e5b2fa..bce36d6 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2309,8 +2309,8 @@
   /// Return `true` if this parameter is a required parameter. Required
   /// parameters are always positional.
   ///
-  /// Note: this will return `false` for a named parameter that is annotated with
-  /// the `@required` annotation.
+  /// Note: this will return `false` for a named parameter that is annotated
+  /// with the `@required` annotation.
   bool get isRequired;
 
   /// Return the kind of this parameter.
@@ -2319,6 +2319,9 @@
 
   /// Return the annotations associated with this parameter.
   NodeList<Annotation> get metadata;
+
+  /// The 'required' keyword, or `null` if the keyword was not used.
+  Token get requiredKeyword;
 }
 
 /// The formal parameter list of a method declaration, function declaration, or
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index ab5ef3d..f934c92 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -374,6 +374,7 @@
       {Comment comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       Token keyword,
       TypeAnnotation type,
       @required Token thisKeyword,
@@ -511,6 +512,7 @@
       {Comment comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       TypeAnnotation returnType,
       @required SimpleIdentifier identifier,
       TypeParameterList typeParameters,
@@ -800,6 +802,7 @@
       {Comment comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       Token keyword,
       TypeAnnotation type,
       @required SimpleIdentifier identifier});
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index f79078a..20b425d 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -46,6 +46,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
+import 'package:meta/meta.dart';
 
 /// An element that represents a class or a mixin. The class can be defined by
 /// either a class declaration (with a class body), a mixin application (without
@@ -1047,9 +1048,16 @@
   /// Return `true` if this field was explicitly marked as being covariant.
   bool get isCovariant;
 
-  /// Return {@code true} if this element is an enum constant.
+  /// Return `true` if this element is an enum constant.
   bool get isEnumConstant;
 
+  /// Return `true` if this field uses lazy evaluation semantics.
+  ///
+  /// This will always return `false` unless the experiment 'non-nullable' is
+  /// enabled.
+  @experimental
+  bool get isLazy;
+
   /// Returns `true` if this field can be overridden in strong mode.
   @deprecated
   bool get isVirtual;
@@ -1324,7 +1332,14 @@
 /// A local variable.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class LocalVariableElement implements LocalElement, VariableElement {}
+abstract class LocalVariableElement implements LocalElement, VariableElement {
+  /// Return `true` if this local variable uses lazy evaluation semantics.
+  ///
+  /// This will always return `false` unless the experiment 'non-nullable' is
+  /// enabled.
+  @experimental
+  bool get isLazy;
+}
 
 /// An element that represents a method defined within a type.
 ///
@@ -1395,10 +1410,12 @@
   bool get isNamed;
 
   /// Return `true` if this parameter is a required parameter. Required
-  /// parameters are always positional.
+  /// parameters are always positional, unless the experiment 'non-nullable' is
+  /// enabled, in which case named parameters can also be required.
   ///
-  /// Note: this will return `false` for a named parameter that is annotated
-  /// with the `@required` annotation.
+  /// Note: regardless of the state of the 'non-nullable' experiment, this will
+  /// return `false` for a named parameter that is annotated with the
+  /// `@required` annotation.
   // TODO(brianwilkerson) Rename this to `isRequired`.
   bool get isNotOptional;
 
diff --git a/pkg/analyzer/lib/dart/element/type_system.dart b/pkg/analyzer/lib/dart/element/type_system.dart
index 769a5d9..df6cbe8 100644
--- a/pkg/analyzer/lib/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/dart/element/type_system.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/type.dart';
+import 'package:meta/meta.dart';
 
 /// A representation of the operations defined for the type system.
 ///
@@ -50,6 +51,61 @@
   /// important.
   bool isAssignableTo(DartType leftType, DartType rightType);
 
+  /// Return `true` if the [type] is a non-nullable type.
+  ///
+  /// We say that a type `T` is non-nullable if `T <: Object`. This is
+  /// equivalent to the syntactic criterion that `T` is any of:
+  /// - `Object`, `int`, `bool`, `Never`, `Function`
+  /// - Any function type
+  /// - Any class type or generic class type
+  /// - `FutureOr<S>` where `S` is non-nullable
+  /// - `X extends S` where `S` is non-nullable
+  /// - `X & S` where `S` is non-nullable
+  ///
+  /// The result of this method is undefined when the experiment 'non-nullable'
+  /// is not enabled.
+  @experimental
+  bool isNonNullable(DartType type);
+
+  /// Return `true` if the [type] is a nullable type.
+  ///
+  /// We say that a type `T` is nullable if `Null <: T`. This is equivalent to
+  /// the syntactic criterion that `T` is any of:
+  /// - `Null`
+  /// - `S?` for some `S`
+  /// - `FutureOr<S>` for some `S` where `S` is nullable
+  /// - `dynamic`
+  /// - `void`
+  ///
+  /// The result of this method is undefined when the experiment 'non-nullable'
+  /// is not enabled.
+  @experimental
+  bool isNullable(DartType type);
+
+  /// Return `true` if the [type] is a potentially non-nullable type.
+  ///
+  /// We say that a type `T` is potentially non-nullable if `T` is not nullable.
+  /// Note that this is different from saying that `T` is non-nullable. For
+  /// example, a type variable `X extends Object?` is a type which is
+  /// potentially non-nullable but not non-nullable.
+  ///
+  /// The result of this method is undefined when the experiment 'non-nullable'
+  /// is not enabled.
+  @experimental
+  bool isPotentiallyNonNullable(DartType type);
+
+  /// Return `true` if the [type] is not a potentially nullable type.
+  ///
+  /// We say that a type `T` is potentially nullable if `T` is not non-nullable.
+  /// Note that this is different from saying that `T` is nullable. For example,
+  /// a type variable `X extends Object?` is a type which is potentially
+  /// nullable but not nullable.
+  ///
+  /// The result of this method is undefined when the experiment 'non-nullable'
+  /// is not enabled.
+  @experimental
+  bool isPotentiallyNullable(DartType type);
+
   /// Return `true` if the [leftType] is a subtype of the [rightType].
   ///
   /// For the Dart 2.0 type system, the rules governing the subtype relationship
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 266e0f2..6d2713d 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -235,6 +235,11 @@
   CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS,
   CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
   CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+  CompileTimeErrorCode.NULLABLE_TYPE_IN_CATCH_CLAUSE,
+  CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE,
+  CompileTimeErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE,
+  CompileTimeErrorCode.NULLABLE_TYPE_IN_ON_CLAUSE,
+  CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE,
   CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS,
   CompileTimeErrorCode.ON_REPEATED,
   CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR,
@@ -296,6 +301,8 @@
   HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
   HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
   HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
+  HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL,
+  HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION,
   HintCode.INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE,
   HintCode.INVALID_FACTORY_ANNOTATION,
   HintCode.INVALID_FACTORY_METHOD_DECL,
@@ -490,6 +497,7 @@
   ParserErrorCode.MISSING_TYPEDEF_PARAMETERS,
   ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH,
   ParserErrorCode.MIXED_PARAMETER_GROUPS,
+  ParserErrorCode.MODIFIER_OUT_OF_ORDER,
   ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES,
   ParserErrorCode.MULTIPLE_ON_CLAUSES,
   ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES,
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
index 4b86a47..54978bd 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
@@ -80,13 +80,13 @@
         IsExpired.non_nullable,
         'Non Nullable'),
     EnableString.control_flow_collections: const ExperimentalFeature(
-        2,
+        null,
         EnableString.control_flow_collections,
         IsEnabledByDefault.control_flow_collections,
         IsExpired.control_flow_collections,
         'Control Flow Collections'),
     EnableString.spread_collections: const ExperimentalFeature(
-        3,
+        null,
         EnableString.spread_collections,
         IsEnabledByDefault.spread_collections,
         IsExpired.spread_collections,
@@ -98,7 +98,7 @@
         IsExpired.set_literals,
         'Set Literals'),
     EnableString.triple_shift: const ExperimentalFeature(
-        4,
+        2,
         EnableString.triple_shift,
         IsEnabledByDefault.triple_shift,
         IsExpired.triple_shift,
@@ -131,9 +131,6 @@
       : _enableFlags = <bool>[
           constant_update_2018 ?? IsEnabledByDefault.constant_update_2018,
           non_nullable ?? IsEnabledByDefault.non_nullable,
-          control_flow_collections ??
-              IsEnabledByDefault.control_flow_collections,
-          spread_collections ?? IsEnabledByDefault.spread_collections,
           triple_shift ?? IsEnabledByDefault.triple_shift,
         ];
 
@@ -157,7 +154,7 @@
   bool get constant_update_2018 => _enableFlags[0];
 
   /// Current state for the flag "control_flow_collections"
-  bool get control_flow_collections => _enableFlags[2];
+  bool get control_flow_collections => true;
 
   /// Current state for the flag "non-nullable"
   bool get non_nullable => _enableFlags[1];
@@ -166,10 +163,10 @@
   bool get set_literals => true;
 
   /// Current state for the flag "spread_collections"
-  bool get spread_collections => _enableFlags[3];
+  bool get spread_collections => true;
 
   /// Current state for the flag "triple_shift"
-  bool get triple_shift => _enableFlags[4];
+  bool get triple_shift => _enableFlags[2];
 
   /// Queries whether the given [feature] is enabled or disabled.
   bool isEnabled(ExperimentalFeature feature) => feature.isExpired
@@ -188,7 +185,7 @@
   static const bool constant_update_2018 = false;
 
   /// Default state of the experiment "control-flow-collections"
-  static const bool control_flow_collections = false;
+  static const bool control_flow_collections = true;
 
   /// Default state of the experiment "non-nullable"
   static const bool non_nullable = false;
@@ -197,7 +194,7 @@
   static const bool set_literals = true;
 
   /// Default state of the experiment "spread-collections"
-  static const bool spread_collections = false;
+  static const bool spread_collections = true;
 
   /// Default state of the experiment "triple-shift"
   static const bool triple_shift = false;
@@ -217,7 +214,7 @@
   static const bool constant_update_2018 = false;
 
   /// Expiration status of the experiment "control-flow-collections"
-  static const bool control_flow_collections = false;
+  static const bool control_flow_collections = true;
 
   /// Expiration status of the experiment "non-nullable"
   static const bool non_nullable = false;
@@ -226,7 +223,7 @@
   static const bool set_literals = true;
 
   /// Expiration status of the experiment "spread-collections"
-  static const bool spread_collections = false;
+  static const bool spread_collections = true;
 
   /// Expiration status of the experiment "triple-shift"
   static const bool triple_shift = false;
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 72796b5..676b8dc 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -27,6 +27,7 @@
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:pub_semver/src/version.dart';
 
 /// Two or more string literals that are implicitly concatenated because of
 /// being adjacent (separated only by whitespace).
@@ -2043,6 +2044,8 @@
   @override
   CompilationUnitElement declaredElement;
 
+  Version languageVersion;
+
   /// The line information for this compilation unit.
   @override
   LineInfo lineInfo;
@@ -3060,6 +3063,9 @@
   }
 
   @override
+  Token get requiredKeyword => null;
+
+  @override
   E accept<E>(AstVisitor<E> visitor) =>
       visitor.visitDefaultFormalParameter(this);
 
@@ -3483,6 +3489,7 @@
 
   @override
   Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(keyword)
     ..add(_uri)
     ..addAll(combinators)
     ..add(semicolon);
@@ -3940,6 +3947,7 @@
       CommentImpl comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       this.keyword,
       TypeAnnotationImpl type,
       this.thisKeyword,
@@ -3947,7 +3955,8 @@
       SimpleIdentifierImpl identifier,
       TypeParameterListImpl typeParameters,
       FormalParameterListImpl parameters)
-      : super(comment, metadata, covariantKeyword, identifier) {
+      : super(
+            comment, metadata, covariantKeyword, requiredKeyword, identifier) {
     _type = _becomeParentOf(type);
     _typeParameters = _becomeParentOf(typeParameters);
     _parameters = _becomeParentOf(parameters);
@@ -5072,11 +5081,13 @@
       CommentImpl comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       TypeAnnotationImpl returnType,
       SimpleIdentifierImpl identifier,
       TypeParameterListImpl typeParameters,
       FormalParameterListImpl parameters)
-      : super(comment, metadata, covariantKeyword, identifier) {
+      : super(
+            comment, metadata, covariantKeyword, requiredKeyword, identifier) {
     _returnType = _becomeParentOf(returnType);
     _typeParameters = _becomeParentOf(typeParameters);
     _parameters = _becomeParentOf(parameters);
@@ -5649,6 +5660,7 @@
 
   @override
   Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(keyword)
     ..add(_uri)
     ..add(deferredKeyword)
     ..add(asKeyword)
@@ -7626,14 +7638,21 @@
   /// The 'covariant' keyword, or `null` if the keyword was not used.
   Token covariantKeyword;
 
+  /// The 'required' keyword, or `null` if the keyword was not used.
+  Token requiredKeyword;
+
   /// The name of the parameter being declared.
   SimpleIdentifierImpl _identifier;
 
   /// Initialize a newly created formal parameter. Either or both of the
   /// [comment] and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute.
-  NormalFormalParameterImpl(CommentImpl comment, List<Annotation> metadata,
-      this.covariantKeyword, SimpleIdentifierImpl identifier) {
+  NormalFormalParameterImpl(
+      CommentImpl comment,
+      List<Annotation> metadata,
+      this.covariantKeyword,
+      this.requiredKeyword,
+      SimpleIdentifierImpl identifier) {
     _comment = _becomeParentOf(comment);
     _metadata = new NodeListImpl<Annotation>(this, metadata);
     _identifier = _becomeParentOf(identifier);
@@ -8691,10 +8710,12 @@
       CommentImpl comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       this.keyword,
       TypeAnnotationImpl type,
       SimpleIdentifierImpl identifier)
-      : super(comment, metadata, covariantKeyword, identifier) {
+      : super(
+            comment, metadata, covariantKeyword, requiredKeyword, identifier) {
     _type = _becomeParentOf(type);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 2ce0985..deeded8 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -387,7 +387,7 @@
           SimpleIdentifier identifier,
           TypeParameterList typeParameters,
           FormalParameterList parameters) =>
-      new FieldFormalParameterImpl(comment, metadata, null, keyword, type,
+      new FieldFormalParameterImpl(comment, metadata, null, null, keyword, type,
           thisKeyword, period, identifier, typeParameters, parameters);
 
   @override
@@ -395,6 +395,7 @@
           {Comment comment,
           List<Annotation> metadata,
           Token covariantKeyword,
+          Token requiredKeyword,
           Token keyword,
           TypeAnnotation type,
           @required Token thisKeyword,
@@ -402,8 +403,18 @@
           @required SimpleIdentifier identifier,
           TypeParameterList typeParameters,
           FormalParameterList parameters}) =>
-      new FieldFormalParameterImpl(comment, metadata, covariantKeyword, keyword,
-          type, thisKeyword, period, identifier, typeParameters, parameters);
+      new FieldFormalParameterImpl(
+          comment,
+          metadata,
+          covariantKeyword,
+          requiredKeyword,
+          keyword,
+          type,
+          thisKeyword,
+          period,
+          identifier,
+          typeParameters,
+          parameters);
 
   @override
   ForEachPartsWithDeclaration forEachPartsWithDeclaration(
@@ -538,20 +549,21 @@
           SimpleIdentifier identifier,
           TypeParameterList typeParameters,
           FormalParameterList parameters) =>
-      new FunctionTypedFormalParameterImpl(comment, metadata, null, returnType,
-          identifier, typeParameters, parameters);
+      new FunctionTypedFormalParameterImpl(comment, metadata, null, null,
+          returnType, identifier, typeParameters, parameters);
 
   @override
   FunctionTypedFormalParameter functionTypedFormalParameter2(
           {Comment comment,
           List<Annotation> metadata,
           Token covariantKeyword,
+          Token requiredKeyword,
           TypeAnnotation returnType,
           @required SimpleIdentifier identifier,
           TypeParameterList typeParameters,
           @required FormalParameterList parameters}) =>
       new FunctionTypedFormalParameterImpl(comment, metadata, covariantKeyword,
-          returnType, identifier, typeParameters, parameters);
+          requiredKeyword, returnType, identifier, typeParameters, parameters);
 
   @override
   GenericFunctionType genericFunctionType(
@@ -875,18 +887,19 @@
           TypeAnnotation type,
           SimpleIdentifier identifier) =>
       new SimpleFormalParameterImpl(
-          comment, metadata, null, keyword, type, identifier);
+          comment, metadata, null, null, keyword, type, identifier);
 
   @override
   SimpleFormalParameter simpleFormalParameter2(
           {Comment comment,
           List<Annotation> metadata,
           Token covariantKeyword,
+          Token requiredKeyword,
           Token keyword,
           TypeAnnotation type,
           @required SimpleIdentifier identifier}) =>
-      new SimpleFormalParameterImpl(
-          comment, metadata, covariantKeyword, keyword, type, identifier);
+      new SimpleFormalParameterImpl(comment, metadata, covariantKeyword,
+          requiredKeyword, keyword, type, identifier);
 
   @override
   SimpleIdentifier simpleIdentifier(Token token, {bool isDeclaration: false}) {
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index f3c1805..97fac61 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -43,6 +43,8 @@
   /// The current library that is being analyzed.
   final LibraryElement _currentLibrary;
 
+  final bool _constantUpdate2018Enabled;
+
   ConstantEvaluationEngine _evaluationEngine;
 
   /// Initialize a newly created constant verifier.
@@ -52,7 +54,11 @@
       this._typeProvider, this.declaredVariables,
       {bool forAnalysisDriver: false})
       : _currentLibrary = currentLibrary,
-        _typeSystem = currentLibrary.context.typeSystem {
+        _typeSystem = currentLibrary.context.typeSystem,
+        _constantUpdate2018Enabled =
+            (currentLibrary.context.analysisOptions as AnalysisOptionsImpl)
+                .experimentStatus
+                .constant_update_2018 {
     this._intType = _typeProvider.intType;
     this._evaluationEngine = new ConstantEvaluationEngine(
         _typeProvider, declaredVariables,
@@ -613,6 +619,10 @@
       verifier._errorReporter.reportErrorForNode(errorCode, element);
       return false;
     } else if (element is IfElement) {
+      if (!verifier._constantUpdate2018Enabled) {
+        verifier._errorReporter.reportErrorForNode(errorCode, element);
+        return false;
+      }
       var conditionValue = verifier._validate(element.condition, errorCode);
       var conditionBool = conditionValue?.toBoolValue();
 
@@ -642,6 +652,10 @@
     } else if (element is MapLiteralEntry) {
       return _validateMapLiteralEntry(element);
     } else if (element is SpreadElement) {
+      if (!verifier._constantUpdate2018Enabled) {
+        verifier._errorReporter.reportErrorForNode(errorCode, element);
+        return false;
+      }
       var value = verifier._validate(element.expression, errorCode);
       if (value == null) return false;
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 743595d..f2db8f0 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -661,10 +661,16 @@
   }
 
   bool get hasBeenInferred {
+    if (linkedNode != null) {
+      return linkedContext.hasOverrideInferenceDone(linkedNode);
+    }
     return _unlinkedClass != null || _hasBeenInferred;
   }
 
   void set hasBeenInferred(bool hasBeenInferred) {
+    if (linkedNode != null) {
+      return linkedContext.setOverrideInferenceDone(linkedNode);
+    }
     _assertNotResynthesized(_unlinkedClass);
     _hasBeenInferred = hasBeenInferred;
   }
@@ -830,9 +836,9 @@
 
   @override
   bool get isSimplyBounded {
-//    if (linkedNode != null) {
-//      return linkedNode.simplyBoundable_isSimplyBounded;
-//    }
+    if (linkedNode != null) {
+      return linkedContext.isSimplyBounded(linkedNode);
+    }
     return super.isSimplyBounded;
   }
 
@@ -1021,6 +1027,12 @@
 
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
+
+      var coreTypes = context.bundleContext.elementFactory.coreTypes;
+      if (identical(this, coreTypes.objectClass)) {
+        return null;
+      }
+
       var type = context.getSuperclass(linkedNode)?.type;
       if (_isInterfaceTypeClass(type)) {
         return _supertype = type;
@@ -1060,31 +1072,6 @@
     return _type;
   }
 
-  @override
-  List<TypeParameterElement> get typeParameters {
-    if (_typeParameterElements != null) return _typeParameterElements;
-
-    if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@typeParameter');
-      var typeParameters = context.getTypeParameters2(linkedNode);
-      if (typeParameters == null) {
-        return _typeParameterElements = const [];
-      }
-      return _typeParameterElements = typeParameters.typeParameters.map((node) {
-        var name = node.name.name;
-        var reference = containerRef.getChild(name);
-        if (reference.element == null) {
-          reference.node2 = node;
-          TypeParameterElementImpl.forLinkedNode(this, reference, node);
-        }
-        return reference.element as TypeParameterElementImpl;
-      }).toList();
-    }
-
-    return super.typeParameters;
-  }
-
   /// Set the type parameters defined for this class to the given
   /// [typeParameters].
   void set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -2470,21 +2457,20 @@
   /// Return the constant initializers for this element, which will be empty if
   /// there are no initializers, or `null` if there was an error in the source.
   List<ConstructorInitializer> get constantInitializers {
-    if (_constantInitializers == null) {
-//      if (linkedNode != null) {
-//        var context = enclosingUnit.linkedContext;
-//        return _constantInitializers ??=
-//            linkedNode.constructorDeclaration_initializers.map((node) {
-//          return context.readNode(node) as ConstructorInitializer;
-//        }).toList();
-//      }
+    if (_constantInitializers != null) return _constantInitializers;
 
-      if (serializedExecutable != null) {
-        _constantInitializers = serializedExecutable.constantInitializers
-            .map((i) => _buildConstructorInitializer(i))
-            .toList(growable: false);
-      }
+    if (linkedNode != null) {
+      return _constantInitializers = linkedContext.getConstructorInitializers(
+        linkedNode,
+      );
     }
+
+    if (serializedExecutable != null) {
+      return _constantInitializers = serializedExecutable.constantInitializers
+          .map((i) => _buildConstructorInitializer(i))
+          .toList(growable: false);
+    }
+
     return _constantInitializers;
   }
 
@@ -2626,41 +2612,39 @@
 
   @override
   ConstructorElement get redirectedConstructor {
-    if (_redirectedConstructor == null) {
-//      if (linkedNode != null) {
-//        var context = enclosingUnit.linkedContext;
-//        if (isFactory) {
-//          var node = linkedNode.constructorDeclaration_redirectedConstructor;
-//          if (node != null) {
-//            ConstructorName ast = context.readNode(node);
-//            return ast.staticElement;
-//          }
-//        } else {
-//          for (var node in linkedNode.constructorDeclaration_initializers) {
-//            if (node.kind == LinkedNodeKind.redirectingConstructorInvocation) {
-//              RedirectingConstructorInvocation ast = context.readNode(node);
-//              return ast.staticElement;
-//            }
-//          }
-//        }
-//        return null;
-//      }
+    if (_redirectedConstructor != null) return _redirectedConstructor;
 
-      if (serializedExecutable != null) {
-        if (serializedExecutable.isRedirectedConstructor) {
-          if (serializedExecutable.isFactory) {
-            _redirectedConstructor = enclosingUnit.resynthesizerContext
-                .resolveConstructorRef(enclosingElement,
-                    serializedExecutable.redirectedConstructor);
-          } else {
-            _redirectedConstructor = enclosingElement.getNamedConstructor(
-                serializedExecutable.redirectedConstructorName);
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext;
+      if (isFactory) {
+        var node = context.getConstructorRedirected(linkedNode);
+        return _redirectedConstructor = node?.staticElement;
+      } else {
+        var initializers = context.getConstructorInitializers(linkedNode);
+        for (var initializer in initializers) {
+          if (initializer is RedirectingConstructorInvocation) {
+            return _redirectedConstructor = initializer.staticElement;
           }
-        } else {
-          return null;
         }
       }
+      return null;
     }
+
+    if (serializedExecutable != null) {
+      if (serializedExecutable.isRedirectedConstructor) {
+        if (serializedExecutable.isFactory) {
+          _redirectedConstructor = enclosingUnit.resynthesizerContext
+              .resolveConstructorRef(
+                  enclosingElement, serializedExecutable.redirectedConstructor);
+        } else {
+          _redirectedConstructor = enclosingElement.getNamedConstructor(
+              serializedExecutable.redirectedConstructorName);
+        }
+      } else {
+        return null;
+      }
+    }
+
     return _redirectedConstructor;
   }
 
@@ -4396,6 +4380,9 @@
 
   @override
   bool get hasImplicitReturnType {
+    if (linkedNode != null) {
+      return linkedContext.hasImplicitReturnType(linkedNode);
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.returnType == null &&
           serializedExecutable.kind != UnlinkedExecutableKind.constructor;
@@ -4530,9 +4517,8 @@
   DartType get returnType {
     if (linkedNode != null) {
       if (_returnType != null) return _returnType;
-      return _returnType = enclosingUnit.linkedContext.getReturnType(
-        linkedNode,
-      );
+      var context = enclosingUnit.linkedContext;
+      return _returnType = context.getReturnType(linkedNode);
     }
     if (serializedExecutable != null &&
         _declaredReturnType == null &&
@@ -4549,6 +4535,9 @@
   }
 
   void set returnType(DartType returnType) {
+    if (linkedNode != null) {
+      linkedContext.setReturnType(linkedNode, returnType);
+    }
     _assertNotResynthesized(serializedExecutable);
     _returnType = _checkElementOfType(returnType);
   }
@@ -4728,10 +4717,7 @@
     if (_exportedLibrary != null) return _exportedLibrary;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var uri = context.directiveUri(librarySource.uri, linkedNode);
-      var elementFactory = context.bundleContext.elementFactory;
-      return _exportedLibrary = elementFactory.libraryOfUri('$uri');
+      return _exportedLibrary = linkedContext.directiveLibrary(linkedNode);
     }
 
     if (_unlinkedExportNonPublic != null) {
@@ -4859,8 +4845,9 @@
   }
 
   factory FieldElementImpl.forLinkedNodeFactory(
-      ElementImpl enclosing, Reference reference, AstNode linkedNode) {
-    if (enclosing.enclosingUnit.linkedContext.isConst(linkedNode)) {
+      ClassElementImpl enclosing, Reference reference, AstNode linkedNode) {
+    var context = enclosing.enclosingUnit.linkedContext;
+    if (context.shouldBeConstFieldElement(linkedNode)) {
       return ConstFieldElementImpl.forLinkedNode(
         enclosing,
         reference,
@@ -4900,7 +4887,7 @@
   @override
   bool get isCovariant {
     if (linkedNode != null) {
-      return linkedContext.isCovariantField(linkedNode);
+      return linkedContext.isCovariant(linkedNode);
     }
 
     if (_unlinkedVariable != null) {
@@ -4921,6 +4908,17 @@
       enclosingElement != null && enclosingElement.isEnum && !isSynthetic;
 
   @override
+  bool get isLazy {
+//    if (linkedNode != null) {
+//      return enclosingUnit.linkedContext.isLazy(linkedNode);
+//    }
+//    if (_unlinkedVariable != null) {
+//      return _unlinkedVariable.isLazy;
+//    }
+    return hasModifier(Modifier.LAZY);
+  }
+
+  @override
   bool get isStatic {
     if (linkedNode != null) {
       return enclosingUnit.linkedContext.isStatic(linkedNode);
@@ -5121,14 +5119,6 @@
   }
 
   @override
-  void set returnType(DartType returnType) {
-//    if (linkedNode != null) {
-//      enclosingUnit.linkedContext.setReturnType(linkedNode, returnType);
-//    }
-    super.returnType = returnType;
-  }
-
-  @override
   SourceRange get visibleRange {
     if (serializedExecutable != null) {
       if (serializedExecutable.visibleLength == 0) {
@@ -5602,9 +5592,9 @@
 
   @override
   bool get isSimplyBounded {
-//    if (linkedNode != null) {
-//      return linkedNode.simplyBoundable_isSimplyBounded;
-//    }
+    if (linkedNode != null) {
+      return linkedContext.isSimplyBounded(linkedNode);
+    }
     return super.isSimplyBounded;
   }
 
@@ -5915,10 +5905,7 @@
     if (_importedLibrary != null) return _importedLibrary;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var uri = context.directiveUri(librarySource.uri, linkedNode);
-      var elementFactory = context.bundleContext.elementFactory;
-      return _importedLibrary = elementFactory.libraryOfUri('$uri');
+      return _importedLibrary = linkedContext.directiveLibrary(linkedNode);
     }
 
     if (_linkedDependency != null) {
@@ -6337,6 +6324,10 @@
 
   @override
   String get documentationComment {
+    if (linkedNode != null) {
+      var comment = linkedContext.getLibraryDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
+    }
     if (unlinkedDefiningUnit != null) {
       return unlinkedDefiningUnit.libraryDocumentationComment?.text;
     }
@@ -6493,7 +6484,9 @@
           .whereType<ImportDirective>()
           .map((node) => ImportElementImpl.forLinkedNode(this, node))
           .toList();
-      var hasCore = _imports.any((import) => import.importedLibrary.isDartCore);
+      var hasCore = _imports.any((import) {
+        return import.importedLibrary?.isDartCore ?? false;
+      });
       if (!hasCore) {
         var elements = linkedContext.bundleContext.elementFactory;
         _imports.add(ImportElementImpl(-1)
@@ -6706,8 +6699,15 @@
 
   @override
   Namespace get publicNamespace {
+    if (_publicNamespace != null) return _publicNamespace;
+
+    if (linkedNode != null) {
+      return _publicNamespace =
+          NamespaceBuilder().createPublicNamespaceForLibrary(this);
+    }
+
     if (resynthesizerContext != null) {
-      _publicNamespace ??= resynthesizerContext.buildPublicNamespace();
+      return _publicNamespace = resynthesizerContext.buildPublicNamespace();
     }
     return _publicNamespace;
   }
@@ -7013,6 +7013,17 @@
   }
 
   @override
+  bool get isLazy {
+//    if (linkedNode != null) {
+//      return enclosingUnit.linkedContext.isLazy(linkedNode);
+//    }
+//    if (_unlinkedVariable != null) {
+//      return _unlinkedVariable.isLazy;
+//    }
+    return hasModifier(Modifier.LAZY);
+  }
+
+  @override
   bool get isPotentiallyMutatedInClosure => true;
 
   @override
@@ -7136,16 +7147,6 @@
   }
 
   @override
-  DartType get returnType {
-//    if (linkedNode != null) {
-//      return enclosingUnit.linkedContext.getType(
-//        linkedNode.methodDeclaration_returnType2,
-//      );
-//    }
-    return super.returnType;
-  }
-
-  @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
 
   @override
@@ -7387,25 +7388,28 @@
   /// type being referred to is the return type.
   static const Modifier IMPLICIT_TYPE = const Modifier('IMPLICIT_TYPE', 12);
 
+  /// Indicates that modifier 'lazy' was applied to the element.
+  static const Modifier LAZY = const Modifier('LAZY', 13);
+
   /// Indicates that a class is a mixin application.
   static const Modifier MIXIN_APPLICATION =
-      const Modifier('MIXIN_APPLICATION', 13);
+      const Modifier('MIXIN_APPLICATION', 14);
 
   /// Indicates that a class contains an explicit reference to 'super'.
   static const Modifier REFERENCES_SUPER =
-      const Modifier('REFERENCES_SUPER', 14);
+      const Modifier('REFERENCES_SUPER', 15);
 
   /// Indicates that the pseudo-modifier 'set' was applied to the element.
-  static const Modifier SETTER = const Modifier('SETTER', 15);
+  static const Modifier SETTER = const Modifier('SETTER', 16);
 
   /// Indicates that the modifier 'static' was applied to the element.
-  static const Modifier STATIC = const Modifier('STATIC', 16);
+  static const Modifier STATIC = const Modifier('STATIC', 17);
 
   /// Indicates that the element does not appear in the source code but was
   /// implicitly created. For example, if a class does not define any
   /// constructors, an implicit zero-argument constructor will be created and it
   /// will be marked as being synthetic.
-  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 17);
+  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 18);
 
   static const List<Modifier> values = const [
     ABSTRACT,
@@ -7421,6 +7425,7 @@
     GETTER,
     HAS_EXT_URI,
     IMPLICIT_TYPE,
+    LAZY,
     MIXIN_APPLICATION,
     REFERENCES_SUPER,
     SETTER,
@@ -7763,6 +7768,9 @@
 
   @override
   bool get hasImplicitType {
+    if (linkedNode != null) {
+      return linkedContext.hasImplicitType(linkedNode);
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.type == null;
     }
@@ -7875,6 +7883,9 @@
 
   @override
   void set type(DartType type) {
+    if (linkedNode != null) {
+      return linkedContext.setVariableType(linkedNode, type);
+    }
     _assertNotResynthesized(_unlinkedVariable);
     _type = _checkElementOfType(type);
   }
@@ -8029,6 +8040,9 @@
 
   @override
   bool get hasImplicitType {
+    if (linkedNode != null) {
+      return linkedContext.hasImplicitType(linkedNode);
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.type == null && !unlinkedParam.isFunctionTyped;
     }
@@ -8099,13 +8113,9 @@
 
   @override
   bool get isCovariant {
-//    if (linkedNode != null) {
-//      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-//        var parameter = linkedNode.defaultFormalParameter_parameter;
-//        return parameter.normalFormalParameter_isCovariant;
-//      }
-//      return linkedNode.normalFormalParameter_isCovariant;
-//    }
+    if (linkedNode != null) {
+      return linkedContext.isCovariant(linkedNode);
+    }
     if (isExplicitlyCovariant || inheritsCovariant) {
       return true;
     }
@@ -8377,17 +8387,25 @@
           );
         }
       } else {
-        var name = node.identifier.name;
-        var reference = containerRef.getChild(name);
-        if (reference.element == null) {
-          reference.node2 = node;
-          ParameterElementImpl.forLinkedNodeFactory(
+        if (node.identifier == null) {
+          return ParameterElementImpl.forLinkedNodeFactory(
             enclosing,
-            reference,
+            containerRef.getChild(''),
             node,
           );
+        } else {
+          var name = node.identifier.name;
+          var reference = containerRef.getChild(name);
+          if (reference.element == null) {
+            reference.node2 = node;
+            ParameterElementImpl.forLinkedNodeFactory(
+              enclosing,
+              reference,
+              node,
+            );
+          }
+          return reference.element as ParameterElement;
         }
-        return reference.element as ParameterElement;
       }
     }).toList();
   }
@@ -8879,7 +8897,7 @@
   DartType get type {
     if (linkedNode != null) {
       if (_type != null) return _type;
-      return _type = enclosingUnit.linkedContext.getType(linkedNode);
+      return _type = linkedContext.getType(linkedNode);
     }
     if (isSynthetic && _type == null) {
       if (getter != null) {
@@ -9246,7 +9264,8 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      TypeParameter node = this.linkedNode;
+      return node.name.name;
     }
     if (_unlinkedTypeParam != null) {
       return _unlinkedTypeParam.name;
@@ -9320,20 +9339,14 @@
     if (_typeParameterElements != null) return _typeParameterElements;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@typeParameter');
-      var typeParameters = context.getTypeParameters2(linkedNode);
+      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
       }
       return _typeParameterElements = typeParameters.typeParameters.map((node) {
-        var name = node.name.name;
-        var reference = containerRef.getChild(name);
-        if (reference.element == null) {
-          reference.node2 = node;
-          TypeParameterElementImpl.forLinkedNode(this, reference, node);
-        }
-        return reference.element as TypeParameterElementImpl;
+        TypeParameterElementImpl element = node.declaredElement;
+        element.enclosingElement = this;
+        return element;
       }).toList();
     }
 
@@ -9533,9 +9546,6 @@
   DartObject get constantValue => evaluationResult?.value;
 
   void set declaredType(DartType type) {
-//    if (linkedNode != null) {
-//      enclosingUnit.linkedContext.setVariableType(linkedNode, type);
-//    }
     _declaredType = _checkElementOfType(type);
   }
 
@@ -9619,6 +9629,9 @@
   DartType get type => _type ?? _declaredType;
 
   void set type(DartType type) {
+    if (linkedNode != null) {
+      return linkedContext.setVariableType(linkedNode, type);
+    }
     _type = _checkElementOfType(type);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index 7384095d..7a4a1e7 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -664,6 +664,9 @@
   @override
   bool get isEnumConstant => actualElement.isEnumConstant;
 
+  @override
+  bool get isLazy => actualElement.isLazy;
+
   @deprecated
   @override
   bool get isVirtual => actualElement.isVirtual;
@@ -984,6 +987,9 @@
       super.actualElement as LocalVariableElement;
 
   @override
+  bool get isLazy => actualElement.isLazy;
+
+  @override
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
 
   @override
@@ -1171,14 +1177,14 @@
   @override
   PropertyAccessorElement get getter => actualElement.getter;
 
+  @override
+  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
+
   @deprecated
   @override
   DartType get propagatedType => null;
 
   @override
-  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
-
-  @override
   PropertyAccessorElement get setter => actualElement.setter;
 }
 
@@ -1259,10 +1265,10 @@
   FunctionElement get initializer => actualElement.initializer;
 
   @override
-  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
+  bool get isConst => actualElement.isConst;
 
   @override
-  bool get isConst => actualElement.isConst;
+  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
 
   @override
   bool get isFinal => actualElement.isFinal;
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 7472796..12fd38f 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -255,6 +255,9 @@
   @override
   bool get isEnumConstant => baseElement.isEnumConstant;
 
+  @override
+  bool get isLazy => baseElement.isLazy;
+
   @deprecated
   @override
   bool get isVirtual => baseElement.isVirtual;
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index e2393ca..267f338 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -56,35 +56,14 @@
  */
 class BottomTypeImpl extends TypeImpl {
   /**
-   * The unique instance of this class, with indeterminate nullability.
+   * The unique instance of this class.
    */
-  static final BottomTypeImpl instance = instanceIndeterminate;
-
-  /**
-   * The unique instance of this class, nullable.
-   */
-  static final BottomTypeImpl instanceNullable =
-      new BottomTypeImpl._(Nullability.nullable);
-
-  /**
-   * The unique instance of this class, with indeterminate nullability.
-   */
-  static final BottomTypeImpl instanceIndeterminate =
-      new BottomTypeImpl._(Nullability.indeterminate);
-
-  /**
-   * The unique instance of this class, non-nullable.
-   */
-  static final BottomTypeImpl instanceNonNullable =
-      new BottomTypeImpl._(Nullability.nonNullable);
-
-  @override
-  final Nullability nullability;
+  static final BottomTypeImpl instance = new BottomTypeImpl._();
 
   /**
    * Prevent the creation of instances of this class.
    */
-  BottomTypeImpl._(this.nullability) : super(null, "<bottom>");
+  BottomTypeImpl._() : super(null, "<bottom>");
 
   @override
   int get hashCode => 0;
@@ -93,6 +72,9 @@
   bool get isBottom => true;
 
   @override
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.none;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -134,16 +116,9 @@
       this;
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    switch (nullability) {
-      case Nullability.nullable:
-        return instanceNullable;
-      case Nullability.indeterminate:
-        return instanceIndeterminate;
-      case Nullability.nonNullable:
-        return instanceNonNullable;
-    }
-    throw StateError('Unexpected nullability: $nullability');
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    // The bottom type is always non-nullable.
+    return this;
   }
 }
 
@@ -153,7 +128,7 @@
  */
 class CircularFunctionTypeImpl extends DynamicTypeImpl
     implements _FunctionTypeImplLazy {
-  CircularFunctionTypeImpl() : super._circular(Nullability.indeterminate);
+  CircularFunctionTypeImpl() : super._circular();
 
   @override
   List<ParameterElement> get baseParameters => const <ParameterElement>[];
@@ -262,7 +237,7 @@
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => this;
 
   @override
-  TypeImpl withNullability(Nullability nullability) => this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) => this;
 
   @override
   void _forEachParameterType(
@@ -294,7 +269,7 @@
  * `...`.
  */
 class CircularTypeImpl extends DynamicTypeImpl {
-  CircularTypeImpl() : super._circular(Nullability.indeterminate);
+  CircularTypeImpl() : super._circular();
 
   @override
   bool operator ==(Object object) => object is CircularTypeImpl;
@@ -332,9 +307,9 @@
 
   DeferredFunctionTypeImpl(this._computeElement, String name,
       List<DartType> typeArguments, bool isInstantiated,
-      {Nullability nullability = Nullability.indeterminate})
+      {NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star})
       : super._(null, name, null, typeArguments, null, null, isInstantiated,
-            nullability: nullability);
+            nullabilitySuffix: nullabilitySuffix);
 
   @override
   FunctionTypedElement get element {
@@ -346,11 +321,11 @@
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    if (this.nullability == nullability) return this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    if (this.nullabilitySuffix == nullabilitySuffix) return this;
     return DeferredFunctionTypeImpl(
         _computeElement, name, typeArguments, isInstantiated,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 }
 
@@ -359,35 +334,14 @@
  */
 class DynamicTypeImpl extends TypeImpl {
   /**
-   * The unique instance of this class, with indeterminate nullability.
+   * The unique instance of this class.
    */
-  static final DynamicTypeImpl instance = instanceIndeterminate;
-
-  /**
-   * The unique instance of this class, nullable.
-   */
-  static final DynamicTypeImpl instanceNullable =
-      new DynamicTypeImpl._(Nullability.nullable);
-
-  /**
-   * The unique instance of this class, with indeterminate nullability.
-   */
-  static final DynamicTypeImpl instanceIndeterminate =
-      new DynamicTypeImpl._(Nullability.indeterminate);
-
-  /**
-   * The unique instance of this class, non-nullable.
-   */
-  static final DynamicTypeImpl instanceNonNullable =
-      new DynamicTypeImpl._(Nullability.nonNullable);
-
-  @override
-  final Nullability nullability;
+  static final DynamicTypeImpl instance = new DynamicTypeImpl._();
 
   /**
    * Prevent the creation of instances of this class.
    */
-  DynamicTypeImpl._(this.nullability)
+  DynamicTypeImpl._()
       : super(new DynamicElementImpl(), Keyword.DYNAMIC.lexeme) {
     (element as DynamicElementImpl).type = this;
   }
@@ -395,8 +349,7 @@
   /**
    * Constructor used by [CircularTypeImpl].
    */
-  DynamicTypeImpl._circular(this.nullability)
-      : super(instance.element, Keyword.DYNAMIC.lexeme);
+  DynamicTypeImpl._circular() : super(instance.element, Keyword.DYNAMIC.lexeme);
 
   @override
   int get hashCode => 1;
@@ -405,6 +358,9 @@
   bool get isDynamic => true;
 
   @override
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.none;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -451,16 +407,9 @@
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    switch (nullability) {
-      case Nullability.nullable:
-        return instanceNullable;
-      case Nullability.indeterminate:
-        return instanceIndeterminate;
-      case Nullability.nonNullable:
-        return instanceNonNullable;
-    }
-    throw StateError('Unexpected nullability: $nullability');
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    // The dynamic type is always nullable.
+    return this;
   }
 }
 
@@ -469,7 +418,7 @@
  */
 abstract class FunctionTypeImpl extends TypeImpl implements FunctionType {
   @override
-  final Nullability nullability;
+  final NullabilitySuffix nullabilitySuffix;
 
   /**
    * Initialize a newly created function type to be declared by the given
@@ -477,13 +426,13 @@
    * [typeParameters], which permits later substitution.
    */
   factory FunctionTypeImpl(FunctionTypedElement element,
-      {Nullability nullability = Nullability.indeterminate}) {
+      {NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star}) {
     if (element is FunctionTypeAliasElement) {
       throw new StateError('Use FunctionTypeImpl.forTypedef for typedefs');
     }
     return new _FunctionTypeImplLazy._(
         element, null, null, null, null, null, false,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   /**
@@ -494,10 +443,10 @@
    * See https://github.com/dart-lang/sdk/issues/34657.
    */
   factory FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element,
-      {Nullability nullability = Nullability.indeterminate}) {
+      {NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star}) {
     return new _FunctionTypeImplLazy._(
         element, element?.name, null, null, null, null, false,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   /**
@@ -510,7 +459,7 @@
    */
   factory FunctionTypeImpl.fresh(FunctionType original,
       {bool force = false,
-      Nullability nullability = Nullability.indeterminate}) {
+      NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star}) {
     // We build up a substitution for the type parameters,
     // {variablesFresh/variables} then apply it.
 
@@ -559,19 +508,19 @@
     function.typeParameters = freshVarElements;
     function.shareParameters(newType.parameters);
     return function.type =
-        new FunctionTypeImpl(function, nullability: nullability);
+        new FunctionTypeImpl(function, nullabilitySuffix: nullabilitySuffix);
   }
 
   /// Creates a function type that's not associated with any element in the
   /// element tree.
   factory FunctionTypeImpl.synthetic(DartType returnType,
       List<TypeParameterElement> typeFormals, List<ParameterElement> parameters,
-      {Nullability nullability = Nullability.indeterminate}) {
+      {NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star}) {
     return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
-  FunctionTypeImpl._(Element element, String name, this.nullability)
+  FunctionTypeImpl._(Element element, String name, this.nullabilitySuffix)
       : super(element, name);
 
   @deprecated
@@ -930,7 +879,7 @@
       return this;
     }
     return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -1297,7 +1246,7 @@
  */
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
   @override
-  final Nullability nullability;
+  final NullabilitySuffix nullabilitySuffix;
 
   /**
    * A list containing the actual types of the type arguments.
@@ -1340,7 +1289,7 @@
    * Initialize a newly created type to be declared by the given [element].
    */
   InterfaceTypeImpl(ClassElement element,
-      [this.prunedTypedefs, this.nullability = Nullability.indeterminate])
+      [this.prunedTypedefs, this.nullabilitySuffix = NullabilitySuffix.star])
       : super(element, element.displayName);
 
   /**
@@ -1349,14 +1298,14 @@
    */
   InterfaceTypeImpl.elementWithNameAndArgs(
       ClassElement element, String name, this._typeArgumentsComputer,
-      {this.nullability = Nullability.indeterminate})
+      {this.nullabilitySuffix = NullabilitySuffix.star})
       : prunedTypedefs = null,
         super(element, name) {
     _typeArguments = null;
   }
 
   InterfaceTypeImpl.explicit(ClassElement element, List<DartType> typeArguments,
-      {this.nullability = Nullability.indeterminate})
+      {this.nullabilitySuffix = NullabilitySuffix.star})
       : prunedTypedefs = null,
         _typeArguments = typeArguments,
         super(element, element.displayName);
@@ -1366,7 +1315,7 @@
    * should only be used in cases where there is no declaration of the type.
    */
   InterfaceTypeImpl.named(String name,
-      {this.nullability = Nullability.indeterminate})
+      {this.nullabilitySuffix = NullabilitySuffix.star})
       : prunedTypedefs = null,
         super(null, name);
 
@@ -1374,11 +1323,11 @@
    * Private constructor.
    */
   InterfaceTypeImpl._(Element element, String name, this.prunedTypedefs,
-      {this.nullability = Nullability.indeterminate})
+      {this.nullabilitySuffix = NullabilitySuffix.star})
       : super(element, name);
 
   InterfaceTypeImpl._withNullability(InterfaceTypeImpl original,
-      {this.nullability = Nullability.indeterminate})
+      {this.nullabilitySuffix = NullabilitySuffix.star})
       : _typeArguments = original._typeArguments,
         _typeArgumentsComputer = original._typeArgumentsComputer,
         prunedTypedefs = original.prunedTypedefs,
@@ -2229,7 +2178,7 @@
       // base types.
       assert(this.prunedTypedefs == null);
       InterfaceTypeImpl result = new InterfaceTypeImpl._(element, name, prune,
-          nullability: nullability);
+          nullabilitySuffix: nullabilitySuffix);
       result.typeArguments = typeArguments
           .map((DartType t) => (t as TypeImpl).pruned(prune))
           .toList();
@@ -2258,7 +2207,7 @@
       return this;
     } else {
       return new InterfaceTypeImpl._(element, name, prunedTypedefs,
-          nullability: nullability)
+          nullabilitySuffix: nullabilitySuffix)
         ..typeArguments = typeArguments;
     }
   }
@@ -2282,7 +2231,7 @@
     }
 
     InterfaceTypeImpl newType =
-        new InterfaceTypeImpl(element, prune, nullability);
+        new InterfaceTypeImpl(element, prune, nullabilitySuffix);
     newType.typeArguments = newTypeArguments;
     return newType;
   }
@@ -2293,9 +2242,10 @@
       instantiate(argumentTypes);
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    if (this.nullability == nullability) return this;
-    return InterfaceTypeImpl._withNullability(this, nullability: nullability);
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    if (this.nullabilitySuffix == nullabilitySuffix) return this;
+    return InterfaceTypeImpl._withNullability(this,
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   /**
@@ -2682,16 +2632,19 @@
       }
     }
 
-    Nullability computeNullability() {
-      Nullability first = (firstType as InterfaceTypeImpl).nullability;
-      Nullability second = (secondType as InterfaceTypeImpl).nullability;
-      if (first == Nullability.nullable || second == Nullability.nullable) {
-        return Nullability.nullable;
-      } else if (first == Nullability.indeterminate ||
-          second == Nullability.indeterminate) {
-        return Nullability.indeterminate;
+    NullabilitySuffix computeNullability() {
+      NullabilitySuffix first =
+          (firstType as InterfaceTypeImpl).nullabilitySuffix;
+      NullabilitySuffix second =
+          (secondType as InterfaceTypeImpl).nullabilitySuffix;
+      if (first == NullabilitySuffix.question ||
+          second == NullabilitySuffix.question) {
+        return NullabilitySuffix.question;
+      } else if (first == NullabilitySuffix.star ||
+          second == NullabilitySuffix.star) {
+        return NullabilitySuffix.star;
       }
-      return Nullability.nonNullable;
+      return NullabilitySuffix.none;
     }
 
     InterfaceTypeImpl lub =
@@ -2761,24 +2714,35 @@
 }
 
 /**
- * The nullability of a type.
+ * Suffix indicating the nullability of a type.
+ *
+ * This enum describes whether a `?` or `*` would be used at the end of the
+ * canonical representation of a type.  It's subtly different the notions of
+ * "nullable", "non-nullable", "potentially nullable", and "potentially
+ * non-nullable" defined by the spec.  For example, the type `Null` is nullable,
+ * even though it lacks a trailing `?`.
  */
-enum Nullability {
+enum NullabilitySuffix {
   /**
-   * An indication that the type includes the value `null`.
+   * An indication that the canonical representation of the type under
+   * consideration ends with `?`.  Types having this nullability suffix should
+   * be interpreted as being unioned with the Null type.
    */
-  nullable,
+  question,
 
   /**
-   * An indication that the type is a legacy type which may be interpreted as
-   * either nullable or non-nullable as appropriate.
+   * An indication that the canonical representation of the type under
+   * consideration ends with `*`.  Types having this nullability suffix are
+   * called "legacy types"; it has not yet been determined whether they should
+   * be unioned with the Null type.
    */
-  indeterminate,
+  star,
 
   /**
-   * An indication that the type does not include the value `null`.
+   * An indication that the canonical representation of the type under
+   * consideration does not end with either `?` or `*`.
    */
-  nonNullable
+  none
 }
 
 /**
@@ -2849,9 +2813,9 @@
   bool get isVoid => false;
 
   /**
-   * Return the nullability of this type.
+   * Return the nullability suffix of this type.
    */
-  Nullability get nullability;
+  NullabilitySuffix get nullabilitySuffix;
 
   /**
    * Append a textual representation of this type to the given [buffer]. The set
@@ -2982,20 +2946,24 @@
   }
 
   /**
-   * Return the same type, but with the given [nullability].
+   * Return the same type, but with the given [nullabilitySuffix].
    */
-  TypeImpl withNullability(Nullability nullability);
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix);
 
   void _appendNullability(StringBuffer buffer) {
-    switch (nullability) {
-      case Nullability.nullable:
+    if (isDynamic || isBottom || isVoid) {
+      // These types don't have nullability variations, so don't append
+      // anything.
+      return;
+    }
+    switch (nullabilitySuffix) {
+      case NullabilitySuffix.question:
         buffer.write('?');
         break;
-      case Nullability.indeterminate:
+      case NullabilitySuffix.star:
         buffer.write('*');
         break;
-      case Nullability.nonNullable:
-        buffer.write('!');
+      case NullabilitySuffix.none:
         break;
     }
   }
@@ -3083,14 +3051,14 @@
   static bool _appendingBounds = false;
 
   @override
-  final Nullability nullability;
+  final NullabilitySuffix nullabilitySuffix;
 
   /**
    * Initialize a newly created type parameter type to be declared by the given
    * [element] and to have the given name.
    */
   TypeParameterTypeImpl(TypeParameterElement element,
-      {this.nullability = Nullability.indeterminate})
+      {this.nullabilitySuffix = NullabilitySuffix.star})
       : super(element, element.name);
 
   @override
@@ -3254,16 +3222,16 @@
         }
 
         // TODO(scheglov) Proposed substitution rules for nullability.
-        Nullability resultNullability;
-        Nullability argumentNullability = argumentType.nullability;
-        if (argumentNullability == Nullability.nullable ||
-            nullability == Nullability.nullable) {
-          resultNullability = Nullability.nullable;
-        } else if (argumentNullability == Nullability.indeterminate ||
-            nullability == Nullability.indeterminate) {
-          resultNullability = Nullability.indeterminate;
+        NullabilitySuffix resultNullability;
+        NullabilitySuffix argumentNullability = argumentType.nullabilitySuffix;
+        if (argumentNullability == NullabilitySuffix.question ||
+            nullabilitySuffix == NullabilitySuffix.question) {
+          resultNullability = NullabilitySuffix.question;
+        } else if (argumentNullability == NullabilitySuffix.star ||
+            nullabilitySuffix == NullabilitySuffix.star) {
+          resultNullability = NullabilitySuffix.star;
         } else {
-          resultNullability = Nullability.nonNullable;
+          resultNullability = NullabilitySuffix.none;
         }
 
         return argumentType.withNullability(resultNullability);
@@ -3273,9 +3241,9 @@
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    if (this.nullability == nullability) return this;
-    return TypeParameterTypeImpl(element, nullability: nullability);
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    if (this.nullabilitySuffix == nullabilitySuffix) return this;
+    return TypeParameterTypeImpl(element, nullabilitySuffix: nullabilitySuffix);
   }
 
   /**
@@ -3325,7 +3293,7 @@
   bool get isUndefined => true;
 
   @override
-  Nullability get nullability => Nullability.indeterminate;
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.star;
 
   @override
   bool operator ==(Object object) => identical(object, this);
@@ -3374,7 +3342,7 @@
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) => this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) => this;
 }
 
 /**
@@ -3393,33 +3361,12 @@
   /**
    * The unique instance of this class, with indeterminate nullability.
    */
-  static final VoidTypeImpl instance = instanceIndeterminate;
-
-  /**
-   * The unique instance of this class, nullable.
-   */
-  static final VoidTypeImpl instanceNullable =
-      new VoidTypeImpl._(Nullability.nullable);
-
-  /**
-   * The unique instance of this class, with indeterminate nullability.
-   */
-  static final VoidTypeImpl instanceIndeterminate =
-      new VoidTypeImpl._(Nullability.indeterminate);
-
-  /**
-   * The unique instance of this class, non-nullable.
-   */
-  static final VoidTypeImpl instanceNonNullable =
-      new VoidTypeImpl._(Nullability.nonNullable);
-
-  @override
-  final Nullability nullability;
+  static final VoidTypeImpl instance = new VoidTypeImpl._();
 
   /**
    * Prevent the creation of instances of this class.
    */
-  VoidTypeImpl._(this.nullability) : super(null, Keyword.VOID.lexeme);
+  VoidTypeImpl._() : super(null, Keyword.VOID.lexeme);
 
   @override
   int get hashCode => 2;
@@ -3428,6 +3375,9 @@
   bool get isVoid => true;
 
   @override
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.none;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -3464,16 +3414,9 @@
       this;
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    switch (nullability) {
-      case Nullability.nullable:
-        return instanceNullable;
-      case Nullability.indeterminate:
-        return instanceIndeterminate;
-      case Nullability.nonNullable:
-        return instanceNonNullable;
-    }
-    throw StateError('Unexpected nullability: $nullability');
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    // The void type is always nullable.
+    return this;
   }
 }
 
@@ -3526,9 +3469,9 @@
       this._returnType,
       this._parameters,
       this._isInstantiated,
-      {Nullability nullability = Nullability.indeterminate})
+      {NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star})
       : _typeParameters = null,
-        super._(element, name, nullability);
+        super._(element, name, nullabilitySuffix);
 
   /**
    * Return the base parameter elements of this function element.
@@ -3735,7 +3678,7 @@
 
     return new _FunctionTypeImplLazy._(element, name, prunedTypedefs,
         newTypeArgs, _returnType, _parameters, true,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -3757,7 +3700,7 @@
           .toList(growable: false);
       return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
           _returnType, _parameters, _isInstantiated,
-          nullability: nullability);
+          nullabilitySuffix: nullabilitySuffix);
     }
   }
 
@@ -3786,15 +3729,15 @@
         TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
     return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
         _returnType, _parameters, _isInstantiated,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    if (this.nullability == nullability) return this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    if (this.nullabilitySuffix == nullabilitySuffix) return this;
     return _FunctionTypeImplLazy._(element, name, prunedTypedefs,
         _typeArguments, _returnType, _parameters, _isInstantiated,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -3842,8 +3785,8 @@
   final List<ParameterElement> parameters;
 
   _FunctionTypeImplStrict._(this.returnType, this.typeFormals, this.parameters,
-      {Nullability nullability = Nullability.indeterminate})
-      : super._(null, null, nullability);
+      {NullabilitySuffix nullabilitySuffix = NullabilitySuffix.star})
+      : super._(null, null, nullabilitySuffix);
 
   @override
   List<TypeParameterElement> get boundTypeParameters => typeFormals;
@@ -3899,7 +3842,7 @@
         returnType.substitute2(argumentTypes, parameterTypes),
         const [],
         _transformOrShare(parameters, transformParameter),
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -3959,14 +3902,14 @@
     }
     return new _FunctionTypeImplStrict._(
         newReturnType, newTypeFormals, newParameters,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) {
-    if (this.nullability == nullability) return this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) {
+    if (this.nullabilitySuffix == nullabilitySuffix) return this;
     return _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index b3fd95f..dbf57f9 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -8,6 +8,37 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_visitor.dart';
 
+/// Generates a fresh copy of the given type parameters, with their bounds
+/// substituted to reference the new parameters.
+///
+/// The returned object contains the fresh type parameter list as well as a
+/// mapping to be used for replacing other types to use the new type parameters.
+FreshTypeParameters getFreshTypeParameters(
+    List<TypeParameterElement> typeParameters) {
+  var freshParameters = new List<TypeParameterElementImpl>.generate(
+    typeParameters.length,
+    (i) => new TypeParameterElementImpl(typeParameters[i].name, -1),
+    growable: true,
+  );
+
+  var map = <TypeParameterElement, DartType>{};
+  for (int i = 0; i < typeParameters.length; ++i) {
+    map[typeParameters[i]] = new TypeParameterTypeImpl(freshParameters[i]);
+  }
+
+  var substitution = Substitution.fromMap(map);
+
+  for (int i = 0; i < typeParameters.length; ++i) {
+    var bound = typeParameters[i].bound;
+    if (bound != null) {
+      var newBound = substitution.substituteType(bound);
+      freshParameters[i].bound = newBound;
+    }
+  }
+
+  return new FreshTypeParameters(freshParameters, substitution);
+}
+
 /// Returns a type where all occurrences of the given type parameters have been
 /// replaced with the corresponding types.
 ///
@@ -27,6 +58,30 @@
   return Substitution.fromMap(substitution).substituteType(type);
 }
 
+class FreshTypeParameters {
+  final List<TypeParameterElement> freshTypeParameters;
+  final Substitution substitution;
+
+  FreshTypeParameters(this.freshTypeParameters, this.substitution);
+
+  FunctionType applyToFunctionType(FunctionType type) {
+    return new FunctionTypeImpl.synthetic(
+      substitute(type.returnType),
+      freshTypeParameters,
+      type.parameters.map((parameter) {
+        return ParameterElementImpl.synthetic(
+          parameter.name,
+          substitute(parameter.type),
+          // ignore: deprecated_member_use_from_same_package
+          parameter.parameterKind,
+        );
+      }).toList(),
+    );
+  }
+
+  DartType substitute(DartType type) => substitution.substituteType(type);
+}
+
 abstract class Substitution {
   static const Substitution empty = _NullSubstitution.instance;
 
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 64dcf19..ef261f3 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -178,6 +178,25 @@
               "rename the function in the imported library.");
 
   /**
+   * When "strict-inference" is enabled, collection literal types must be
+   * inferred via the context type, or have type arguments.
+   */
+  static const HintCode INFERENCE_FAILURE_ON_COLLECTION_LITERAL = HintCode(
+      'INFERENCE_FAILURE_ON_COLLECTION_LITERAL',
+      "The type argument(s) of '{0}' cannot be inferred.",
+      correction: "Use explicit type argument(s) for '{0}'.");
+
+  /**
+   * When "strict-inference" is enabled, types in instance creation
+   * (constructor calls) must be inferred via the context type, or have type
+   * arguments.
+   */
+  static const HintCode INFERENCE_FAILURE_ON_INSTANCE_CREATION = HintCode(
+      'INFERENCE_FAILURE_ON_INSTANCE_CREATION',
+      "The type argument(s) of '{0}' cannot be inferred.",
+      correction: "Use explicit type argument(s) for '{0}'.");
+
+  /**
    * When "strict-inference" in enabled, uninitialized variables must be
    * declared with a specific type.
    */
@@ -189,14 +208,6 @@
           correction: "Try specifying the type of the variable.");
 
   /**
-   * When "strict-raw-types" is enabled, raw types must be inferred via the
-   * context type, or have type arguments other than dynamic.
-   */
-  static const HintCode STRICT_RAW_TYPE = HintCode('STRICT_RAW_TYPE',
-      "The generic type '{0}' should have explicit type arguments but doesn't.",
-      correction: "Use explicit type arguments for '{0}'.");
-
-  /**
    * This hint is generated anywhere a @factory annotation is associated with
    * anything other than a method.
    */
@@ -629,6 +640,14 @@
       correction: "Try updating the SDK constraints.");
 
   /**
+   * When "strict-raw-types" is enabled, raw types must be inferred via the
+   * context type, or have type arguments.
+   */
+  static const HintCode STRICT_RAW_TYPE = HintCode('STRICT_RAW_TYPE',
+      "The generic type '{0}' should have explicit type arguments but doesn't.",
+      correction: "Use explicit type arguments for '{0}'.");
+
+  /**
    * This hint is generated anywhere where a `@sealed` class or mixin is used as
    * a super-type of a class.
    */
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 6e31a4b..de2684c 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -65,7 +65,8 @@
 
   static const ParserErrorCode COLON_IN_PLACE_OF_IN = _COLON_IN_PLACE_OF_IN;
 
-  static const ParserErrorCode CONST_AFTER_FACTORY = _CONST_AFTER_FACTORY;
+  // TODO(danrubel): Remove this unused error code
+  static const ParserErrorCode CONST_AFTER_FACTORY = _MODIFIER_OUT_OF_ORDER;
 
   static const ParserErrorCode CONST_AND_COVARIANT = _CONST_AND_COVARIANT;
 
@@ -521,6 +522,8 @@
       "Can't have both positional and named parameters in a single parameter list.",
       correction: "Try choosing a single style of optional parameters.");
 
+  static const ParserErrorCode MODIFIER_OUT_OF_ORDER = _MODIFIER_OUT_OF_ORDER;
+
   static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES =
       _MULTIPLE_EXTENDS_CLAUSES;
 
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index b12e351..c02bde2 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -63,7 +63,7 @@
   _CLASS_IN_CLASS,
   _COLON_IN_PLACE_OF_IN,
   _CONSTRUCTOR_WITH_RETURN_TYPE,
-  _CONST_AFTER_FACTORY,
+  _MODIFIER_OUT_OF_ORDER,
   _CONST_AND_COVARIANT,
   _CONST_AND_FINAL,
   _CONST_AND_VAR,
@@ -141,11 +141,6 @@
     'CONSTRUCTOR_WITH_RETURN_TYPE', r"Constructors can't have a return type.",
     correction: "Try removing the return type.");
 
-const ParserErrorCode _CONST_AFTER_FACTORY = const ParserErrorCode(
-    'CONST_AFTER_FACTORY',
-    r"The modifier 'const' should be before the modifier 'factory'.",
-    correction: "Try re-ordering the modifiers.");
-
 const ParserErrorCode _CONST_AND_COVARIANT = const ParserErrorCode(
     'CONST_AND_COVARIANT',
     r"Members can't be declared to be both 'const' and 'covariant'.",
@@ -251,7 +246,7 @@
 
 const ParserErrorCode _EXPERIMENT_NOT_ENABLED = const ParserErrorCode(
     'EXPERIMENT_NOT_ENABLED',
-    r"This requires the --#string experiment to be enabled.",
+    r"This requires the '#string' experiment to be enabled.",
     correction:
         "Try enabling this experiment by adding it to the command line when compiling and running.");
 
@@ -450,6 +445,11 @@
 const ParserErrorCode _MISSING_STATEMENT =
     const ParserErrorCode('MISSING_STATEMENT', r"Expected a statement.");
 
+const ParserErrorCode _MODIFIER_OUT_OF_ORDER = const ParserErrorCode(
+    'MODIFIER_OUT_OF_ORDER',
+    r"The modifier '#string' should be before the modifier '#string2'.",
+    correction: "Try re-ordering the modifiers.");
+
 const ParserErrorCode _MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode(
     'MULTIPLE_EXTENDS_CLAUSES',
     r"Each class definition can have at most one extends clause.",
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 570fc8f..5eda88c4 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -34,7 +34,7 @@
       const CheckedModeCompileTimeErrorCode(
           'CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH',
           "A value of type '{0}' can't be assigned to the field '{1}', which "
-          "has type '{2}'.");
+              "has type '{2}'.");
 
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
@@ -45,7 +45,7 @@
       const CheckedModeCompileTimeErrorCode(
           'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
           "A value of type '{0}' can't be assigned to a parameter of type "
-          "'{1}'.");
+              "'{1}'.");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error
@@ -64,7 +64,7 @@
       const CheckedModeCompileTimeErrorCode(
           'CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE',
           "The initializer type '{0}' can't be assigned to the field type "
-          "'{1}'.");
+              "'{1}'.");
 
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
@@ -74,7 +74,7 @@
       const CheckedModeCompileTimeErrorCode(
           'VARIABLE_TYPE_MISMATCH',
           "A value of type '{0}' can't be assigned to a variable of type "
-          "'{1}'.");
+              "'{1}'.");
 
   /**
    * Initialize a newly created error code to have the given [name]. The message
@@ -122,7 +122,7 @@
       const CompileTimeErrorCode(
           'ACCESS_PRIVATE_ENUM_FIELD',
           "The private fields of an enum can't be accessed, even within the "
-          "same library.");
+              "same library.");
 
   /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported
@@ -145,8 +145,8 @@
       const CompileTimeErrorCode(
           'AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH',
           "This literal must be both a map and a set, because some elements "
-          "spread a 'Map' and others spread an 'Iterable', but that isn't "
-          "allowed.",
+              "spread a 'Map' and others spread an 'Iterable', but that isn't "
+              "allowed.",
           correction:
               "Try removing or changing some of the elements so that all of "
               "the elements are consistent.");
@@ -155,8 +155,8 @@
       const CompileTimeErrorCode(
           'AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER',
           "This literal must be either a map or a set, but none of the "
-          "elements have enough type information to know which, and that isn't "
-          "allowed.",
+              "elements have enough type information to know which, and that isn't "
+              "allowed.",
           correction:
               "Try adding type arguments to the literal (one for sets, two "
               "for maps).");
@@ -297,7 +297,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD',
           "'{0}' can't be used to name both a constructor and a static field "
-          "in this class.",
+              "in this class.",
           correction: "Try renaming either the constructor or the field.");
 
   /**
@@ -312,7 +312,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD',
           "'{0}' can't be used to name both a constructor and a static method "
-          "in this class.",
+              "in this class.",
           correction: "Try renaming either the constructor or the method.");
 
   /**
@@ -329,7 +329,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_FIELD_AND_METHOD',
           "Class '{0}' can't define field '{1}' and have method '{2}.{1}' "
-          "with the same name.",
+              "with the same name.",
           correction: "Try converting the getter to a method, or "
               "renaming the field to a name that doesn't conflict.");
 
@@ -348,7 +348,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_GENERIC_INTERFACES',
           "The class '{0}' cannot implement both '{1}' and '{2}' because the "
-          "type arguments are different.");
+              "type arguments are different.");
 
   /**
    * 10.11 Class Member Conflicts: Let `C` be a class. It is a compile-time
@@ -364,7 +364,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_METHOD_AND_FIELD',
           "Class '{0}' can't define method '{1}' and have field '{2}.{1}' "
-          "with the same name.",
+              "with the same name.",
           correction: "Try converting the method to a getter, or "
               "renaming the method to a name that doesn't conflict.");
 
@@ -382,7 +382,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_STATIC_AND_INSTANCE',
           "Class '{0}' can't define static member '{1}' and have instance "
-          "member '{2}.{1}' with the same name.",
+              "member '{2}.{1}' with the same name.",
           correction:
               "Try renaming the member to a name that doesn't conflict.");
 
@@ -398,7 +398,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_TYPE_VARIABLE_AND_CLASS',
           "'{0}' can't be used to name both a type variable and the class in "
-          "which the type variable is defined.",
+              "which the type variable is defined.",
           correction: "Try renaming either the type variable or the class.");
 
   /**
@@ -413,7 +413,7 @@
       const CompileTimeErrorCode(
           'CONFLICTING_TYPE_VARIABLE_AND_MEMBER',
           "'{0}' can't be used to name both a type variable and a member in "
-          "this class.",
+              "this class.",
           correction: "Try renaming either the type variable or the member.");
 
   /**
@@ -439,7 +439,7 @@
       const CompileTimeErrorCode(
           'CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST',
           "Can't define the const constructor because the field '{0}' "
-          "is initialized with a non-constant value.",
+              "is initialized with a non-constant value.",
           correction: "Try initializing the field to a constant value, or "
               "removing the keyword 'const' from the constructor.");
 
@@ -458,7 +458,7 @@
       const CompileTimeErrorCode(
           'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD',
           "Const constructor can't be declared for a class with a mixin "
-          "that declares an instance field.",
+              "that declares an instance field.",
           correction: "Try removing the 'const' keyword or "
               "removing the 'with' clause from the class declaration, "
               "or removing fields from the mixin class.");
@@ -476,7 +476,7 @@
       const CompileTimeErrorCode(
           'CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER',
           "Constant constructor can't call non-constant super constructor of "
-          "'{0}'.",
+              "'{0}'.",
           correction: "Try calling a const constructor in the superclass, or "
               "removing the keyword 'const' from the constructor.");
 
@@ -532,7 +532,7 @@
       const CompileTimeErrorCode(
           'CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used to "
-          "initialized a const variable.",
+              "initialized a const variable.",
           correction:
               "Try initializing the variable without referencing members of the "
               "deferred library, or "
@@ -569,7 +569,7 @@
       const CompileTimeErrorCode(
           'CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
           "The constant map entry key expression type '{0}' can't override "
-          "the == operator.",
+              "the == operator.",
           correction: "Try using a different value for the key, or "
               "removing the keyword 'const' from the map.");
 
@@ -593,7 +593,7 @@
       const CompileTimeErrorCode(
           'CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS',
           "The constant set element type '{0}' can't override "
-          "the == operator.",
+              "the == operator.",
           correction: "Try using a different value for the element, or "
               "removing the keyword 'const' from the set.");
 
@@ -606,7 +606,7 @@
       const CompileTimeErrorCode(
           'CONST_EVAL_TYPE_BOOL',
           "In constant expressions, operands of this operator must be of type "
-          "'bool'.");
+              "'bool'.");
 
   /**
    * 16.12.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2,
@@ -617,7 +617,7 @@
       const CompileTimeErrorCode(
           'CONST_EVAL_TYPE_BOOL_INT',
           "In constant expressions, operands of this operator must be of type "
-          "'bool' or 'int'.");
+              "'bool' or 'int'.");
 
   /**
    * 16.12.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where
@@ -628,7 +628,7 @@
       const CompileTimeErrorCode(
           'CONST_EVAL_TYPE_BOOL_NUM_STRING',
           "In constant expressions, operands of this operator must be of type "
-          "'bool', 'num', 'String' or 'null'.");
+              "'bool', 'num', 'String' or 'null'.");
 
   /**
    * 16.12.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2,
@@ -639,7 +639,7 @@
       const CompileTimeErrorCode(
           'CONST_EVAL_TYPE_INT',
           "In constant expressions, operands of this operator must be of type "
-          "'int'.");
+              "'int'.");
 
   /**
    * 16.12.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 *
@@ -651,13 +651,13 @@
       const CompileTimeErrorCode(
           'CONST_EVAL_TYPE_NUM',
           "In constant expressions, operands of this operator must be of type "
-          "'num'.");
+              "'num'.");
 
   static const CompileTimeErrorCode CONST_EVAL_TYPE_TYPE =
       const CompileTimeErrorCode(
           'CONST_EVAL_TYPE_TYPE',
           "In constant expressions, operands of this operator must be of type "
-          "'Type'.");
+              "'Type'.");
 
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
@@ -675,7 +675,7 @@
       const CompileTimeErrorCode(
           'CONST_EVAL_THROWS_IDBZE',
           "Evaluation of this constant expression throws an "
-          "IntegerDivisionByZeroException.");
+              "IntegerDivisionByZeroException.");
 
   /**
    * 16.12.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>,
@@ -694,7 +694,7 @@
       const CompileTimeErrorCode(
           'CONST_WITH_INVALID_TYPE_PARAMETERS',
           "The type '{0}' is declared with {1} type parameters, but {2} type "
-          "arguments were given.",
+              "arguments were given.",
           correction:
               "Try adjusting the number of type arguments to match the number of "
               "type parameters.");
@@ -804,7 +804,7 @@
       const CompileTimeErrorCode(
           'DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR',
           "Default values aren't allowed in factory constructors that redirect "
-          "to another constructor.",
+              "to another constructor.",
           correction: "Try removing the default value.");
 
   /**
@@ -1038,7 +1038,7 @@
       const CompileTimeErrorCode(
           'FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER',
           "Fields can't be initialized in both the parameter list and the "
-          "initializers.",
+              "initializers.",
           correction: "Try removing one of the initializations.");
 
   /**
@@ -1273,7 +1273,7 @@
       const CompileTimeErrorCode(
           'INCONSISTENT_INHERITANCE_GETTER_AND_METHOD',
           "'{0}' is inherited as a getter (from '{1}') and also a "
-          "method (from '{2}').",
+              "method (from '{2}').",
           correction:
               "Try adjusting the supertypes of this class to remove the "
               "inconsistency.");
@@ -1312,7 +1312,7 @@
       const CompileTimeErrorCode(
           'INITIALIZER_FOR_STATIC_FIELD',
           "'{0}' is a static field in the enclosing class. Fields initialized "
-          "in a constructor can't be static.",
+              "in a constructor can't be static.",
           correction: "Try removing the initialization.");
 
   /**
@@ -1348,7 +1348,7 @@
       const CompileTimeErrorCode(
           'INITIALIZING_FORMAL_FOR_STATIC_FIELD',
           "'{0}' is a static field in the enclosing class. Fields initialized "
-          "in a constructor can't be static.",
+              "in a constructor can't be static.",
           correction: "Try removing the initialization.");
 
   /**
@@ -1396,8 +1396,8 @@
       const CompileTimeErrorCode(
           'INTEGER_LITERAL_IMPRECISE_AS_DOUBLE',
           "The integer literal is being used as a double, but can't be "
-          'represented as a 64 bit double without overflow and/or loss of '
-          'precision: {0}',
+              'represented as a 64 bit double without overflow and/or loss of '
+              'precision: {0}',
           correction:
               'Try using the BigInt class, or switch to the closest valid '
               'double: {1}');
@@ -1412,7 +1412,7 @@
       const CompileTimeErrorCode(
           'INVALID_ANNOTATION',
           "Annotation must be either a const variable reference or const "
-          "constructor invocation.");
+              "constructor invocation.");
 
   /**
    * 15 Metadata: Metadata consists of a series of annotations, each of which
@@ -1484,7 +1484,7 @@
       const CompileTimeErrorCode(
           'INVALID_FACTORY_NAME_NOT_A_CLASS',
           "The name of a factory constructor must be the same as the name of "
-          "the immediately enclosing class.");
+              "the immediately enclosing class.");
 
   static const CompileTimeErrorCode INVALID_INLINE_FUNCTION_TYPE =
       const CompileTimeErrorCode('INVALID_INLINE_FUNCTION_TYPE',
@@ -1533,7 +1533,7 @@
       const CompileTimeErrorCode(
           'INVALID_TYPE_ARGUMENT_IN_CONST_LIST',
           "Constant list literals can't include a type parameter as a type "
-          "argument, such as '{0}'.",
+              "argument, such as '{0}'.",
           correction:
               "Try replacing the type parameter with a different type.");
 
@@ -1548,7 +1548,7 @@
       const CompileTimeErrorCode(
           'INVALID_TYPE_ARGUMENT_IN_CONST_MAP',
           "Constant map literals can't include a type parameter as a type "
-          "argument, such as '{0}'.",
+              "argument, such as '{0}'.",
           correction:
               "Try replacing the type parameter with a different type.");
 
@@ -1556,7 +1556,7 @@
       const CompileTimeErrorCode(
           'INVALID_TYPE_ARGUMENT_IN_CONST_SET',
           "Constant set literals can't include a type parameter as a type "
-          "argument, such as '{0}'.",
+              "argument, such as '{0}'.",
           correction:
               "Try replacing the type parameter with a different type.");
 
@@ -1567,7 +1567,7 @@
       const CompileTimeErrorCode(
           'INVALID_USE_OF_COVARIANT',
           "The 'covariant' keyword can only be used for parameters in instance "
-          "methods or before non-final instance fields.",
+              "methods or before non-final instance fields.",
           correction: "Try removing the 'covariant' keyword.");
 
   /**
@@ -1643,7 +1643,7 @@
       const CompileTimeErrorCode(
           'MISSING_CONST_IN_LIST_LITERAL',
           "List literals must be prefixed with 'const' when used as a constant "
-          "expression.",
+              "expression.",
           correction: "Try adding the keyword 'const' before the literal.");
 
   /**
@@ -1653,7 +1653,7 @@
       const CompileTimeErrorCode(
           'MISSING_CONST_IN_MAP_LITERAL',
           "Map literals must be prefixed with 'const' when used as a constant "
-          "expression.",
+              "expression.",
           correction: "Try adding the keyword 'const' before the literal.");
 
   /**
@@ -1663,7 +1663,7 @@
       const CompileTimeErrorCode(
           'MISSING_CONST_IN_SET_LITERAL',
           "Set literals must be prefixed with 'const' when used as a constant "
-          "expression.",
+              "expression.",
           correction: "Try adding the keyword 'const' before the literal.");
 
   static const CompileTimeErrorCode MISSING_DART_LIBRARY =
@@ -1691,7 +1691,7 @@
       const CompileTimeErrorCode(
           'MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE',
           "The super-invoked member '{0}' has the type '{1}', but the "
-          "concrete member in the class has type '{2}'.");
+              "concrete member in the class has type '{2}'.");
 
   /**
    * It's a compile-time error to apply a mixin to a class that doesn't
@@ -1719,7 +1719,7 @@
       const CompileTimeErrorCode(
           'MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER',
           "The class doesn't have a concrete implementation of the "
-          "super-invoked member '{0}'.");
+              "super-invoked member '{0}'.");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin
@@ -1732,7 +1732,7 @@
       const CompileTimeErrorCode(
           'MIXIN_CLASS_DECLARES_CONSTRUCTOR',
           "The class '{0}' can't be used as a mixin because it declares a "
-          "constructor.");
+              "constructor.");
 
   /**
    * The <i>mixinMember</i> production allows the same instance or static
@@ -1761,22 +1761,22 @@
       const CompileTimeErrorCode(
           'MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES',
           "Type parameters could not be inferred for the mixin '{0}' because "
-          "the base class implements the mixin's supertype constraint "
-          "'{1}' in multiple conflicting ways");
+              "the base class implements the mixin's supertype constraint "
+              "'{1}' in multiple conflicting ways");
 
   static const CompileTimeErrorCode MIXIN_INFERENCE_NO_MATCHING_CLASS =
       const CompileTimeErrorCode(
           'MIXIN_INFERENCE_NO_MATCHING_CLASS',
           "Type parameters could not be inferred for the mixin '{0}' because "
-          "the base class does not implement the mixin's supertype "
-          "constraint '{1}'");
+              "the base class does not implement the mixin's supertype "
+              "constraint '{1}'");
 
   static const CompileTimeErrorCode MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION =
       const CompileTimeErrorCode(
           'MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION',
           "Type parameters could not be inferred for the mixin '{0}' because "
-          "no type parameter substitution could be found matching the mixin's "
-          "supertype constraints");
+              "no type parameter substitution could be found matching the mixin's "
+              "supertype constraints");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class
@@ -1789,7 +1789,7 @@
       const CompileTimeErrorCode(
           'MIXIN_INHERITS_FROM_NOT_OBJECT',
           "The class '{0}' can't be used as a mixin because it extends a class "
-          "other than Object.");
+              "other than Object.");
 
   /**
    * A mixin declaration introduces a mixin and an interface, but not a class.
@@ -1842,7 +1842,7 @@
       const CompileTimeErrorCode(
           'MIXIN_REFERENCES_SUPER',
           "The class '{0}' can't be used as a mixin because it references "
-          "'super'.");
+              "'super'.");
 
   static const CompileTimeErrorCode
       MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS = const CompileTimeErrorCode(
@@ -1958,7 +1958,7 @@
       const CompileTimeErrorCode(
           'NON_CONST_MAP_AS_EXPRESSION_STATEMENT',
           "A non-constant map or set literal without type arguments can't be "
-          "used as an expression statement.");
+              "used as an expression statement.");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) {
@@ -1994,7 +1994,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as a case "
-          "expression.",
+              "expression.",
           correction:
               "Try re-writing the switch as a series of if statements, or "
               "changing the import to not be deferred.");
@@ -2019,7 +2019,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as a default "
-          "parameter value.",
+              "parameter value.",
           correction:
               "Try leaving the default as null and initializing the parameter "
               "inside the function body.");
@@ -2046,7 +2046,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as values in "
-          "a 'const' list.",
+              "a 'const' list.",
           correction:
               "Try removing the keyword 'const' from the list literal.");
 
@@ -2070,7 +2070,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as keys in a "
-          "const map literal.",
+              "const map literal.",
           correction: "Try removing the keyword 'const' from the map literal.");
 
   /**
@@ -2102,7 +2102,7 @@
       NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode(
           'NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as values in "
-          "a const map literal.",
+              "a const map literal.",
           correction: "Try removing the keyword 'const' from the map literal.");
 
   /**
@@ -2128,7 +2128,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be spread into a "
-          "const literal.",
+              "const literal.",
           correction: "Try making the deferred import non-deferred.");
 
   static const CompileTimeErrorCode
@@ -2136,7 +2136,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as values in "
-          "an if condition inside a const collection literal.",
+              "an if condition inside a const collection literal.",
           correction: "Try making the deferred import non-deferred.");
 
   static const CompileTimeErrorCode
@@ -2144,7 +2144,7 @@
       const CompileTimeErrorCode(
           'NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY',
           "Constant values from a deferred library can't be used as values in "
-          "a 'const' set.",
+              "a 'const' set.",
           correction: "Try removing the keyword 'const' from the set literal.");
 
   /**
@@ -2203,6 +2203,53 @@
               "making the called constructor not be a factory constructor.");
 
   /**
+   * It is an error if the type `T` in the on-catch clause `on T catch` is
+   * potentially nullable.
+   */
+  static const CompileTimeErrorCode NULLABLE_TYPE_IN_CATCH_CLAUSE =
+      const CompileTimeErrorCode(
+          'NULLABLE_TYPE_IN_CATCH_CLAUSE',
+          "A nullable type cannot be used in an 'on' clause because it isn't valid "
+              "to throw 'null'.",
+          correction: "Try removing the question mark.");
+
+  /**
+   * It is a compile-time error for a class to extend, implement, or mixin a
+   * type of the form T? for any T.
+   */
+  static const CompileTimeErrorCode NULLABLE_TYPE_IN_EXTENDS_CLAUSE =
+      const CompileTimeErrorCode('NULLABLE_TYPE_IN_EXTENDS_CLAUSE',
+          "A class cannot extend a nullable type.",
+          correction: "Try removing the question mark.");
+
+  /**
+   * It is a compile-time error for a class to extend, implement, or mixin a
+   * type of the form T? for any T.
+   */
+  static const CompileTimeErrorCode NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE =
+      const CompileTimeErrorCode('NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE',
+          "A class or mixin cannot implement a nullable type.",
+          correction: "Try removing the question mark.");
+
+  /**
+   * It is a compile-time error for a class to extend, implement, or mixin a
+   * type of the form T? for any T.
+   */
+  static const CompileTimeErrorCode NULLABLE_TYPE_IN_ON_CLAUSE =
+      const CompileTimeErrorCode('NULLABLE_TYPE_IN_ON_CLAUSE',
+          "A mixin cannot have a nullable type as a superclass constraint.",
+          correction: "Try removing the question mark.");
+
+  /**
+   * It is a compile-time error for a class to extend, implement, or mixin a
+   * type of the form T? for any T.
+   */
+  static const CompileTimeErrorCode NULLABLE_TYPE_IN_WITH_CLAUSE =
+      const CompileTimeErrorCode('NULLABLE_TYPE_IN_WITH_CLAUSE',
+          "A class or mixin cannot mix in a nullable type.",
+          correction: "Try removing the question mark.");
+
+  /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause
    * for class Object.
    */
@@ -2252,7 +2299,7 @@
       const CompileTimeErrorCode(
           'PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER',
           "The name '{0}' is already used as an import prefix and can't be "
-          "used to name a top-level element.",
+              "used to name a top-level element.",
           correction:
               "Try renaming either the top-level element or the prefix.");
 
@@ -2264,7 +2311,7 @@
       const CompileTimeErrorCode(
           'PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT',
           "The name '{0}' refers to an import prefix, so it must be followed "
-          "by '.'.",
+              "by '.'.",
           correction:
               "Try correcting the name to refer to something other than a prefix, or "
               "renaming the prefix.");
@@ -2277,7 +2324,7 @@
       const CompileTimeErrorCode(
           'PRIVATE_COLLISION_IN_MIXIN_APPLICATION',
           "The private name '{0}', defined by '{1}', "
-          "conflicts with the same name defined by '{2}'.",
+              "conflicts with the same name defined by '{2}'.",
           correction: "Try removing '{1}' from the 'with' clause.");
 
   /**
@@ -2414,7 +2461,7 @@
       const CompileTimeErrorCode(
           'REDIRECT_TO_NON_CLASS',
           "The name '{0}' isn't a type and can't be used in a redirected "
-          "constructor.",
+              "constructor.",
           correction: "Try redirecting to a different constructor.");
 
   /**
@@ -2425,7 +2472,7 @@
       const CompileTimeErrorCode(
           'REDIRECT_TO_NON_CONST_CONSTRUCTOR',
           "Constant factory constructor can't delegate to a non-constant "
-          "constructor.",
+              "constructor.",
           correction: "Try redirecting to a different constructor.");
 
   /**
@@ -2503,7 +2550,7 @@
       const CompileTimeErrorCode(
           'SHARED_DEFERRED_PREFIX',
           "The prefix of a deferred import can't be used in other import "
-          "directives.",
+              "directives.",
           correction: "Try renaming one of the prefixes.");
 
   /**
@@ -2596,7 +2643,7 @@
       const CompileTimeErrorCode(
           'TYPE_ALIAS_CANNOT_REFERENCE_ITSELF',
           "Typedefs can't reference themselves directly or recursively via "
-          "another typedef.");
+              "another typedef.");
 
   static const CompileTimeErrorCode TYPE_PARAMETER_ON_CONSTRUCTOR =
       const CompileTimeErrorCode('TYPE_PARAMETER_ON_CONSTRUCTOR',
@@ -2776,7 +2823,7 @@
       const CompileTimeErrorCode(
           'YIELD_EACH_IN_NON_GENERATOR',
           "Yield-each statements must be in a generator function "
-          "(one marked with either 'async*' or 'sync*').",
+              "(one marked with either 'async*' or 'sync*').",
           correction:
               "Try adding 'async*' or 'sync*' to the enclosing function.");
 
@@ -2788,7 +2835,7 @@
       const CompileTimeErrorCode(
           'YIELD_IN_NON_GENERATOR',
           "Yield statements must be in a generator function "
-          "(one marked with either 'async*' or 'sync*').",
+              "(one marked with either 'async*' or 'sync*').",
           correction:
               "Try adding 'async*' or 'sync*' to the enclosing function.");
 
@@ -2829,7 +2876,7 @@
       const StaticTypeWarningCode(
           'EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
           "List literals require exactly one type argument or none, "
-          "but {0} found.",
+              "but {0} found.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -2840,7 +2887,7 @@
       const StaticTypeWarningCode(
           'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
           "Set literals require exactly one type argument or none, "
-          "but {0} found.",
+              "but {0} found.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -2854,7 +2901,7 @@
       const StaticTypeWarningCode(
           'EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
           "Map literals require exactly two type arguments or none, "
-          "but {0} found.",
+              "but {0} found.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -2865,7 +2912,7 @@
       const StaticTypeWarningCode(
           'ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE',
           "Functions marked 'async*' must have a return type assignable to "
-          "'Stream'.",
+              "'Stream'.",
           correction: "Try fixing the return type of the function, or "
               "removing the modifier 'async*' from the function body.");
 
@@ -2877,7 +2924,7 @@
       const StaticTypeWarningCode(
           'ILLEGAL_ASYNC_RETURN_TYPE',
           "Functions marked 'async' must have a return type assignable to "
-          "'Future'.",
+              "'Future'.",
           correction: "Try fixing the return type of the function, or "
               "removing the modifier 'async' from the function body.");
 
@@ -3211,7 +3258,7 @@
       const StaticTypeWarningCode(
           'UNDEFINED_PREFIXED_NAME',
           "The name '{0}' is being referenced through the prefix '{1}', but it "
-          "isn't defined in any of the libraries imported using that prefix.",
+              "isn't defined in any of the libraries imported using that prefix.",
           correction: "Try correcting the prefix or "
               "importing the library that defines '{0}'.");
 
@@ -3339,7 +3386,7 @@
       const StaticTypeWarningCode(
           'WRONG_NUMBER_OF_TYPE_ARGUMENTS',
           "The type '{0}' is declared with {1} type parameters, "
-          "but {2} type arguments were given.",
+              "but {2} type arguments were given.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -3369,7 +3416,7 @@
       const StaticTypeWarningCode(
           'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
           "The method '{0}' is declared with {1} type parameters, "
-          "but {2} type arguments were given.",
+              "but {2} type arguments were given.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -3394,7 +3441,7 @@
       const StaticTypeWarningCode(
           'YIELD_OF_INVALID_TYPE',
           "The type '{0}' implied by the 'yield' expression must be assignable "
-          "to '{1}'.");
+              "to '{1}'.");
 
   /**
    * 17.6.2 For-in. If the iterable expression does not implement Iterable,
@@ -3422,7 +3469,7 @@
       const StaticTypeWarningCode(
           'FOR_IN_OF_INVALID_ELEMENT_TYPE',
           "The type '{0}' used in the 'for' loop must implement {1} with a "
-          "type argument that can be assigned to '{2}'.");
+              "type argument that can be assigned to '{2}'.");
 
   /**
    * Initialize a newly created error code to have the given [name]. The message
@@ -3584,7 +3631,7 @@
       const StaticWarningCode(
           'CASE_BLOCK_NOT_TERMINATED',
           "The last statement of the 'case' should be 'break', 'continue', "
-          "'rethrow', 'return' or 'throw'.",
+              "'rethrow', 'return' or 'throw'.",
           correction: "Try adding one of the required statements.");
 
   /**
@@ -3677,7 +3724,7 @@
       const StaticWarningCode(
           'FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION',
           "Fields can't be initialized in the constructor if they are final "
-          "and have already been initialized at their declaration.",
+              "and have already been initialized at their declaration.",
           correction: "Try removing one of the initializations.");
 
   /**
@@ -3693,7 +3740,7 @@
       const StaticWarningCode(
           'FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR',
           "'{0}' is final and was given a value when it was declared, "
-          "so it can't be set to a new value.",
+              "so it can't be set to a new value.",
           correction: "Try removing one of the initializations.");
 
   /**
@@ -3841,7 +3888,7 @@
       INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const StaticWarningCode(
           'INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED',
           "Parameters can't override default values, "
-          "this method overrides '{0}.{1}' where '{2}' has a different value.",
+              "this method overrides '{0}.{1}' where '{2}' has a different value.",
           correction: "Try using the same default value in both methods.",
           errorSeverity: ErrorSeverity.WARNING);
 
@@ -3857,7 +3904,7 @@
       const StaticWarningCode(
           'INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL',
           "Parameters can't override default values, this method overrides "
-          "'{0}.{1}' where this positional parameter has a different value.",
+              "'{0}.{1}' where this positional parameter has a different value.",
           correction: "Try using the same default value in both methods.",
           errorSeverity: ErrorSeverity.WARNING);
 
@@ -3935,7 +3982,7 @@
       const StaticWarningCode(
           'MISMATCHED_GETTER_AND_SETTER_TYPES',
           "The return type of getter '{0}' is '{1}' which isn't assignable "
-          "to the type '{2}' of its setter '{3}'.",
+              "to the type '{2}' of its setter '{3}'.",
           correction: "Try changing the types so that they are compatible.");
 
   /**
@@ -3995,7 +4042,7 @@
       const StaticWarningCode(
           'NEW_WITH_INVALID_TYPE_PARAMETERS',
           "The type '{0}' is declared with {1} type parameters, "
-          "but {2} type arguments were given.",
+              "but {2} type arguments were given.",
           correction: "Try adjusting the number of type arguments.");
 
   /**
@@ -4353,7 +4400,7 @@
       const StaticWarningCode(
           'SWITCH_EXPRESSION_NOT_ASSIGNABLE',
           "Type '{0}' of the switch expression isn't assignable to "
-          "the type '{1}' of case expressions.");
+              "the type '{1}' of case expressions.");
 
   /**
    * 15.1 Static Types: It is a static warning to use a deferred type in a type
@@ -4477,7 +4524,7 @@
       const StaticWarningCode(
           'UNCHECKED_USE_OF_NULLABLE_VALUE',
           'The expression is nullable and must be null-checked before it can be'
-          ' used.',
+              ' used.',
           correction:
               'Try casting or check the value is not null before using it.');
 
@@ -4603,29 +4650,29 @@
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_LITERAL_LIST',
       "The list literal type '{0}' isn't of expected type '{1}'. The list's "
-      "type can be changed with an explicit generic type argument or by "
-      "changing the element types.");
+          "type can be changed with an explicit generic type argument or by "
+          "changing the element types.");
 
   static const StrongModeCode INVALID_CAST_LITERAL_MAP = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_LITERAL_MAP',
       "The map literal type '{0}' isn't of expected type '{1}'. The maps's "
-      "type can be changed with an explicit generic type arguments or by "
-      "changing the key and value types.");
+          "type can be changed with an explicit generic type arguments or by "
+          "changing the key and value types.");
 
   static const StrongModeCode INVALID_CAST_LITERAL_SET = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_LITERAL_SET',
       "The set literal type '{0}' isn't of expected type '{1}'. The set's "
-      "type can be changed with an explicit generic type argument or by "
-      "changing the element types.");
+          "type can be changed with an explicit generic type argument or by "
+          "changing the element types.");
 
   static const StrongModeCode INVALID_CAST_FUNCTION_EXPR = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_FUNCTION_EXPR',
       "The function expression type '{0}' isn't of type '{1}'. "
-      "This means its parameter or return type does not match what is "
-      "expected. Consider changing parameter type(s) or the returned type(s).");
+          "This means its parameter or return type does not match what is "
+          "expected. Consider changing parameter type(s) or the returned type(s).");
 
   static const StrongModeCode INVALID_CAST_NEW_EXPR = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
@@ -4636,21 +4683,21 @@
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_METHOD',
       "The method tear-off '{0}' has type '{1}' that isn't of expected type "
-      "'{2}'. This means its parameter or return type does not match what is "
-      "expected.");
+          "'{2}'. This means its parameter or return type does not match what is "
+          "expected.");
 
   static const StrongModeCode INVALID_CAST_FUNCTION = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_FUNCTION',
       "The function '{0}' has type '{1}' that isn't of expected type "
-      "'{2}'. This means its parameter or return type does not match what is "
-      "expected.");
+          "'{2}'. This means its parameter or return type does not match what is "
+          "expected.");
 
   static const StrongModeCode INVALID_SUPER_INVOCATION = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_SUPER_INVOCATION',
       "super call must be last in an initializer "
-      "list (see https://goo.gl/EY6hDP): '{0}'.");
+          "list (see https://goo.gl/EY6hDP): '{0}'.");
 
   static const StrongModeCode NON_GROUND_TYPE_CHECK_INFO = const StrongModeCode(
       ErrorType.HINT,
@@ -4758,14 +4805,14 @@
       ErrorType.STATIC_WARNING,
       'TOP_LEVEL_INSTANCE_GETTER',
       "The type of '{0}' can't be inferred because it refers to an instance "
-      "getter, '{1}', which has an implicit type.",
+          "getter, '{1}', which has an implicit type.",
       correction: "Add an explicit type for either '{0}' or '{1}'.");
 
   static const StrongModeCode TOP_LEVEL_INSTANCE_METHOD = const StrongModeCode(
       ErrorType.STATIC_WARNING,
       'TOP_LEVEL_INSTANCE_METHOD',
       "The type of '{0}' can't be inferred because it refers to an instance "
-      "method, '{1}', which has an implicit type.",
+          "method, '{1}', which has an implicit type.",
       correction: "Add an explicit type for either '{0}' or '{1}'.");
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 1a75a35..22634cd 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -56,8 +56,9 @@
     show NullValue, StackListener;
 import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
 import 'package:front_end/src/scanner/token.dart'
-    show SyntheticStringToken, SyntheticToken;
+    show CommentToken, SyntheticStringToken, SyntheticToken;
 import 'package:kernel/ast.dart' show AsyncMarker;
+import 'package:pub_semver/pub_semver.dart';
 
 const _invalidCollectionElement = const _InvalidCollectionElement._();
 
@@ -68,6 +69,7 @@
   final FastaErrorReporter errorReporter;
   final Uri fileUri;
   ScriptTag scriptTag;
+  Version languageVersion;
   final List<Directive> directives = <Directive>[];
   final List<CompilationUnitMember> declarations = <CompilationUnitMember>[];
   final localDeclarations = <int, AstNode>{};
@@ -482,6 +484,7 @@
     CompilationUnitImpl unit = ast.compilationUnit(
             beginToken, scriptTag, directives, declarations, endToken)
         as CompilationUnitImpl;
+    unit.languageVersion = languageVersion;
     unit.isNonNullable = enableNonNullable;
     push(unit);
   }
@@ -2470,6 +2473,16 @@
     push(ast.label(name, colon));
   }
 
+  @override
+  void handleLanguageVersion(Token commentToken, int major, int minor) {
+    debugEvent('LanguageVersion');
+    assert(commentToken is CommentToken);
+    assert(major != null);
+    assert(minor != null);
+
+    languageVersion = Version(major, minor, 0);
+  }
+
   void handleLiteralBool(Token token) {
     bool value = identical(token.stringValue, "true");
     assert(value || identical(token.stringValue, "false"));
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 1b53d3f..27097db 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -536,6 +536,11 @@
   @override
   void visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
+    if (node.operator.type == TokenType.BANG) {
+      // Null-assertion operator (`!`).  There's nothing to do, since this is a
+      // built-in operation (there's no associated operator declaration).
+      return;
+    }
     String methodName = _getPostfixOperator(node);
     DartType staticType = _getStaticType(operand);
     MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 0c23f5c..c37d478 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -857,6 +857,16 @@
     String extension = FileNameUtilities.getExtension(fileName).toLowerCase();
     return extension == SUFFIX_DART;
   }
+
+  /**
+   * Return `true` if the given [fileName] is AndroidManifest.xml
+   */
+  static bool isManifestFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    return fileName.endsWith(AnalysisEngine.ANDROID_MANIFEST_FILE);
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 236bfe4..7f2f741 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -473,6 +473,7 @@
     try {
       _isInCatchClause = true;
       _checkForTypeAnnotationDeferredClass(node.exceptionType);
+      _checkForPotentiallyNullableType(node.exceptionType);
       super.visitCatchClause(node);
     } finally {
       _isInCatchClause = previousIsInCatchClause;
@@ -994,7 +995,7 @@
       _checkTypeArgumentCount(typeArguments, 1,
           StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
     }
-    _checkForRawTypedLiteral(node);
+    _checkForInferenceFailureOnCollectionLiteral(node);
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForListElementTypeNotAssignable(node);
 
@@ -1103,9 +1104,11 @@
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
-    _checkForAssignmentToFinal(node.operand);
-    _checkForIntNotAssignable(node.operand);
-    _checkForNullableDereference(node.operand);
+    if (node.operator.type != TokenType.BANG) {
+      _checkForAssignmentToFinal(node.operand);
+      _checkForIntNotAssignable(node.operand);
+      _checkForNullableDereference(node.operand);
+    }
     super.visitPostfixExpression(node);
   }
 
@@ -1201,7 +1204,7 @@
         _checkTypeArgumentCount(typeArguments, 2,
             StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
       }
-      _checkForRawTypedLiteral(node);
+      _checkForInferenceFailureOnCollectionLiteral(node);
       _checkForImplicitDynamicTypedLiteral(node);
       _checkForMapTypeNotAssignable(node);
       _checkForNonConstMapAsExpressionStatement3(node);
@@ -1217,7 +1220,7 @@
         _checkTypeArgumentCount(typeArguments, 1,
             StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
       }
-      _checkForRawTypedLiteral(node);
+      _checkForInferenceFailureOnCollectionLiteral(node);
       _checkForImplicitDynamicTypedLiteral(node);
       _checkForSetElementTypeNotAssignable3(node);
     }
@@ -1315,7 +1318,12 @@
   @override
   void visitTypeName(TypeName node) {
     _checkForTypeArgumentNotMatchingBounds(node);
-    _checkForRawTypeName(node);
+    if (node.parent is ConstructorName &&
+        node.parent.parent is InstanceCreationExpression) {
+      _checkForInferenceFailureOnInstanceCreation(node, node.parent.parent);
+    } else {
+      _checkForRawTypeName(node);
+    }
     super.visitTypeName(node);
   }
 
@@ -3666,6 +3674,46 @@
         [directive.uri.stringValue]);
   }
 
+  /// Checks a collection literal for an inference failure, and reports the
+  /// appropriate error if [AnalysisOptionsImpl.strictInference] is set.
+  ///
+  /// This checks if [node] does not have explicit or inferred type arguments.
+  /// When that happens, it reports a
+  /// HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL error.
+  void _checkForInferenceFailureOnCollectionLiteral(TypedLiteral node) {
+    if (!_options.strictInference || node == null) return;
+    if (node.typeArguments != null) {
+      // Type has explicit type arguments.
+      return;
+    }
+    var type = node.staticType;
+    if (_isMissingTypeArguments(node, type, type.element, node)) {
+      _errorReporter.reportErrorForNode(
+          HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL, node, [type.name]);
+    }
+  }
+
+  /// Checks a type on an instance creation expression for an inference
+  /// failure, and reports the appropriate error if
+  /// [AnalysisOptionsImpl.strictInference] is set.
+  ///
+  /// This checks if [node] refers to a generic type and does not have explicit
+  /// or inferred type arguments. When that happens, it reports a
+  /// HintMode.INFERENCE_FAILURE_ON_INSTANCE_CREATION error.
+  void _checkForInferenceFailureOnInstanceCreation(
+      TypeName node, InstanceCreationExpression inferenceContextNode) {
+    if (!_options.strictInference || node == null) return;
+    if (node.typeArguments != null) {
+      // Type has explicit type arguments.
+      return;
+    }
+    if (_isMissingTypeArguments(
+        node, node.type, node.name.staticElement, inferenceContextNode)) {
+      _errorReporter.reportErrorForNode(
+          HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, node, [node.type]);
+    }
+  }
+
   /**
    * Check that the given [typeReference] is not a type reference and that then
    * the [name] is reference to an instance member.
@@ -4549,8 +4597,8 @@
     if (expression == null ||
         !_isNonNullable ||
         expression.staticType == null ||
-        (expression.staticType as TypeImpl).nullability !=
-            Nullability.nullable) {
+        (expression.staticType as TypeImpl).nullabilitySuffix !=
+            NullabilitySuffix.question) {
       return false;
     }
 
@@ -4671,6 +4719,18 @@
   }
 
   /**
+   * Verify that the [type] is not potentially nullable.
+   */
+  void _checkForPotentiallyNullableType(TypeAnnotation type) {
+    if (_options.experimentStatus.non_nullable &&
+        type?.type != null &&
+        _typeSystem.isPotentiallyNullable(type.type)) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NULLABLE_TYPE_IN_CATCH_CLAUSE, type);
+    }
+  }
+
+  /**
    * Check that the given named optional [parameter] does not begin with '_'.
    *
    * See [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER].
@@ -4692,60 +4752,6 @@
         CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, parameter);
   }
 
-  /// Similar to [_checkForRawTypeName] but for list/map/set literals.
-  void _checkForRawTypedLiteral(TypedLiteral node) {
-    if (!_options.strictRawTypes || node == null) return;
-    if (node.typeArguments != null) {
-      // Type has explicit type arguments.
-      return;
-    }
-    var type = node.staticType;
-    return _checkForRawTypeErrors(node, type, type.element, node);
-  }
-
-  /// Given a [node] without type arguments that refers to [element], issues
-  /// an error if [type] is a generic type, and the type arguments were not
-  /// supplied from inference or a non-dynamic default instantiation.
-  ///
-  /// This function is used by other node-specific raw type checking functions
-  /// (for example [_checkForRawTypeName]), and should only be called when
-  /// we already know [AnalysisOptionsImpl.strictRawTypes] is true and [node]
-  /// has no explicit `typeArguments`.
-  ///
-  /// [inferenceContextNode] is the node that has the downwards context type,
-  /// if any. For example an [InstanceCreationExpression].
-  ///
-  /// The raw type error [HintCode.STRICT_RAW_TYPE] will *not* be reported when
-  /// any of the following are true:
-  ///
-  /// - [inferenceContextNode] has an inference context type that does not
-  ///   contain `?`
-  /// - [type] does not have any `dynamic` type arguments.
-  /// - the element is marked with `@optionalTypeArgs` from "package:meta".
-  void _checkForRawTypeErrors(AstNode node, DartType type, Element element,
-      Expression inferenceContextNode) {
-    assert(_options.strictRawTypes);
-    // Check if this type has type arguments and at least one is dynamic.
-    // If so, we may need to issue a strict-raw-types error.
-    if (type is ParameterizedType &&
-        type.typeArguments.any((t) => t.isDynamic)) {
-      // If we have an inference context node, check if the type was inferred
-      // from it. Some cases will not have a context type, such as the type
-      // annotation `List` in `List list;`
-      if (inferenceContextNode != null) {
-        var contextType = InferenceContext.getContext(inferenceContextNode);
-        if (contextType != null && UnknownInferredType.isKnown(contextType)) {
-          // Type was inferred from downwards context: not an error.
-          return;
-        }
-      }
-      if (element.hasOptionalTypeArgs) {
-        return;
-      }
-      _errorReporter.reportErrorForNode(HintCode.STRICT_RAW_TYPE, node, [type]);
-    }
-  }
-
   /// Checks a type annotation for a raw generic type, and reports the
   /// appropriate error if [AnalysisOptionsImpl.strictRawTypes] is set.
   ///
@@ -4758,16 +4764,11 @@
       // Type has explicit type arguments.
       return;
     }
-    var parent = node.parent;
-    InstanceCreationExpression inferenceContextNode;
-    if (parent is ConstructorName) {
-      var grandparent = parent.parent;
-      if (grandparent is InstanceCreationExpression) {
-        inferenceContextNode = grandparent;
-      }
+    if (_isMissingTypeArguments(
+        node, node.type, node.name.staticElement, null)) {
+      _errorReporter
+          .reportErrorForNode(HintCode.STRICT_RAW_TYPE, node, [node.type]);
     }
-    return _checkForRawTypeErrors(
-        node, node.type, node.name.staticElement, inferenceContextNode);
   }
 
   /**
@@ -5207,7 +5208,7 @@
   }
 
   /**
-   * Verify that the given type [name] is not a deferred type.
+   * Verify that the [type] is not a deferred type.
    *
    * See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
    */
@@ -5414,8 +5415,8 @@
     }
 
     if (target.staticType != null &&
-        (target.staticType as TypeImpl).nullability ==
-            Nullability.nonNullable) {
+        (target.staticType as TypeImpl).nullabilitySuffix ==
+            NullabilitySuffix.none) {
       _errorReporter.reportErrorForToken(
           HintCode.UNNECESSARY_NULL_AWARE_CALL, operator, []);
     }
@@ -6111,6 +6112,46 @@
     return false;
   }
 
+  /// Given a [node] without type arguments that refers to [element], issues
+  /// an error if [type] is a generic type, and the type arguments were not
+  /// supplied from inference or a non-dynamic default instantiation.
+  ///
+  /// This function is used by other node-specific type checking functions, and
+  /// should only be called when [node] has no explicit `typeArguments`.
+  ///
+  /// [inferenceContextNode] is the node that has the downwards context type,
+  /// if any. For example an [InstanceCreationExpression].
+  ///
+  /// This function will return false if any of the following are true:
+  ///
+  /// - [inferenceContextNode] has an inference context type that does not
+  ///   contain `?`
+  /// - [type] does not have any `dynamic` type arguments.
+  /// - the element is marked with `@optionalTypeArgs` from "package:meta".
+  bool _isMissingTypeArguments(AstNode node, DartType type, Element element,
+      Expression inferenceContextNode) {
+    // Check if this type has type arguments and at least one is dynamic.
+    // If so, we may need to issue a strict-raw-types error.
+    if (type is ParameterizedType &&
+        type.typeArguments.any((t) => t.isDynamic)) {
+      // If we have an inference context node, check if the type was inferred
+      // from it. Some cases will not have a context type, such as the type
+      // annotation `List` in `List list;`
+      if (inferenceContextNode != null) {
+        var contextType = InferenceContext.getContext(inferenceContextNode);
+        if (contextType != null && UnknownInferredType.isKnown(contextType)) {
+          // Type was inferred from downwards context: not an error.
+          return false;
+        }
+      }
+      if (element.hasOptionalTypeArgs) {
+        return false;
+      }
+      return true;
+    }
+    return false;
+  }
+
   /**
    * Return `true` if the given 'this' [expression] is in a valid context.
    */
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index fa863d1..9295e4f 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1833,7 +1833,7 @@
   }
 
   void _checkForDeadNullCoalesce(TypeImpl lhsType, Expression rhs) {
-    if (lhsType.nullability == Nullability.nonNullable) {
+    if (_isNonNullableUnit && _typeSystem.isNonNullable(lhsType)) {
       _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, rhs, []);
     }
   }
@@ -3632,7 +3632,7 @@
       const ResolverErrorCode(
           'PART_OF_UNNAMED_LIBRARY',
           "Library is unnamed. Expected a URI not a library name '{0}' in the "
-          "part-of directive.",
+              "part-of directive.",
           correction:
               "Try changing the part-of directive to a URI, or try including a"
               " different part.");
@@ -3851,13 +3851,6 @@
     // TODO(brianwilkerson) Remove this method.
   }
 
-  /// A client is about to resolve a member in the given class declaration.
-  void prepareToResolveMembersInClass(ClassDeclaration node) {
-    _enclosingClassDeclaration = node;
-    enclosingClass = node.declaredElement;
-    typeAnalyzer.thisType = enclosingClass?.type;
-  }
-
   /// Set information about enclosing declarations.
   void prepareEnclosingDeclarations({
     ClassElement enclosingClassElement,
@@ -3869,6 +3862,13 @@
     _enclosingFunction = enclosingExecutableElement;
   }
 
+  /// A client is about to resolve a member in the given class declaration.
+  void prepareToResolveMembersInClass(ClassDeclaration node) {
+    _enclosingClassDeclaration = node;
+    enclosingClass = node.declaredElement;
+    typeAnalyzer.thisType = enclosingClass?.type;
+  }
+
   /// Visit the given [comment] if it is not `null`.
   void safelyVisitComment(Comment comment) {
     if (comment != null) {
@@ -6640,16 +6640,16 @@
     return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
   }
 
-  Nullability _getNullability(bool hasQuestion) {
-    Nullability nullability;
+  NullabilitySuffix _getNullability(bool hasQuestion) {
+    NullabilitySuffix nullability;
     if (isNonNullableUnit) {
       if (hasQuestion) {
-        nullability = Nullability.nullable;
+        nullability = NullabilitySuffix.question;
       } else {
-        nullability = Nullability.nonNullable;
+        nullability = NullabilitySuffix.none;
       }
     } else {
-      nullability = Nullability.indeterminate;
+      nullability = NullabilitySuffix.star;
     }
     return nullability;
   }
@@ -6793,6 +6793,25 @@
   bool _isTypeNameInTypeArgumentList(TypeName typeName) =>
       typeName.parent is TypeArgumentList;
 
+  /// Given a [typeName] that has a question mark, report an error and return
+  /// `true` if it appears in a location where a nullable type is not allowed.
+  void _reportInvalidNullableType(TypeName typeName) {
+    AstNode parent = typeName.parent;
+    if (parent is ExtendsClause || parent is ClassTypeAlias) {
+      reportErrorForNode(
+          CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE, typeName);
+    } else if (parent is ImplementsClause) {
+      reportErrorForNode(
+          CompileTimeErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE, typeName);
+    } else if (parent is OnClause) {
+      reportErrorForNode(
+          CompileTimeErrorCode.NULLABLE_TYPE_IN_ON_CLAUSE, typeName);
+    } else if (parent is WithClause) {
+      reportErrorForNode(
+          CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE, typeName);
+    }
+  }
+
   void _resolveClassElement(TypeName node, Identifier typeName,
       TypeArgumentList argumentList, ClassElement element) {
     _setElement(typeName, element);
@@ -6832,19 +6851,22 @@
 
     var parent = node.parent;
 
-    Nullability nullability;
+    NullabilitySuffix nullabilitySuffix;
     if (parent is ClassTypeAlias ||
         parent is ExtendsClause ||
         parent is ImplementsClause ||
         parent is OnClause ||
         parent is WithClause) {
-      nullability = Nullability.nonNullable;
+      if (node.question != null) {
+        _reportInvalidNullableType(node);
+      }
+      nullabilitySuffix = NullabilitySuffix.none;
     } else {
-      nullability = _getNullability(node.question != null);
+      nullabilitySuffix = _getNullability(node.question != null);
     }
 
     var type = InterfaceTypeImpl.explicit(element, typeArguments,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
 
     if (shouldUseWithClauseInferredTypes) {
       if (parent is WithClause && parameterCount != 0) {
@@ -7170,6 +7192,9 @@
   /// Return the type representing the built-in type 'Map'.
   InterfaceType get mapType;
 
+  /// Return the type representing the built-in type 'Never'.
+  InterfaceType get neverType;
+
   /// Return a list containing all of the types that cannot be either extended
   /// or implemented.
   List<InterfaceType> get nonSubtypableTypes;
@@ -7315,8 +7340,8 @@
   /// An shared object representing the value 'null'.
   DartObjectImpl _nullObject;
 
-  /// The type representing the type 'Set'.
-  InterfaceType _setType;
+  /// The type representing the type 'Never'.
+  InterfaceType _neverType;
 
   /// The type representing the type 'Null'.
   InterfaceType _nullType;
@@ -7327,6 +7352,9 @@
   /// The type representing the built-in type 'Object'.
   InterfaceType _objectType;
 
+  /// The type representing the type 'Set'.
+  InterfaceType _setType;
+
   /// The type representing the built-in type 'StackTrace'.
   InterfaceType _stackTraceType;
 
@@ -7351,18 +7379,7 @@
   /// Initialize a newly created type provider to provide the types defined in
   /// the given [coreLibrary] and [asyncLibrary].
   TypeProviderImpl(LibraryElement coreLibrary, LibraryElement asyncLibrary) {
-    Namespace coreNamespace =
-        new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary);
-    Namespace asyncNamespace =
-        new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary);
-    _initializeFrom(coreNamespace, asyncNamespace);
-  }
-
-  /// Initialize a newly created type provider to provide the types defined in
-  /// the given [Namespace]s.
-  TypeProviderImpl.forNamespaces(
-      Namespace coreNamespace, Namespace asyncNamespace) {
-    _initializeFrom(coreNamespace, asyncNamespace);
+    _initializeFrom(coreLibrary, asyncLibrary);
   }
 
   @override
@@ -7420,6 +7437,9 @@
   InterfaceType get mapType => _mapType;
 
   @override
+  InterfaceType get neverType => _neverType;
+
+  @override
   DartObjectImpl get nullObject {
     if (_nullObject == null) {
       _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
@@ -7460,12 +7480,18 @@
   @override
   DartType get undefinedType => _undefinedType;
 
-  /// Return the type with the given name from the given namespace, or `null` if
-  /// there is no class with the given name.
-  ///
-  /// @param namespace the namespace in which to search for the given name
-  /// @param typeName the name of the type being searched for
-  /// @return the type that was found
+  InterfaceType _createNever(Namespace namespace) {
+    // TODO(brianwilkerson) Remove this method when the class is defined in the
+    //  SDK.
+    CompilationUnitElement compilationUnit =
+        boolType.element.getAncestor((e) => e is CompilationUnitElement);
+    ClassElementImpl element = ElementFactory.classElement('Never', objectType);
+    element.enclosingElement = compilationUnit;
+    return element.type;
+  }
+
+  /// Return the type with the given [typeName] from the given [namespace], or
+  /// `null` if there is no class with the given name.
   InterfaceType _getType(Namespace namespace, String typeName) {
     Element element = namespace.get(typeName);
     if (element == null) {
@@ -7478,28 +7504,36 @@
 
   /// Initialize the types provided by this type provider from the given
   /// [Namespace]s.
-  void _initializeFrom(Namespace coreNamespace, Namespace asyncNamespace) {
-    _boolType = _getType(coreNamespace, "bool");
+  void _initializeFrom(
+      LibraryElement coreLibrary, LibraryElement asyncLibrary) {
+    Namespace coreNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary);
+    Namespace asyncNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary);
+
+    _boolType = _getType(coreNamespace, 'bool');
     _bottomType = BottomTypeImpl.instance;
-    _deprecatedType = _getType(coreNamespace, "Deprecated");
-    _doubleType = _getType(coreNamespace, "double");
+    _deprecatedType = _getType(coreNamespace, 'Deprecated');
+    _doubleType = _getType(coreNamespace, 'double');
     _dynamicType = DynamicTypeImpl.instance;
-    _functionType = _getType(coreNamespace, "Function");
-    _futureOrType = _getType(asyncNamespace, "FutureOr");
-    _futureType = _getType(asyncNamespace, "Future");
-    _intType = _getType(coreNamespace, "int");
-    _iterableType = _getType(coreNamespace, "Iterable");
-    _listType = _getType(coreNamespace, "List");
-    _mapType = _getType(coreNamespace, "Map");
-    _nullType = _getType(coreNamespace, "Null");
-    _numType = _getType(coreNamespace, "num");
-    _objectType = _getType(coreNamespace, "Object");
-    _setType = _getType(coreNamespace, "Set");
-    _stackTraceType = _getType(coreNamespace, "StackTrace");
-    _streamType = _getType(asyncNamespace, "Stream");
-    _stringType = _getType(coreNamespace, "String");
-    _symbolType = _getType(coreNamespace, "Symbol");
-    _typeType = _getType(coreNamespace, "Type");
+    _functionType = _getType(coreNamespace, 'Function');
+    _futureOrType = _getType(asyncNamespace, 'FutureOr');
+    _futureType = _getType(asyncNamespace, 'Future');
+    _intType = _getType(coreNamespace, 'int');
+    _iterableType = _getType(coreNamespace, 'Iterable');
+    _listType = _getType(coreNamespace, 'List');
+    _mapType = _getType(coreNamespace, 'Map');
+    _neverType =
+        _getType(coreNamespace, 'Never') ?? _createNever(coreNamespace);
+    _nullType = _getType(coreNamespace, 'Null');
+    _numType = _getType(coreNamespace, 'num');
+    _objectType = _getType(coreNamespace, 'Object');
+    _setType = _getType(coreNamespace, 'Set');
+    _stackTraceType = _getType(coreNamespace, 'StackTrace');
+    _streamType = _getType(asyncNamespace, 'Stream');
+    _stringType = _getType(coreNamespace, 'String');
+    _symbolType = _getType(coreNamespace, 'Symbol');
+    _typeType = _getType(coreNamespace, 'Type');
     _undefinedType = UndefinedTypeImpl.instance;
     _futureDynamicType = _futureType.instantiate(<DartType>[_dynamicType]);
     _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
@@ -7519,6 +7553,8 @@
   /// we can analyze older SDKs.
   static InterfaceType createPlaceholderFutureOr(
       InterfaceType futureType, InterfaceType objectType) {
+    // TODO(brianwilkerson) Remove this method now that the class has been
+    //  defined.
     var compilationUnit =
         futureType.element.getAncestor((e) => e is CompilationUnitElement);
     var element = ElementFactory.classElement('FutureOr', objectType, ['T']);
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 682b4f3..285df36 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -726,13 +726,19 @@
   @override
   void visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
-    DartType staticType = _getStaticType(operand, read: true);
+    TypeImpl staticType = _getStaticType(operand, read: true);
 
-    // No need to check for `intVar++`, the result is `int`.
-    if (!staticType.isDartCoreInt) {
-      var operatorElement = node.staticElement;
-      var operatorReturnType = _computeStaticReturnType(operatorElement);
-      _checkForInvalidAssignmentIncDec(node, operand, operatorReturnType);
+    if (node.operator.type == TokenType.BANG) {
+      // TODO(paulberry): This does the wrong thing if staticType is a type
+      // parameter type.
+      staticType = staticType.withNullability(NullabilitySuffix.none);
+    } else {
+      // No need to check for `intVar++`, the result is `int`.
+      if (!staticType.isDartCoreInt) {
+        var operatorElement = node.staticElement;
+        var operatorReturnType = _computeStaticReturnType(operatorElement);
+        _checkForInvalidAssignmentIncDec(node, operand, operatorReturnType);
+      }
     }
 
     _recordStaticType(node, staticType);
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 30b176b..bb052ad 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -119,6 +119,11 @@
   InterfaceType _mapObjectObjectType;
 
   /**
+   * The type representing the built-in type 'Never'.
+   */
+  InterfaceType _neverType;
+
+  /**
    * An shared object representing the value 'null'.
    */
   DartObjectImpl _nullObject;
@@ -442,6 +447,16 @@
   }
 
   @override
+  InterfaceType get neverType {
+    if (_neverType == null) {
+      ClassElementImpl neverElement =
+          ElementFactory.classElement('Never', objectType);
+      _neverType = neverElement.type;
+    }
+    return _neverType;
+  }
+
+  @override
   DartObjectImpl get nullObject {
     if (_nullObject == null) {
       _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
@@ -607,11 +622,13 @@
 
   void _initDartAsync() {
     Source asyncSource;
-    if (_driver == null) {
+    if (_driver != null) {
+      asyncSource = _driver.sourceFactory.forUri(DartSdk.DART_ASYNC);
+    } else if (_context != null) {
       asyncSource = _context.sourceFactory.forUri(DartSdk.DART_ASYNC);
       _context.setContents(asyncSource, "");
     } else {
-      asyncSource = _driver.sourceFactory.forUri(DartSdk.DART_ASYNC);
+      asyncSource = null;
     }
     CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index ec1a06f..b2fa6c8 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -958,7 +958,7 @@
           type.typeArguments, (t) => _substituteType(t, lowerBound, visitType));
       if (identical(type.typeArguments, newTypeArgs)) return type;
       return new InterfaceTypeImpl(
-          type.element, type.prunedTypedefs, type.nullability)
+          type.element, type.prunedTypedefs, type.nullabilitySuffix)
         ..typeArguments = newTypeArgs;
     }
     if (type is FunctionType) {
@@ -982,7 +982,7 @@
 
       return new FunctionTypeImpl.synthetic(
           newReturnType, type.typeFormals, newParameters,
-          nullability: (type as TypeImpl).nullability);
+          nullabilitySuffix: (type as TypeImpl).nullabilitySuffix);
     }
     return type;
   }
@@ -1229,8 +1229,8 @@
             ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
           typeParam,
           ' Inferred candidate type $inferred has type parameters'
-          ' ${(inferred as FunctionType).typeFormals}, but a function with'
-          ' type parameters cannot be used as a type argument.'
+              ' ${(inferred as FunctionType).typeFormals}, but a function with'
+              ' type parameters cannot be used as a type argument.'
         ]);
 
         // Heuristic: Using a generic function type as a bound makes subtyping
@@ -1261,8 +1261,8 @@
             ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
           typeParam,
           "\nRecursive bound cannot be instantiated: '$typeParamBound'."
-          "\nConsider passing explicit type argument(s) "
-          "to the generic.\n\n'"
+              "\nConsider passing explicit type argument(s) "
+              "to the generic.\n\n'"
         ]);
       }
     }
@@ -1922,6 +1922,27 @@
    */
   bool isMoreSpecificThan(DartType leftType, DartType rightType);
 
+  @override
+  bool isNonNullable(DartType type) {
+    if (type.isDynamic || type.isVoid || type.isDartCoreNull) {
+      return false;
+    } else if (type.isDartAsyncFutureOr) {
+      isNonNullable((type as InterfaceType).typeArguments[0]);
+    }
+    return (type as TypeImpl).nullabilitySuffix != NullabilitySuffix.question &&
+        (type is TypeParameterType ? isNonNullable(type.bound) : true);
+  }
+
+  @override
+  bool isNullable(DartType type) {
+    if (type.isDynamic || type.isVoid || type.isDartCoreNull) {
+      return true;
+    } else if (type.isDartAsyncFutureOr) {
+      isNullable((type as InterfaceType).typeArguments[0]);
+    }
+    return (type as TypeImpl).nullabilitySuffix != NullabilitySuffix.none;
+  }
+
   /// Check that [f1] is a subtype of [f2] for a member override.
   ///
   /// This is different from the normal function subtyping in two ways:
@@ -1929,6 +1950,12 @@
   /// - it allows opt-in covariant parameters.
   bool isOverrideSubtypeOf(FunctionType f1, FunctionType f2);
 
+  @override
+  bool isPotentiallyNonNullable(DartType type) => !isNullable(type);
+
+  @override
+  bool isPotentiallyNullable(DartType type) => !isNonNullable(type);
+
   /**
    * Return `true` if the [leftType] is a subtype of the [rightType] (that is,
    * if leftType <: rightType).
@@ -2231,7 +2258,7 @@
   bool get isDynamic => true;
 
   @override
-  Nullability get nullability => Nullability.indeterminate;
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.star;
 
   @override
   bool operator ==(Object object) => identical(object, this);
@@ -2293,7 +2320,7 @@
   }
 
   @override
-  TypeImpl withNullability(Nullability nullability) => this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) => this;
 
   /// Given a [type] T, return true if it does not have an unknown type `?`.
   static bool isKnown(DartType type) => !isUnknown(type);
diff --git a/pkg/analyzer/lib/src/manifest/manifest_validator.dart b/pkg/analyzer/lib/src/manifest/manifest_validator.dart
index f18f9bd..c83e616 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_validator.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_validator.dart
@@ -40,9 +40,11 @@
       var features = manifest?.getElementsByTagName(USES_FEATURE_TAG) ?? [];
       var permissions =
           manifest?.getElementsByTagName(USES_PERMISSION_TAG) ?? [];
+      var activities = _findActivityElements(manifest);
 
       _validateFeatures(features, reporter);
       _validatePermissions(permissions, features, reporter);
+      _validateActivities(activities, reporter);
     }
     return recorder.errors;
   }
@@ -93,6 +95,39 @@
     });
   }
 
+  /*
+   * Validate the 'activity' tags.
+   */
+  _validateActivities(List<Element> activites, ErrorReporter reporter) {
+    activites.forEach((activity) {
+      var attributes = activity.attributes;
+      if (attributes.containsKey(ATTRIBUTE_SCREEN_ORIENTATION)) {
+        var value = attributes[ATTRIBUTE_SCREEN_ORIENTATION];
+        if (UNSUPPORTED_ORIENTATIONS
+            .contains(attributes[ATTRIBUTE_SCREEN_ORIENTATION])) {
+          _reportErrorForNode(reporter, activity, ATTRIBUTE_SCREEN_ORIENTATION,
+              ManifestWarningCode.SETTING_ORIENTATION_ON_ACTIVITY);
+        }
+      }
+      if (attributes.containsKey(ATTRIBUTE_RESIZEABLE_ACTIVITY)) {
+        if (attributes[ATTRIBUTE_RESIZEABLE_ACTIVITY] == 'false') {
+          _reportErrorForNode(reporter, activity, ATTRIBUTE_RESIZEABLE_ACTIVITY,
+              ManifestWarningCode.NON_RESIZABLE_ACTIVITY);
+        }
+      }
+    });
+  }
+
+  List<Element> _findActivityElements(Element manifest) {
+    var applications = manifest?.getElementsByTagName(APPLICATION_TAG);
+    var applicationElement = (applications != null && applications.isNotEmpty)
+        ? applications.first
+        : null;
+    var activities =
+        applicationElement?.getElementsByTagName(ACTIVITY_TAG) ?? [];
+    return activities;
+  }
+
   bool _hasFeatureCamera(List<Element> features) =>
       features.any((f) => f.localName == HARDWARE_FEATURE_CAMERA);
 
diff --git a/pkg/analyzer/lib/src/manifest/manifest_values.dart b/pkg/analyzer/lib/src/manifest/manifest_values.dart
index ea1b59d..db96a93 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_values.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_values.dart
@@ -5,7 +5,7 @@
 /*
 *  The arritbute values to check for compatibiltiy with Chrome OS.
 *
- */
+*/
 
 const String MANIFEST_TAG = 'manifest';
 
@@ -13,10 +13,21 @@
 
 const String USES_FEATURE_TAG = 'uses-feature';
 
+const String APPLICATION_TAG = 'application';
+
+const String ACTIVITY_TAG = 'activity';
+
 const String ANDROID_NAME = 'android:name';
 
 const String ANDROID_REQUIRED = 'android:required';
 
+// The parser does not maintain camelcase for attributes
+// Use 'resizeableactivity' instead of 'resizeableActivity'
+const String ATTRIBUTE_RESIZEABLE_ACTIVITY = 'android:resizeableactivity';
+
+// Use 'screenorientation' instead of 'screenOrientation'
+const String ATTRIBUTE_SCREEN_ORIENTATION = 'android:screenorientation';
+
 const String HARDWARE_FEATURE_CAMERA = 'android.hardware.camera';
 
 const String HARDWARE_FEATURE_CAMERA_AUTOFOCUS =
@@ -99,3 +110,14 @@
       return null;
   }
 }
+
+const UNSUPPORTED_ORIENTATIONS = <String>[
+  'landscape',
+  'portrait',
+  'reverseLandscape',
+  'reversePortrait',
+  'sensorLandscape',
+  'sensorPortrait',
+  'userLandscape',
+  'userPortrait'
+];
diff --git a/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart b/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart
index 0e0928c..8cd566c 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_warning_code.dart
@@ -46,6 +46,29 @@
               "Try adding the uses-feature with required=\"false\" attribute value.");
 
   /**
+   * A code indicating that the activity is set to be non resizable.
+   */
+  static const ManifestWarningCode NON_RESIZABLE_ACTIVITY =
+      const ManifestWarningCode(
+          'NON_RESIZABLE_ACTIVITY',
+          "The `<activity>` element should be allowed to be resized to allow " +
+              "users to take advantage of the multi-window environment on Chrome OS",
+          correction: "Consider declaring the corresponding " +
+              "activity element with `resizableActivity=\"true\"` attribute.");
+
+  /**
+   * A code indicating that the activity is locked to an orientation.
+   */
+  static const ManifestWarningCode SETTING_ORIENTATION_ON_ACTIVITY =
+      const ManifestWarningCode(
+          'SETTING_ORIENTATION_ON_ACTIVITY',
+          "The `<activity>` element should not be locked to any orientation so " +
+              "that users can take advantage of the multi-window environments " +
+              "and larger screens on Chrome OS",
+          correction: "Consider declaring the corresponding activity element with" +
+              " `screenOrientation=\"unspecified\"` or `\"fullSensor\"` attribute.");
+
+  /**
    * Initialize a newly created warning code to have the given [name], [message]
    * and [correction].
    */
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 8337641..431ccb0 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -1242,6 +1242,7 @@
               parent: classDeclaration,
               requiredParameterCount:
                   _getFormalParameterRequiredCount(parameters),
+              returnType: node.name.name,
             );
             hasConstructor = true;
           }
@@ -1270,7 +1271,7 @@
             parent: classDeclaration,
             relevanceTags: null,
             requiredParameterCount: 0,
-            returnType: null,
+            returnType: node.name.name,
             typeParameters: null,
           ));
         }
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index fd78d94..7b27b6c 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -4658,6 +4658,7 @@
   int _variantField_17;
   int _variantField_18;
   int _variantField_19;
+  LinkedNodeTypeBuilder _variantField_23;
   bool _variantField_27;
   LinkedNodeBuilder _variantField_9;
   LinkedNodeBuilder _variantField_12;
@@ -4676,9 +4677,8 @@
   LinkedNodeBuilder _variantField_14;
   bool _isSynthetic;
   idl.LinkedNodeKind _kind;
-  String _variantField_23;
-  bool _variantField_31;
   String _variantField_20;
+  bool _variantField_31;
   String _variantField_22;
   LinkedNodeVariablesDeclarationBuilder _variantField_32;
 
@@ -4714,12 +4714,6 @@
     return _variantField_24;
   }
 
-  @override
-  LinkedNodeTypeBuilder get typeName_type {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    return _variantField_24;
-  }
-
   /// The explicit or inferred return type of a function typed node.
   set actualReturnType(LinkedNodeTypeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionDeclaration ||
@@ -4749,11 +4743,6 @@
     _variantField_24 = value;
   }
 
-  set typeName_type(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    _variantField_24 = value;
-  }
-
   @override
   List<LinkedNodeBuilder> get adjacentStrings_strings {
     assert(kind == idl.LinkedNodeKind.adjacentStrings);
@@ -8175,6 +8164,12 @@
   }
 
   @override
+  int get typeParameter_id {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
   int get typeParameterList_rightBracket {
     assert(kind == idl.LinkedNodeKind.typeParameterList);
     return _variantField_16 ??= 0;
@@ -8508,6 +8503,12 @@
     _variantField_16 = value;
   }
 
+  set typeParameter_id(int value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
   set typeParameterList_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.typeParameterList);
     assert(value == null || value >= 0);
@@ -9143,6 +9144,117 @@
   }
 
   @override
+  LinkedNodeTypeBuilder get assignmentExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get binaryExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get constructorName_elementType {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get indexExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get postfixExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get prefixExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get redirectingConstructorInvocation_elementType {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get simpleIdentifier_elementType {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get superConstructorInvocation_elementType {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get typeName_type {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    return _variantField_23;
+  }
+
+  set assignmentExpression_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_23 = value;
+  }
+
+  set binaryExpression_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_23 = value;
+  }
+
+  set constructorName_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_23 = value;
+  }
+
+  set indexExpression_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_23 = value;
+  }
+
+  set postfixExpression_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_23 = value;
+  }
+
+  set prefixExpression_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_23 = value;
+  }
+
+  set redirectingConstructorInvocation_elementType(
+      LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_23 = value;
+  }
+
+  set simpleIdentifier_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_23 = value;
+  }
+
+  set superConstructorInvocation_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_23 = value;
+  }
+
+  set typeName_type(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_23 = value;
+  }
+
+  @override
   bool get booleanLiteral_value {
     assert(kind == idl.LinkedNodeKind.booleanLiteral);
     return _variantField_27 ??= false;
@@ -9745,20 +9857,27 @@
   }
 
   @override
-  String get namespaceDirective_selectedUriContent {
+  String get namespaceDirective_selectedUri {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    return _variantField_23 ??= '';
+        kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_20 ??= '';
   }
 
-  set namespaceDirective_selectedUriContent(String value) {
+  @override
+  String get simpleStringLiteral_value {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    return _variantField_20 ??= '';
+  }
+
+  set namespaceDirective_selectedUri(String value) {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    _variantField_23 = value;
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_20 = value;
+  }
+
+  set simpleStringLiteral_value(String value) {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_20 = value;
   }
 
   @override
@@ -9792,17 +9911,6 @@
   }
 
   @override
-  String get simpleStringLiteral_value {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    return _variantField_20 ??= '';
-  }
-
-  set simpleStringLiteral_value(String value) {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    _variantField_20 = value;
-  }
-
-  @override
   String get uriBasedDirective_uriContent {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective ||
@@ -10052,6 +10160,7 @@
     int binaryExpression_element,
     LinkedNodeBuilder binaryExpression_rightOperand,
     int binaryExpression_operator,
+    LinkedNodeTypeBuilder binaryExpression_elementType,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.binaryExpression,
         _variantField_24 = binaryExpression_invokeType,
@@ -10059,6 +10168,7 @@
         _variantField_15 = binaryExpression_element,
         _variantField_7 = binaryExpression_rightOperand,
         _variantField_16 = binaryExpression_operator,
+        _variantField_23 = binaryExpression_elementType,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.functionExpressionInvocation({
@@ -10091,17 +10201,6 @@
         _variantField_25 = expression_type,
         _variantField_14 = invocationExpression_arguments;
 
-  LinkedNodeBuilder.typeName({
-    LinkedNodeTypeBuilder typeName_type,
-    LinkedNodeBuilder typeName_name,
-    int typeName_question,
-    LinkedNodeBuilder typeName_typeArguments,
-  })  : _kind = idl.LinkedNodeKind.typeName,
-        _variantField_24 = typeName_type,
-        _variantField_6 = typeName_name,
-        _variantField_15 = typeName_question,
-        _variantField_7 = typeName_typeArguments;
-
   LinkedNodeBuilder.adjacentStrings({
     List<LinkedNodeBuilder> adjacentStrings_strings,
     LinkedNodeTypeBuilder expression_type,
@@ -10271,7 +10370,7 @@
     int directive_semicolon,
     List<LinkedNodeBuilder> namespaceDirective_configurations,
     LinkedNodeBuilder uriBasedDirective_uri,
-    String namespaceDirective_selectedUriContent,
+    String namespaceDirective_selectedUri,
     String uriBasedDirective_uriContent,
   })  : _kind = idl.LinkedNodeKind.exportDirective,
         _variantField_2 = namespaceDirective_combinators,
@@ -10282,7 +10381,7 @@
         _variantField_33 = directive_semicolon,
         _variantField_3 = namespaceDirective_configurations,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_23 = namespaceDirective_selectedUriContent,
+        _variantField_20 = namespaceDirective_selectedUri,
         _variantField_22 = uriBasedDirective_uriContent;
 
   LinkedNodeBuilder.importDirective({
@@ -10297,7 +10396,7 @@
     int directive_semicolon,
     List<LinkedNodeBuilder> namespaceDirective_configurations,
     LinkedNodeBuilder uriBasedDirective_uri,
-    String namespaceDirective_selectedUriContent,
+    String namespaceDirective_selectedUri,
     String uriBasedDirective_uriContent,
   })  : _kind = idl.LinkedNodeKind.importDirective,
         _variantField_2 = namespaceDirective_combinators,
@@ -10311,7 +10410,7 @@
         _variantField_33 = directive_semicolon,
         _variantField_3 = namespaceDirective_configurations,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_23 = namespaceDirective_selectedUriContent,
+        _variantField_20 = namespaceDirective_selectedUri,
         _variantField_22 = uriBasedDirective_uriContent;
 
   LinkedNodeBuilder.onClause({
@@ -10601,7 +10700,6 @@
     int uriBasedDirective_uriElement,
     int directive_semicolon,
     LinkedNodeBuilder uriBasedDirective_uri,
-    String namespaceDirective_selectedUriContent,
     String uriBasedDirective_uriContent,
   })  : _kind = idl.LinkedNodeKind.partDirective,
         _variantField_11 = annotatedNode_comment,
@@ -10610,7 +10708,6 @@
         _variantField_19 = uriBasedDirective_uriElement,
         _variantField_33 = directive_semicolon,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_23 = namespaceDirective_selectedUriContent,
         _variantField_22 = uriBasedDirective_uriContent;
 
   LinkedNodeBuilder.partOfDirective({
@@ -10621,7 +10718,6 @@
     int partOfDirective_ofKeyword,
     int directive_keyword,
     int directive_semicolon,
-    String namespaceDirective_selectedUriContent,
   })  : _kind = idl.LinkedNodeKind.partOfDirective,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
@@ -10629,8 +10725,7 @@
         _variantField_7 = partOfDirective_uri,
         _variantField_16 = partOfDirective_ofKeyword,
         _variantField_18 = directive_keyword,
-        _variantField_33 = directive_semicolon,
-        _variantField_23 = namespaceDirective_selectedUriContent;
+        _variantField_33 = directive_semicolon;
 
   LinkedNodeBuilder.topLevelVariableDeclaration({
     LinkedNodeBuilder annotatedNode_comment,
@@ -10649,6 +10744,7 @@
     LinkedNodeBuilder typeParameter_bound,
     int typeParameter_extendsKeyword,
     LinkedNodeBuilder typeParameter_name,
+    int typeParameter_id,
     int codeLength,
     int codeOffset,
   })  : _kind = idl.LinkedNodeKind.typeParameter,
@@ -10657,6 +10753,7 @@
         _variantField_6 = typeParameter_bound,
         _variantField_15 = typeParameter_extendsKeyword,
         _variantField_7 = typeParameter_name,
+        _variantField_16 = typeParameter_id,
         _variantField_34 = codeLength,
         _variantField_33 = codeOffset;
 
@@ -10745,12 +10842,14 @@
     int assignmentExpression_element,
     LinkedNodeBuilder assignmentExpression_rightHandSide,
     int assignmentExpression_operator,
+    LinkedNodeTypeBuilder assignmentExpression_elementType,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.assignmentExpression,
         _variantField_6 = assignmentExpression_leftHandSide,
         _variantField_15 = assignmentExpression_element,
         _variantField_7 = assignmentExpression_rightHandSide,
         _variantField_16 = assignmentExpression_operator,
+        _variantField_23 = assignmentExpression_elementType,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.awaitExpression({
@@ -10851,11 +10950,13 @@
     int constructorName_element,
     LinkedNodeBuilder constructorName_type,
     int constructorName_period,
+    LinkedNodeTypeBuilder constructorName_elementType,
   })  : _kind = idl.LinkedNodeKind.constructorName,
         _variantField_6 = constructorName_name,
         _variantField_15 = constructorName_element,
         _variantField_7 = constructorName_type,
-        _variantField_16 = constructorName_period;
+        _variantField_16 = constructorName_period,
+        _variantField_23 = constructorName_elementType;
 
   LinkedNodeBuilder.continueStatement({
     LinkedNodeBuilder continueStatement_label,
@@ -11043,6 +11144,7 @@
     int indexExpression_period,
     int indexExpression_leftBracket,
     int indexExpression_rightBracket,
+    LinkedNodeTypeBuilder indexExpression_elementType,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.indexExpression,
         _variantField_6 = indexExpression_index,
@@ -11051,6 +11153,7 @@
         _variantField_16 = indexExpression_period,
         _variantField_17 = indexExpression_leftBracket,
         _variantField_18 = indexExpression_rightBracket,
+        _variantField_23 = indexExpression_elementType,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.instanceCreationExpression({
@@ -11144,11 +11247,13 @@
     LinkedNodeBuilder postfixExpression_operand,
     int postfixExpression_element,
     int postfixExpression_operator,
+    LinkedNodeTypeBuilder postfixExpression_elementType,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.postfixExpression,
         _variantField_6 = postfixExpression_operand,
         _variantField_15 = postfixExpression_element,
         _variantField_16 = postfixExpression_operator,
+        _variantField_23 = postfixExpression_elementType,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.prefixedIdentifier({
@@ -11166,11 +11271,13 @@
     LinkedNodeBuilder prefixExpression_operand,
     int prefixExpression_element,
     int prefixExpression_operator,
+    LinkedNodeTypeBuilder prefixExpression_elementType,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.prefixExpression,
         _variantField_6 = prefixExpression_operand,
         _variantField_15 = prefixExpression_element,
         _variantField_16 = prefixExpression_operator,
+        _variantField_23 = prefixExpression_elementType,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.propertyAccess({
@@ -11190,12 +11297,14 @@
     LinkedNodeBuilder redirectingConstructorInvocation_constructorName,
     int redirectingConstructorInvocation_period,
     int redirectingConstructorInvocation_thisKeyword,
+    LinkedNodeTypeBuilder redirectingConstructorInvocation_elementType,
   })  : _kind = idl.LinkedNodeKind.redirectingConstructorInvocation,
         _variantField_6 = redirectingConstructorInvocation_arguments,
         _variantField_15 = redirectingConstructorInvocation_element,
         _variantField_7 = redirectingConstructorInvocation_constructorName,
         _variantField_16 = redirectingConstructorInvocation_period,
-        _variantField_17 = redirectingConstructorInvocation_thisKeyword;
+        _variantField_17 = redirectingConstructorInvocation_thisKeyword,
+        _variantField_23 = redirectingConstructorInvocation_elementType;
 
   LinkedNodeBuilder.returnStatement({
     LinkedNodeBuilder returnStatement_expression,
@@ -11219,12 +11328,14 @@
     LinkedNodeBuilder superConstructorInvocation_constructorName,
     int superConstructorInvocation_period,
     int superConstructorInvocation_superKeyword,
+    LinkedNodeTypeBuilder superConstructorInvocation_elementType,
   })  : _kind = idl.LinkedNodeKind.superConstructorInvocation,
         _variantField_6 = superConstructorInvocation_arguments,
         _variantField_15 = superConstructorInvocation_element,
         _variantField_7 = superConstructorInvocation_constructorName,
         _variantField_16 = superConstructorInvocation_period,
-        _variantField_17 = superConstructorInvocation_superKeyword;
+        _variantField_17 = superConstructorInvocation_superKeyword,
+        _variantField_23 = superConstructorInvocation_elementType;
 
   LinkedNodeBuilder.throwExpression({
     LinkedNodeBuilder throwExpression_expression,
@@ -11235,6 +11346,17 @@
         _variantField_15 = throwExpression_throwKeyword,
         _variantField_25 = expression_type;
 
+  LinkedNodeBuilder.typeName({
+    LinkedNodeBuilder typeName_name,
+    int typeName_question,
+    LinkedNodeBuilder typeName_typeArguments,
+    LinkedNodeTypeBuilder typeName_type,
+  })  : _kind = idl.LinkedNodeKind.typeName,
+        _variantField_6 = typeName_name,
+        _variantField_15 = typeName_question,
+        _variantField_7 = typeName_typeArguments,
+        _variantField_23 = typeName_type;
+
   LinkedNodeBuilder.variableDeclarationStatement({
     LinkedNodeBuilder variableDeclarationStatement_variables,
     int variableDeclarationStatement_semicolon,
@@ -11332,10 +11454,12 @@
   LinkedNodeBuilder.simpleIdentifier({
     int simpleIdentifier_element,
     int simpleIdentifier_token,
+    LinkedNodeTypeBuilder simpleIdentifier_elementType,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.simpleIdentifier,
         _variantField_15 = simpleIdentifier_element,
         _variantField_16 = simpleIdentifier_token,
+        _variantField_23 = simpleIdentifier_elementType,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.simpleStringLiteral({
@@ -11386,6 +11510,7 @@
     _variantField_6?.flushInformative();
     _variantField_7?.flushInformative();
     _variantField_8?.flushInformative();
+    _variantField_23?.flushInformative();
     _variantField_9?.flushInformative();
     _variantField_12?.flushInformative();
     _variantField_5?.forEach((b) => b.flushInformative());
@@ -11459,7 +11584,8 @@
     signature.addString(this._variantField_20 ?? '');
     signature.addDouble(this._variantField_21 ?? 0.0);
     signature.addString(this._variantField_22 ?? '');
-    signature.addString(this._variantField_23 ?? '');
+    signature.addBool(this._variantField_23 != null);
+    this._variantField_23?.collectApiSignature(signature);
     signature.addBool(this._variantField_24 != null);
     this._variantField_24?.collectApiSignature(signature);
     signature.addBool(this._variantField_25 != null);
@@ -11493,6 +11619,7 @@
     fb.Offset offset_variantField_6;
     fb.Offset offset_variantField_7;
     fb.Offset offset_variantField_8;
+    fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_9;
     fb.Offset offset_variantField_12;
     fb.Offset offset_variantField_5;
@@ -11503,7 +11630,6 @@
     fb.Offset offset_variantField_25;
     fb.Offset offset_variantField_30;
     fb.Offset offset_variantField_14;
-    fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_20;
     fb.Offset offset_variantField_22;
     fb.Offset offset_variantField_32;
@@ -11530,6 +11656,9 @@
     if (_variantField_8 != null) {
       offset_variantField_8 = _variantField_8.finish(fbBuilder);
     }
+    if (_variantField_23 != null) {
+      offset_variantField_23 = _variantField_23.finish(fbBuilder);
+    }
     if (_variantField_9 != null) {
       offset_variantField_9 = _variantField_9.finish(fbBuilder);
     }
@@ -11562,9 +11691,6 @@
     if (_variantField_14 != null) {
       offset_variantField_14 = _variantField_14.finish(fbBuilder);
     }
-    if (_variantField_23 != null) {
-      offset_variantField_23 = fbBuilder.writeString(_variantField_23);
-    }
     if (_variantField_20 != null) {
       offset_variantField_20 = fbBuilder.writeString(_variantField_20);
     }
@@ -11611,6 +11737,9 @@
     if (_variantField_19 != null && _variantField_19 != 0) {
       fbBuilder.addUint32(19, _variantField_19);
     }
+    if (offset_variantField_23 != null) {
+      fbBuilder.addOffset(23, offset_variantField_23);
+    }
     if (_variantField_27 == true) {
       fbBuilder.addBool(27, true);
     }
@@ -11667,15 +11796,12 @@
     if (_kind != null && _kind != idl.LinkedNodeKind.adjacentStrings) {
       fbBuilder.addUint8(0, _kind.index);
     }
-    if (offset_variantField_23 != null) {
-      fbBuilder.addOffset(23, offset_variantField_23);
+    if (offset_variantField_20 != null) {
+      fbBuilder.addOffset(20, offset_variantField_20);
     }
     if (_variantField_31 == true) {
       fbBuilder.addBool(31, true);
     }
-    if (offset_variantField_20 != null) {
-      fbBuilder.addOffset(20, offset_variantField_20);
-    }
     if (offset_variantField_22 != null) {
       fbBuilder.addOffset(22, offset_variantField_22);
     }
@@ -11714,6 +11840,7 @@
   int _variantField_17;
   int _variantField_18;
   int _variantField_19;
+  idl.LinkedNodeType _variantField_23;
   bool _variantField_27;
   idl.LinkedNode _variantField_9;
   idl.LinkedNode _variantField_12;
@@ -11732,9 +11859,8 @@
   idl.LinkedNode _variantField_14;
   bool _isSynthetic;
   idl.LinkedNodeKind _kind;
-  String _variantField_23;
-  bool _variantField_31;
   String _variantField_20;
+  bool _variantField_31;
   String _variantField_22;
   idl.LinkedNodeVariablesDeclaration _variantField_32;
 
@@ -11779,14 +11905,6 @@
   }
 
   @override
-  idl.LinkedNodeType get typeName_type {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
   List<idl.LinkedNode> get adjacentStrings_strings {
     assert(kind == idl.LinkedNodeKind.adjacentStrings);
     _variantField_2 ??=
@@ -14400,6 +14518,14 @@
   }
 
   @override
+  int get typeParameter_id {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
   int get typeParameterList_rightBracket {
     assert(kind == idl.LinkedNodeKind.typeParameterList);
     _variantField_16 ??=
@@ -14828,6 +14954,86 @@
   }
 
   @override
+  idl.LinkedNodeType get assignmentExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get binaryExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get constructorName_elementType {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get indexExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get postfixExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get prefixExpression_elementType {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get redirectingConstructorInvocation_elementType {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get simpleIdentifier_elementType {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get superConstructorInvocation_elementType {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get typeName_type {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
   bool get booleanLiteral_value {
     assert(kind == idl.LinkedNodeKind.booleanLiteral);
     _variantField_27 ??=
@@ -15230,14 +15436,20 @@
   }
 
   @override
-  String get namespaceDirective_selectedUriContent {
+  String get namespaceDirective_selectedUri {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    _variantField_23 ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 23, '');
-    return _variantField_23;
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_20 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    return _variantField_20;
+  }
+
+  @override
+  String get simpleStringLiteral_value {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_20 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    return _variantField_20;
   }
 
   @override
@@ -15261,14 +15473,6 @@
   }
 
   @override
-  String get simpleStringLiteral_value {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    _variantField_20 ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
-    return _variantField_20;
-  }
-
-  @override
   String get uriBasedDirective_uriContent {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective ||
@@ -15561,6 +15765,9 @@
             binaryExpression_rightOperand.toJson();
       if (binaryExpression_operator != 0)
         _result["binaryExpression_operator"] = binaryExpression_operator;
+      if (binaryExpression_elementType != null)
+        _result["binaryExpression_elementType"] =
+            binaryExpression_elementType.toJson();
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -15600,16 +15807,6 @@
         _result["invocationExpression_arguments"] =
             invocationExpression_arguments.toJson();
     }
-    if (kind == idl.LinkedNodeKind.typeName) {
-      if (typeName_type != null)
-        _result["typeName_type"] = typeName_type.toJson();
-      if (typeName_name != null)
-        _result["typeName_name"] = typeName_name.toJson();
-      if (typeName_question != 0)
-        _result["typeName_question"] = typeName_question;
-      if (typeName_typeArguments != null)
-        _result["typeName_typeArguments"] = typeName_typeArguments.toJson();
-    }
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       if (adjacentStrings_strings.isNotEmpty)
         _result["adjacentStrings_strings"] =
@@ -15823,9 +16020,9 @@
                 .toList();
       if (uriBasedDirective_uri != null)
         _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
-      if (namespaceDirective_selectedUriContent != '')
-        _result["namespaceDirective_selectedUriContent"] =
-            namespaceDirective_selectedUriContent;
+      if (namespaceDirective_selectedUri != '')
+        _result["namespaceDirective_selectedUri"] =
+            namespaceDirective_selectedUri;
       if (uriBasedDirective_uriContent != '')
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
     }
@@ -15860,9 +16057,9 @@
                 .toList();
       if (uriBasedDirective_uri != null)
         _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
-      if (namespaceDirective_selectedUriContent != '')
-        _result["namespaceDirective_selectedUriContent"] =
-            namespaceDirective_selectedUriContent;
+      if (namespaceDirective_selectedUri != '')
+        _result["namespaceDirective_selectedUri"] =
+            namespaceDirective_selectedUri;
       if (uriBasedDirective_uriContent != '')
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
     }
@@ -16213,9 +16410,6 @@
         _result["directive_semicolon"] = directive_semicolon;
       if (uriBasedDirective_uri != null)
         _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
-      if (namespaceDirective_selectedUriContent != '')
-        _result["namespaceDirective_selectedUriContent"] =
-            namespaceDirective_selectedUriContent;
       if (uriBasedDirective_uriContent != '')
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
     }
@@ -16236,9 +16430,6 @@
         _result["directive_keyword"] = directive_keyword;
       if (directive_semicolon != 0)
         _result["directive_semicolon"] = directive_semicolon;
-      if (namespaceDirective_selectedUriContent != '')
-        _result["namespaceDirective_selectedUriContent"] =
-            namespaceDirective_selectedUriContent;
     }
     if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
       if (annotatedNode_comment != null)
@@ -16265,6 +16456,7 @@
         _result["typeParameter_extendsKeyword"] = typeParameter_extendsKeyword;
       if (typeParameter_name != null)
         _result["typeParameter_name"] = typeParameter_name.toJson();
+      if (typeParameter_id != 0) _result["typeParameter_id"] = typeParameter_id;
       if (codeLength != 0) _result["codeLength"] = codeLength;
       if (codeOffset != 0) _result["codeOffset"] = codeOffset;
     }
@@ -16368,6 +16560,9 @@
       if (assignmentExpression_operator != 0)
         _result["assignmentExpression_operator"] =
             assignmentExpression_operator;
+      if (assignmentExpression_elementType != null)
+        _result["assignmentExpression_elementType"] =
+            assignmentExpression_elementType.toJson();
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -16481,6 +16676,9 @@
         _result["constructorName_type"] = constructorName_type.toJson();
       if (constructorName_period != 0)
         _result["constructorName_period"] = constructorName_period;
+      if (constructorName_elementType != null)
+        _result["constructorName_elementType"] =
+            constructorName_elementType.toJson();
     }
     if (kind == idl.LinkedNodeKind.continueStatement) {
       if (continueStatement_label != null)
@@ -16676,6 +16874,9 @@
         _result["indexExpression_leftBracket"] = indexExpression_leftBracket;
       if (indexExpression_rightBracket != 0)
         _result["indexExpression_rightBracket"] = indexExpression_rightBracket;
+      if (indexExpression_elementType != null)
+        _result["indexExpression_elementType"] =
+            indexExpression_elementType.toJson();
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -16776,6 +16977,9 @@
         _result["postfixExpression_element"] = postfixExpression_element;
       if (postfixExpression_operator != 0)
         _result["postfixExpression_operator"] = postfixExpression_operator;
+      if (postfixExpression_elementType != null)
+        _result["postfixExpression_elementType"] =
+            postfixExpression_elementType.toJson();
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -16798,6 +17002,9 @@
         _result["prefixExpression_element"] = prefixExpression_element;
       if (prefixExpression_operator != 0)
         _result["prefixExpression_operator"] = prefixExpression_operator;
+      if (prefixExpression_elementType != null)
+        _result["prefixExpression_elementType"] =
+            prefixExpression_elementType.toJson();
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -16828,6 +17035,9 @@
       if (redirectingConstructorInvocation_thisKeyword != 0)
         _result["redirectingConstructorInvocation_thisKeyword"] =
             redirectingConstructorInvocation_thisKeyword;
+      if (redirectingConstructorInvocation_elementType != null)
+        _result["redirectingConstructorInvocation_elementType"] =
+            redirectingConstructorInvocation_elementType.toJson();
     }
     if (kind == idl.LinkedNodeKind.returnStatement) {
       if (returnStatement_expression != null)
@@ -16861,6 +17071,9 @@
       if (superConstructorInvocation_superKeyword != 0)
         _result["superConstructorInvocation_superKeyword"] =
             superConstructorInvocation_superKeyword;
+      if (superConstructorInvocation_elementType != null)
+        _result["superConstructorInvocation_elementType"] =
+            superConstructorInvocation_elementType.toJson();
     }
     if (kind == idl.LinkedNodeKind.throwExpression) {
       if (throwExpression_expression != null)
@@ -16871,6 +17084,16 @@
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
+    if (kind == idl.LinkedNodeKind.typeName) {
+      if (typeName_name != null)
+        _result["typeName_name"] = typeName_name.toJson();
+      if (typeName_question != 0)
+        _result["typeName_question"] = typeName_question;
+      if (typeName_typeArguments != null)
+        _result["typeName_typeArguments"] = typeName_typeArguments.toJson();
+      if (typeName_type != null)
+        _result["typeName_type"] = typeName_type.toJson();
+    }
     if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
       if (variableDeclarationStatement_variables != null)
         _result["variableDeclarationStatement_variables"] =
@@ -16966,6 +17189,9 @@
         _result["simpleIdentifier_element"] = simpleIdentifier_element;
       if (simpleIdentifier_token != 0)
         _result["simpleIdentifier_token"] = simpleIdentifier_token;
+      if (simpleIdentifier_elementType != null)
+        _result["simpleIdentifier_elementType"] =
+            simpleIdentifier_elementType.toJson();
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -17180,6 +17406,7 @@
         "binaryExpression_element": binaryExpression_element,
         "binaryExpression_rightOperand": binaryExpression_rightOperand,
         "binaryExpression_operator": binaryExpression_operator,
+        "binaryExpression_elementType": binaryExpression_elementType,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17212,16 +17439,6 @@
         "kind": kind,
       };
     }
-    if (kind == idl.LinkedNodeKind.typeName) {
-      return {
-        "typeName_type": typeName_type,
-        "typeName_name": typeName_name,
-        "typeName_question": typeName_question,
-        "typeName_typeArguments": typeName_typeArguments,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       return {
         "adjacentStrings_strings": adjacentStrings_strings,
@@ -17386,8 +17603,7 @@
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
+        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
       };
     }
@@ -17406,8 +17622,7 @@
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
+        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
       };
     }
@@ -17650,8 +17865,6 @@
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
       };
     }
@@ -17666,8 +17879,6 @@
         "directive_semicolon": directive_semicolon,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
       };
     }
     if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
@@ -17689,6 +17900,7 @@
         "typeParameter_bound": typeParameter_bound,
         "typeParameter_extendsKeyword": typeParameter_extendsKeyword,
         "typeParameter_name": typeParameter_name,
+        "typeParameter_id": typeParameter_id,
         "codeLength": codeLength,
         "codeOffset": codeOffset,
         "isSynthetic": isSynthetic,
@@ -17770,6 +17982,7 @@
         "assignmentExpression_rightHandSide":
             assignmentExpression_rightHandSide,
         "assignmentExpression_operator": assignmentExpression_operator,
+        "assignmentExpression_elementType": assignmentExpression_elementType,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17866,6 +18079,7 @@
         "constructorName_element": constructorName_element,
         "constructorName_type": constructorName_type,
         "constructorName_period": constructorName_period,
+        "constructorName_elementType": constructorName_elementType,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -18041,6 +18255,7 @@
         "indexExpression_period": indexExpression_period,
         "indexExpression_leftBracket": indexExpression_leftBracket,
         "indexExpression_rightBracket": indexExpression_rightBracket,
+        "indexExpression_elementType": indexExpression_elementType,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -18145,6 +18360,7 @@
         "postfixExpression_operand": postfixExpression_operand,
         "postfixExpression_element": postfixExpression_element,
         "postfixExpression_operator": postfixExpression_operator,
+        "postfixExpression_elementType": postfixExpression_elementType,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -18165,6 +18381,7 @@
         "prefixExpression_operand": prefixExpression_operand,
         "prefixExpression_element": prefixExpression_element,
         "prefixExpression_operator": prefixExpression_operator,
+        "prefixExpression_elementType": prefixExpression_elementType,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -18192,6 +18409,8 @@
             redirectingConstructorInvocation_period,
         "redirectingConstructorInvocation_thisKeyword":
             redirectingConstructorInvocation_thisKeyword,
+        "redirectingConstructorInvocation_elementType":
+            redirectingConstructorInvocation_elementType,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -18224,6 +18443,8 @@
         "superConstructorInvocation_period": superConstructorInvocation_period,
         "superConstructorInvocation_superKeyword":
             superConstructorInvocation_superKeyword,
+        "superConstructorInvocation_elementType":
+            superConstructorInvocation_elementType,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -18237,6 +18458,16 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.typeName) {
+      return {
+        "typeName_name": typeName_name,
+        "typeName_question": typeName_question,
+        "typeName_typeArguments": typeName_typeArguments,
+        "typeName_type": typeName_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.variableDeclarationStatement) {
       return {
         "variableDeclarationStatement_variables":
@@ -18344,6 +18575,7 @@
       return {
         "simpleIdentifier_element": simpleIdentifier_element,
         "simpleIdentifier_token": simpleIdentifier_token,
+        "simpleIdentifier_elementType": simpleIdentifier_elementType,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -18891,13 +19123,13 @@
     implements idl.LinkedNodeType {
   List<LinkedNodeTypeFormalParameterBuilder> _functionFormalParameters;
   LinkedNodeTypeBuilder _functionReturnType;
-  List<int> _functionTypeParameters;
+  List<LinkedNodeTypeTypeParameterBuilder> _functionTypeParameters;
   int _genericTypeAliasReference;
   List<LinkedNodeTypeBuilder> _genericTypeAliasTypeArguments;
   int _interfaceClass;
   List<LinkedNodeTypeBuilder> _interfaceTypeArguments;
   idl.LinkedNodeTypeKind _kind;
-  int _typeParameterParameter;
+  int _typeParameterId;
 
   @override
   List<LinkedNodeTypeFormalParameterBuilder> get functionFormalParameters =>
@@ -18916,11 +19148,10 @@
   }
 
   @override
-  List<int> get functionTypeParameters => _functionTypeParameters ??= <int>[];
+  List<LinkedNodeTypeTypeParameterBuilder> get functionTypeParameters =>
+      _functionTypeParameters ??= <LinkedNodeTypeTypeParameterBuilder>[];
 
-  /// References to [LinkedNodeReferences].
-  set functionTypeParameters(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+  set functionTypeParameters(List<LinkedNodeTypeTypeParameterBuilder> value) {
     this._functionTypeParameters = value;
   }
 
@@ -18965,24 +19196,23 @@
   }
 
   @override
-  int get typeParameterParameter => _typeParameterParameter ??= 0;
+  int get typeParameterId => _typeParameterId ??= 0;
 
-  /// Reference to a [LinkedNodeReferences].
-  set typeParameterParameter(int value) {
+  set typeParameterId(int value) {
     assert(value == null || value >= 0);
-    this._typeParameterParameter = value;
+    this._typeParameterId = value;
   }
 
   LinkedNodeTypeBuilder(
       {List<LinkedNodeTypeFormalParameterBuilder> functionFormalParameters,
       LinkedNodeTypeBuilder functionReturnType,
-      List<int> functionTypeParameters,
+      List<LinkedNodeTypeTypeParameterBuilder> functionTypeParameters,
       int genericTypeAliasReference,
       List<LinkedNodeTypeBuilder> genericTypeAliasTypeArguments,
       int interfaceClass,
       List<LinkedNodeTypeBuilder> interfaceTypeArguments,
       idl.LinkedNodeTypeKind kind,
-      int typeParameterParameter})
+      int typeParameterId})
       : _functionFormalParameters = functionFormalParameters,
         _functionReturnType = functionReturnType,
         _functionTypeParameters = functionTypeParameters,
@@ -18991,12 +19221,13 @@
         _interfaceClass = interfaceClass,
         _interfaceTypeArguments = interfaceTypeArguments,
         _kind = kind,
-        _typeParameterParameter = typeParameterParameter;
+        _typeParameterId = typeParameterId;
 
   /// Flush [informative] data recursively.
   void flushInformative() {
     _functionFormalParameters?.forEach((b) => b.flushInformative());
     _functionReturnType?.flushInformative();
+    _functionTypeParameters?.forEach((b) => b.flushInformative());
     _genericTypeAliasTypeArguments?.forEach((b) => b.flushInformative());
     _interfaceTypeArguments?.forEach((b) => b.flushInformative());
   }
@@ -19018,7 +19249,7 @@
     } else {
       signature.addInt(this._functionTypeParameters.length);
       for (var x in this._functionTypeParameters) {
-        signature.addInt(x);
+        x?.collectApiSignature(signature);
       }
     }
     signature.addInt(this._interfaceClass ?? 0);
@@ -19031,7 +19262,7 @@
       }
     }
     signature.addInt(this._kind == null ? 0 : this._kind.index);
-    signature.addInt(this._typeParameterParameter ?? 0);
+    signature.addInt(this._typeParameterId ?? 0);
     signature.addInt(this._genericTypeAliasReference ?? 0);
     if (this._genericTypeAliasTypeArguments == null) {
       signature.addInt(0);
@@ -19058,8 +19289,8 @@
       offset_functionReturnType = _functionReturnType.finish(fbBuilder);
     }
     if (!(_functionTypeParameters == null || _functionTypeParameters.isEmpty)) {
-      offset_functionTypeParameters =
-          fbBuilder.writeListUint32(_functionTypeParameters);
+      offset_functionTypeParameters = fbBuilder.writeList(
+          _functionTypeParameters.map((b) => b.finish(fbBuilder)).toList());
     }
     if (!(_genericTypeAliasTypeArguments == null ||
         _genericTypeAliasTypeArguments.isEmpty)) {
@@ -19097,8 +19328,8 @@
     if (_kind != null && _kind != idl.LinkedNodeTypeKind.bottom) {
       fbBuilder.addUint8(5, _kind.index);
     }
-    if (_typeParameterParameter != null && _typeParameterParameter != 0) {
-      fbBuilder.addUint32(6, _typeParameterParameter);
+    if (_typeParameterId != null && _typeParameterId != 0) {
+      fbBuilder.addUint32(6, _typeParameterId);
     }
     return fbBuilder.endTable();
   }
@@ -19122,13 +19353,13 @@
 
   List<idl.LinkedNodeTypeFormalParameter> _functionFormalParameters;
   idl.LinkedNodeType _functionReturnType;
-  List<int> _functionTypeParameters;
+  List<idl.LinkedNodeTypeTypeParameter> _functionTypeParameters;
   int _genericTypeAliasReference;
   List<idl.LinkedNodeType> _genericTypeAliasTypeArguments;
   int _interfaceClass;
   List<idl.LinkedNodeType> _interfaceTypeArguments;
   idl.LinkedNodeTypeKind _kind;
-  int _typeParameterParameter;
+  int _typeParameterId;
 
   @override
   List<idl.LinkedNodeTypeFormalParameter> get functionFormalParameters {
@@ -19148,9 +19379,12 @@
   }
 
   @override
-  List<int> get functionTypeParameters {
+  List<idl.LinkedNodeTypeTypeParameter> get functionTypeParameters {
     _functionTypeParameters ??=
-        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
+        const fb.ListReader<idl.LinkedNodeTypeTypeParameter>(
+                const _LinkedNodeTypeTypeParameterReader())
+            .vTableGet(
+                _bc, _bcOffset, 2, const <idl.LinkedNodeTypeTypeParameter>[]);
     return _functionTypeParameters;
   }
 
@@ -19191,10 +19425,10 @@
   }
 
   @override
-  int get typeParameterParameter {
-    _typeParameterParameter ??=
+  int get typeParameterId {
+    _typeParameterId ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
-    return _typeParameterParameter;
+    return _typeParameterId;
   }
 }
 
@@ -19208,7 +19442,8 @@
     if (functionReturnType != null)
       _result["functionReturnType"] = functionReturnType.toJson();
     if (functionTypeParameters.isNotEmpty)
-      _result["functionTypeParameters"] = functionTypeParameters;
+      _result["functionTypeParameters"] =
+          functionTypeParameters.map((_value) => _value.toJson()).toList();
     if (genericTypeAliasReference != 0)
       _result["genericTypeAliasReference"] = genericTypeAliasReference;
     if (genericTypeAliasTypeArguments.isNotEmpty)
@@ -19221,8 +19456,7 @@
           interfaceTypeArguments.map((_value) => _value.toJson()).toList();
     if (kind != idl.LinkedNodeTypeKind.bottom)
       _result["kind"] = kind.toString().split('.')[1];
-    if (typeParameterParameter != 0)
-      _result["typeParameterParameter"] = typeParameterParameter;
+    if (typeParameterId != 0) _result["typeParameterId"] = typeParameterId;
     return _result;
   }
 
@@ -19236,7 +19470,7 @@
         "interfaceClass": interfaceClass,
         "interfaceTypeArguments": interfaceTypeArguments,
         "kind": kind,
-        "typeParameterParameter": typeParameterParameter,
+        "typeParameterId": typeParameterId,
       };
 
   @override
@@ -19381,6 +19615,116 @@
   String toString() => convert.json.encode(toJson());
 }
 
+class LinkedNodeTypeTypeParameterBuilder extends Object
+    with _LinkedNodeTypeTypeParameterMixin
+    implements idl.LinkedNodeTypeTypeParameter {
+  LinkedNodeTypeBuilder _bound;
+  String _name;
+
+  @override
+  LinkedNodeTypeBuilder get bound => _bound;
+
+  set bound(LinkedNodeTypeBuilder value) {
+    this._bound = value;
+  }
+
+  @override
+  String get name => _name ??= '';
+
+  set name(String value) {
+    this._name = value;
+  }
+
+  LinkedNodeTypeTypeParameterBuilder({LinkedNodeTypeBuilder bound, String name})
+      : _bound = bound,
+        _name = name;
+
+  /// Flush [informative] data recursively.
+  void flushInformative() {
+    _bound?.flushInformative();
+  }
+
+  /// Accumulate non-[informative] data into [signature].
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    signature.addString(this._name ?? '');
+    signature.addBool(this._bound != null);
+    this._bound?.collectApiSignature(signature);
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_bound;
+    fb.Offset offset_name;
+    if (_bound != null) {
+      offset_bound = _bound.finish(fbBuilder);
+    }
+    if (_name != null) {
+      offset_name = fbBuilder.writeString(_name);
+    }
+    fbBuilder.startTable();
+    if (offset_bound != null) {
+      fbBuilder.addOffset(1, offset_bound);
+    }
+    if (offset_name != null) {
+      fbBuilder.addOffset(0, offset_name);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _LinkedNodeTypeTypeParameterReader
+    extends fb.TableReader<_LinkedNodeTypeTypeParameterImpl> {
+  const _LinkedNodeTypeTypeParameterReader();
+
+  @override
+  _LinkedNodeTypeTypeParameterImpl createObject(
+          fb.BufferContext bc, int offset) =>
+      new _LinkedNodeTypeTypeParameterImpl(bc, offset);
+}
+
+class _LinkedNodeTypeTypeParameterImpl extends Object
+    with _LinkedNodeTypeTypeParameterMixin
+    implements idl.LinkedNodeTypeTypeParameter {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeTypeTypeParameterImpl(this._bc, this._bcOffset);
+
+  idl.LinkedNodeType _bound;
+  String _name;
+
+  @override
+  idl.LinkedNodeType get bound {
+    _bound ??= const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 1, null);
+    return _bound;
+  }
+
+  @override
+  String get name {
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
+    return _name;
+  }
+}
+
+abstract class _LinkedNodeTypeTypeParameterMixin
+    implements idl.LinkedNodeTypeTypeParameter {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (bound != null) _result["bound"] = bound.toJson();
+    if (name != '') _result["name"] = name;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "bound": bound,
+        "name": name,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
 class LinkedNodeUnitBuilder extends Object
     with _LinkedNodeUnitMixin
     implements idl.LinkedNodeUnit {
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index bb86ffb..25f838b 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -406,8 +406,6 @@
 
   function,
 
-  genericTypeAlias,
-
   interface,
 
   typeParameter,
@@ -1861,6 +1859,8 @@
 
   variantField_19:uint (id: 19);
 
+  variantField_23:LinkedNodeType (id: 23);
+
   variantField_27:bool (id: 27);
 
   variantField_9:LinkedNode (id: 9);
@@ -1897,12 +1897,10 @@
 
   kind:LinkedNodeKind (id: 0);
 
-  variantField_23:string (id: 23);
+  variantField_20:string (id: 20);
 
   variantField_31:bool (id: 31);
 
-  variantField_20:string (id: 20);
-
   variantField_22:string (id: 22);
 
   variantField_32:LinkedNodeVariablesDeclaration (id: 32);
@@ -1945,8 +1943,7 @@
 
   functionReturnType:LinkedNodeType (id: 1);
 
-  /// References to [LinkedNodeReferences].
-  functionTypeParameters:[uint] (id: 2);
+  functionTypeParameters:[LinkedNodeTypeTypeParameter] (id: 2);
 
   genericTypeAliasReference:uint (id: 7);
 
@@ -1959,8 +1956,7 @@
 
   kind:LinkedNodeTypeKind (id: 5);
 
-  /// Reference to a [LinkedNodeReferences].
-  typeParameterParameter:uint (id: 6);
+  typeParameterId:uint (id: 6);
 }
 
 /// Information about a formal parameter in a function type.
@@ -1972,6 +1968,13 @@
   type:LinkedNodeType (id: 2);
 }
 
+/// Information about a type parameter in a function type.
+table LinkedNodeTypeTypeParameter {
+  bound:LinkedNodeType (id: 1);
+
+  name:string (id: 0);
+}
+
 /// Information about a single library in a [LinkedNodeLibrary].
 table LinkedNodeUnit {
   node:LinkedNode (id: 2);
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 4b897bc..0bf34e0 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -915,6 +915,9 @@
   @VariantId(15, variant: LinkedNodeKind.assignmentExpression)
   int get assignmentExpression_element;
 
+  @VariantId(23, variant: LinkedNodeKind.assignmentExpression)
+  LinkedNodeType get assignmentExpression_elementType;
+
   @VariantId(6, variant: LinkedNodeKind.assignmentExpression)
   LinkedNode get assignmentExpression_leftHandSide;
 
@@ -933,6 +936,9 @@
   @VariantId(15, variant: LinkedNodeKind.binaryExpression)
   int get binaryExpression_element;
 
+  @VariantId(23, variant: LinkedNodeKind.binaryExpression)
+  LinkedNodeType get binaryExpression_elementType;
+
   @VariantId(24, variant: LinkedNodeKind.binaryExpression)
   LinkedNodeType get binaryExpression_invokeType;
 
@@ -1229,6 +1235,9 @@
   @VariantId(15, variant: LinkedNodeKind.constructorName)
   int get constructorName_element;
 
+  @VariantId(23, variant: LinkedNodeKind.constructorName)
+  LinkedNodeType get constructorName_elementType;
+
   @VariantId(6, variant: LinkedNodeKind.constructorName)
   LinkedNode get constructorName_name;
 
@@ -1668,6 +1677,9 @@
   @VariantId(15, variant: LinkedNodeKind.indexExpression)
   int get indexExpression_element;
 
+  @VariantId(23, variant: LinkedNodeKind.indexExpression)
+  LinkedNodeType get indexExpression_elementType;
+
   @VariantId(6, variant: LinkedNodeKind.indexExpression)
   LinkedNode get indexExpression_index;
 
@@ -1862,13 +1874,11 @@
   ])
   List<LinkedNode> get namespaceDirective_configurations;
 
-  @VariantId(23, variantList: [
+  @VariantId(20, variantList: [
     LinkedNodeKind.exportDirective,
     LinkedNodeKind.importDirective,
-    LinkedNodeKind.partDirective,
-    LinkedNodeKind.partOfDirective,
   ])
-  String get namespaceDirective_selectedUriContent;
+  String get namespaceDirective_selectedUri;
 
   @VariantId(6, variant: LinkedNodeKind.nativeClause)
   LinkedNode get nativeClause_name;
@@ -1950,6 +1960,9 @@
   @VariantId(15, variant: LinkedNodeKind.postfixExpression)
   int get postfixExpression_element;
 
+  @VariantId(23, variant: LinkedNodeKind.postfixExpression)
+  LinkedNodeType get postfixExpression_elementType;
+
   @VariantId(6, variant: LinkedNodeKind.postfixExpression)
   LinkedNode get postfixExpression_operand;
 
@@ -1968,6 +1981,9 @@
   @VariantId(15, variant: LinkedNodeKind.prefixExpression)
   int get prefixExpression_element;
 
+  @VariantId(23, variant: LinkedNodeKind.prefixExpression)
+  LinkedNodeType get prefixExpression_elementType;
+
   @VariantId(6, variant: LinkedNodeKind.prefixExpression)
   LinkedNode get prefixExpression_operand;
 
@@ -1992,6 +2008,9 @@
   @VariantId(15, variant: LinkedNodeKind.redirectingConstructorInvocation)
   int get redirectingConstructorInvocation_element;
 
+  @VariantId(23, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  LinkedNodeType get redirectingConstructorInvocation_elementType;
+
   @VariantId(16, variant: LinkedNodeKind.redirectingConstructorInvocation)
   int get redirectingConstructorInvocation_period;
 
@@ -2040,6 +2059,9 @@
   @VariantId(15, variant: LinkedNodeKind.simpleIdentifier)
   int get simpleIdentifier_element;
 
+  @VariantId(23, variant: LinkedNodeKind.simpleIdentifier)
+  LinkedNodeType get simpleIdentifier_elementType;
+
   @VariantId(16, variant: LinkedNodeKind.simpleIdentifier)
   int get simpleIdentifier_token;
 
@@ -2076,6 +2098,9 @@
   @VariantId(15, variant: LinkedNodeKind.superConstructorInvocation)
   int get superConstructorInvocation_element;
 
+  @VariantId(23, variant: LinkedNodeKind.superConstructorInvocation)
+  LinkedNodeType get superConstructorInvocation_elementType;
+
   @VariantId(16, variant: LinkedNodeKind.superConstructorInvocation)
   int get superConstructorInvocation_period;
 
@@ -2210,7 +2235,7 @@
   @VariantId(15, variant: LinkedNodeKind.typeName)
   int get typeName_question;
 
-  @VariantId(24, variant: LinkedNodeKind.typeName)
+  @VariantId(23, variant: LinkedNodeKind.typeName)
   LinkedNodeType get typeName_type;
 
   @VariantId(7, variant: LinkedNodeKind.typeName)
@@ -2222,6 +2247,9 @@
   @VariantId(15, variant: LinkedNodeKind.typeParameter)
   int get typeParameter_extendsKeyword;
 
+  @VariantId(16, variant: LinkedNodeKind.typeParameter)
+  int get typeParameter_id;
+
   @VariantId(7, variant: LinkedNodeKind.typeParameter)
   LinkedNode get typeParameter_name;
 
@@ -2501,9 +2529,8 @@
   @Id(1)
   LinkedNodeType get functionReturnType;
 
-  /// References to [LinkedNodeReferences].
   @Id(2)
-  List<int> get functionTypeParameters;
+  List<LinkedNodeTypeTypeParameter> get functionTypeParameters;
 
   @Id(7)
   int get genericTypeAliasReference;
@@ -2521,9 +2548,8 @@
   @Id(5)
   LinkedNodeTypeKind get kind;
 
-  /// Reference to a [LinkedNodeReferences].
   @Id(6)
-  int get typeParameterParameter;
+  int get typeParameterId;
 }
 
 /// Information about a formal parameter in a function type.
@@ -2543,12 +2569,20 @@
   bottom,
   dynamic_,
   function,
-  genericTypeAlias,
   interface,
   typeParameter,
   void_
 }
 
+/// Information about a type parameter in a function type.
+abstract class LinkedNodeTypeTypeParameter extends base.SummaryClass {
+  @Id(1)
+  LinkedNodeType get bound;
+
+  @Id(0)
+  String get name;
+}
+
 /// Information about a single library in a [LinkedNodeLibrary].
 abstract class LinkedNodeUnit extends base.SummaryClass {
   @Id(2)
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index df84918..012a2ac 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -5347,6 +5347,7 @@
   InterfaceType _listType;
   InterfaceType _mapType;
   InterfaceType _mapObjectObjectType;
+  InterfaceType _neverType;
   InterfaceType _nullType;
   InterfaceType _numType;
   InterfaceType _objectType;
@@ -5431,6 +5432,10 @@
       _mapType ??= _buildInterfaceType(_linker.coreLibrary, 'Map');
 
   @override
+  InterfaceType get neverType =>
+      _neverType ??= _buildInterfaceType(_linker.coreLibrary, 'Never');
+
+  @override
   DartObjectImpl get nullObject {
     // TODO(paulberry): implement if needed
     throw new UnimplementedError();
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index dcb3d5f..f31b076 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -128,6 +128,7 @@
   InterfaceType _listType;
   InterfaceType _mapType;
   InterfaceType _mapObjectObjectType;
+  InterfaceType _neverType;
   DartObjectImpl _nullObject;
   InterfaceType _nullType;
   InterfaceType _numType;
@@ -266,6 +267,12 @@
   }
 
   @override
+  InterfaceType get neverType {
+    assert(_coreLibrary != null);
+    return _neverType ??= _getType(_coreLibrary, 'Never');
+  }
+
+  @override
   DartObjectImpl get nullObject {
     if (_nullObject == null) {
       _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index e08c4f6..15cab36 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -8,23 +8,16 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
 
 /// Deserializer of fully resolved ASTs from flat buffers.
 class AstBinaryReader {
   final LinkedUnitContext _unitContext;
 
-  ElementImpl _enclosingElement;
-  Reference _localRef;
-  int _localRefNextId;
-  List<ParameterElement> _localParameters;
-
   /// Set to `true` when this reader is used to lazily read its unit.
   bool isLazy = false;
 
@@ -45,35 +38,19 @@
     return _readType(data);
   }
 
-  /// Run [f] that reads nodes with local declarations, making sure that
-  /// [_localRef] is ready for adding local references.
-  T withLocalScope<T>(ElementImpl enclosingElement, T f()) {
-    var isLocalContextOwner = _localRef == null;
-    try {
-      if (_localRef == null) {
-        _enclosingElement = enclosingElement;
-        _localRef = Reference.root().getChild('@local');
-        _localRefNextId = 0;
-      }
-      return f();
-    } finally {
-      if (isLocalContextOwner) {
-        _enclosingElement = null;
-        _localRef = null;
-        _localRefNextId = null;
-        _localParameters = null;
-      }
-    }
-  }
+  Element _elementOfComponents(
+    int rawElementIndex,
+    LinkedNodeType definingTypeNode,
+  ) {
+    var element = _getElement(rawElementIndex);
+    if (definingTypeNode == null) return element;
 
-  ParameterKind _formalParameterKind(LinkedNodeFormalParameterKind kind) {
-    if (kind == LinkedNodeFormalParameterKind.optionalNamed) {
-      return ParameterKind.NAMED;
+    var definingType = _readType(definingTypeNode);
+    if (element is ConstructorElement) {
+      return ConstructorMember.from(element, definingType);
+    } else {
+      throw UnimplementedError('(${element.runtimeType}) $element');
     }
-    if (kind == LinkedNodeFormalParameterKind.optionalPositional) {
-      return ParameterKind.POSITIONAL;
-    }
-    return ParameterKind.REQUIRED;
   }
 
   T _getElement<T extends Element>(int index) {
@@ -81,11 +58,6 @@
     return bundleContext.elementOfIndex(index);
   }
 
-  List<T> _getElements<T extends Element>(List<int> indexList) {
-    var bundleContext = _unitContext.bundleContext;
-    return bundleContext.elementsOfIndexes(indexList);
-  }
-
   Token _getToken(int index) {
     return _unitContext.tokensContext.tokenOfIndex(index);
   }
@@ -160,7 +132,10 @@
       _getToken(data.assignmentExpression_operator),
       _readNode(data.assignmentExpression_rightHandSide),
     )
-      ..staticElement = _getElement(data.assignmentExpression_element)
+      ..staticElement = _elementOfComponents(
+        data.assignmentExpression_element,
+        data.assignmentExpression_elementType,
+      )
       ..staticType = _readType(data.expression_type);
   }
 
@@ -177,7 +152,10 @@
       _getToken(data.binaryExpression_operator),
       _readNode(data.binaryExpression_rightOperand),
     )
-      ..staticElement = _getElement(data.binaryExpression_element)
+      ..staticElement = _elementOfComponents(
+        data.binaryExpression_element,
+        data.binaryExpression_elementType,
+      )
       ..staticType = _readType(data.expression_type);
   }
 
@@ -240,7 +218,7 @@
       _getToken(data.classDeclaration_abstractKeyword),
       _getToken(data.classDeclaration_classKeyword),
       _readNode(data.namedCompilationUnitMember_name),
-      _readNodeLazy(data.classOrMixinDeclaration_typeParameters),
+      _readNode(data.classOrMixinDeclaration_typeParameters),
       _readNodeLazy(data.classDeclaration_extendsClause),
       _readNodeLazy(data.classDeclaration_withClause),
       _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
@@ -259,7 +237,7 @@
       _readNodeListLazy(data.annotatedNode_metadata),
       _getToken(data.typeAlias_typedefKeyword),
       _readNode(data.namedCompilationUnitMember_name),
-      _readNodeLazy(data.classTypeAlias_typeParameters),
+      _readNode(data.classTypeAlias_typeParameters),
       _getToken(data.classTypeAlias_equals),
       _getToken(data.classTypeAlias_abstractKeyword),
       _readNodeLazy(data.classTypeAlias_superclass),
@@ -360,7 +338,10 @@
       _readNode(data.constructorName_type),
       _getToken(data.constructorName_period),
       _readNode(data.constructorName_name),
-    )..staticElement = _getElement(data.constructorName_element);
+    )..staticElement = _elementOfComponents(
+        data.constructorName_element,
+        data.constructorName_elementType,
+      );
   }
 
   ContinueStatement _read_continueStatement(LinkedNode data) {
@@ -613,37 +594,11 @@
   }
 
   FunctionExpression _read_functionExpression(LinkedNode data) {
-    var prevLocalParameters = _localParameters;
-    var thisLocalParameters = <ParameterElement>[];
-    _localParameters = thisLocalParameters;
-
     var node = astFactory.functionExpression(
-      _readNodeLazy(data.functionExpression_typeParameters),
+      _readNode(data.functionExpression_typeParameters),
       _readNodeLazy(data.functionExpression_formalParameters),
       _readNodeLazy(data.functionExpression_body),
     );
-    _localParameters = prevLocalParameters;
-
-    if (_localRef != null) {
-      throw UnimplementedError();
-//      var element = FunctionElementImpl.forLinkedNode(
-//        _enclosingElement,
-//        _localRef.getChild('${_localRefNextId++}'),
-//        data,
-//      );
-//      element.parameters = thisLocalParameters;
-//
-//      var body = node.body;
-//      if (body.isAsynchronous) {
-//        element.asynchronous = true;
-//      }
-//      if (body.isGenerator) {
-//        element.generator = true;
-//      }
-//
-//      element.type = new FunctionTypeImpl(element);
-//      (node as FunctionExpressionImpl).declaredElement = element;
-    }
     LazyFunctionExpression.setData(node, data);
     return node;
   }
@@ -664,7 +619,7 @@
       _getToken(data.typeAlias_typedefKeyword),
       _readNodeLazy(data.functionTypeAlias_returnType),
       _readNode(data.namedCompilationUnitMember_name),
-      _readNodeLazy(data.functionTypeAlias_typeParameters),
+      _readNode(data.functionTypeAlias_typeParameters),
       _readNodeLazy(data.functionTypeAlias_formalParameters),
       _getToken(data.typeAlias_semicolon),
     );
@@ -684,19 +639,6 @@
       typeParameters:
           _readNode(data.functionTypedFormalParameter_typeParameters),
     );
-
-    if (_localRef != null) {
-      throw UnimplementedError();
-//      var name = node.identifier.name;
-//      var element = ParameterElementImpl.forLinkedNodeFactory(
-//        _enclosingElement,
-//        _localRef.getChild('${_localRefNextId++}').getChild(name),
-//        data,
-//      );
-//      _localParameters.add(element);
-//      node.identifier.staticElement = element;
-    }
-
     LazyFormalParameter.setData(node, data);
     return node;
   }
@@ -705,7 +647,7 @@
     GenericFunctionTypeImpl node = astFactory.genericFunctionType(
       _readNodeLazy(data.genericFunctionType_returnType),
       _getToken(data.genericFunctionType_functionKeyword),
-      _readNodeLazy(data.genericFunctionType_typeParameters),
+      _readNode(data.genericFunctionType_typeParameters),
       _readNodeLazy(data.genericFunctionType_formalParameters),
       question: _getToken(data.genericFunctionType_question),
     );
@@ -720,7 +662,7 @@
       _readNodeList(data.annotatedNode_metadata),
       _getToken(data.typeAlias_typedefKeyword),
       _readNode(data.namedCompilationUnitMember_name),
-      _readNodeLazy(data.genericTypeAlias_typeParameters),
+      _readNode(data.genericTypeAlias_typeParameters),
       _getToken(data.genericTypeAlias_equals),
       _readNodeLazy(data.genericTypeAlias_functionType),
       _getToken(data.typeAlias_semicolon),
@@ -792,7 +734,10 @@
       _getToken(data.indexExpression_rightBracket),
     )
       ..period = _getToken(data.indexExpression_period)
-      ..staticElement = _getElement(data.indexExpression_element)
+      ..staticElement = _elementOfComponents(
+        data.indexExpression_element,
+        data.indexExpression_elementType,
+      )
       ..staticType = _readType(data.expression_type);
   }
 
@@ -896,7 +841,7 @@
       _getToken(data.methodDeclaration_propertyKeyword),
       _getToken(data.methodDeclaration_operatorKeyword),
       _readNode(data.methodDeclaration_name),
-      _readNodeLazy(data.methodDeclaration_typeParameters),
+      _readNode(data.methodDeclaration_typeParameters),
       _readNodeLazy(data.methodDeclaration_formalParameters),
       _readNodeLazy(data.methodDeclaration_body),
     );
@@ -920,7 +865,7 @@
       _readNodeList(data.annotatedNode_metadata),
       _getToken(data.mixinDeclaration_mixinKeyword),
       _readNode(data.namedCompilationUnitMember_name),
-      _readNodeLazy(data.classOrMixinDeclaration_typeParameters),
+      _readNode(data.classOrMixinDeclaration_typeParameters),
       _readNodeLazy(data.mixinDeclaration_onClause),
       _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
       _getToken(data.classOrMixinDeclaration_leftBracket),
@@ -1005,7 +950,10 @@
       _readNode(data.postfixExpression_operand),
       _getToken(data.postfixExpression_operator),
     )
-      ..staticElement = _getElement(data.postfixExpression_element)
+      ..staticElement = _elementOfComponents(
+        data.postfixExpression_element,
+        data.postfixExpression_elementType,
+      )
       ..staticType = _readType(data.expression_type);
   }
 
@@ -1022,7 +970,10 @@
       _getToken(data.prefixExpression_operator),
       _readNode(data.prefixExpression_operand),
     )
-      ..staticElement = _getElement(data.prefixExpression_element)
+      ..staticElement = _elementOfComponents(
+        data.prefixExpression_element,
+        data.prefixExpression_elementType,
+      )
       ..staticType = _readType(data.expression_type);
   }
 
@@ -1041,8 +992,10 @@
       _getToken(data.redirectingConstructorInvocation_period),
       _readNode(data.redirectingConstructorInvocation_constructorName),
       _readNode(data.redirectingConstructorInvocation_arguments),
-    )..staticElement =
-        _getElement(data.redirectingConstructorInvocation_element);
+    )..staticElement = _elementOfComponents(
+        data.redirectingConstructorInvocation_element,
+        data.redirectingConstructorInvocation_elementType,
+      );
   }
 
   RethrowExpression _read_rethrowExpression(LinkedNode data) {
@@ -1097,20 +1050,6 @@
       metadata: _readNodeList(data.normalFormalParameter_metadata),
       keyword: _getToken(data.simpleFormalParameter_keyword),
     );
-
-    if (_localRef != null) {
-      throw UnimplementedError();
-//      var name = node.identifier.name;
-//      var element = ParameterElementImpl.forLinkedNodeFactory(
-//        _enclosingElement,
-//        _localRef.getChild('${_localRefNextId++}').getChild(name),
-//        data,
-//      );
-//      _localParameters.add(element);
-//      node.identifier.staticElement = element;
-//      node.declaredElement = element;
-    }
-
     LazyFormalParameter.setData(node, data);
     return node;
   }
@@ -1119,7 +1058,10 @@
     return astFactory.simpleIdentifier(
       _getToken(data.simpleIdentifier_token),
     )
-      ..staticElement = _getElement(data.simpleIdentifier_element)
+      ..staticElement = _elementOfComponents(
+        data.simpleIdentifier_element,
+        data.simpleIdentifier_elementType,
+      )
       ..staticType = _readType(data.expression_type);
   }
 
@@ -1149,7 +1091,10 @@
       _getToken(data.superConstructorInvocation_period),
       _readNode(data.superConstructorInvocation_constructorName),
       _readNode(data.superConstructorInvocation_arguments),
-    )..staticElement = _getElement(data.superConstructorInvocation_element);
+    )..staticElement = _elementOfComponents(
+        data.superConstructorInvocation_element,
+        data.superConstructorInvocation_elementType,
+      );
   }
 
   SuperExpression _read_superExpression(LinkedNode data) {
@@ -1256,6 +1201,7 @@
       _readNodeLazy(data.typeParameter_bound),
     );
     LazyTypeParameter.setData(node, data);
+    _unitContext.addTypeParameter(data.typeParameter_id, node);
     return node;
   }
 
@@ -1588,57 +1534,6 @@
   }
 
   DartType _readType(LinkedNodeType data) {
-    if (data == null) return null;
-
-    switch (data.kind) {
-      case LinkedNodeTypeKind.bottom:
-        return BottomTypeImpl.instance;
-      case LinkedNodeTypeKind.dynamic_:
-        return DynamicTypeImpl.instance;
-      case LinkedNodeTypeKind.function:
-        return FunctionTypeImpl.synthetic(
-          _readType(data.functionReturnType),
-          _getElements(data.functionTypeParameters),
-          data.functionFormalParameters
-              .map((p) => ParameterElementImpl.synthetic(
-                  p.name, _readType(p.type), _formalParameterKind(p.kind)))
-              .toList(),
-        );
-      case LinkedNodeTypeKind.interface:
-        var element = _getElement(data.interfaceClass);
-        if (element != null) {
-          return InterfaceTypeImpl.explicit(
-            element,
-            _readTypes(
-              data.interfaceTypeArguments,
-              const <InterfaceType>[],
-            ),
-          );
-        }
-        return DynamicTypeImpl.instance;
-      case LinkedNodeTypeKind.typeParameter:
-        var element = _getElement(data.typeParameterParameter);
-        // TODO(scheglov) Remove when references include all type parameters.
-        element ??= TypeParameterElementImpl('', -1);
-        return TypeParameterTypeImpl(element);
-      case LinkedNodeTypeKind.void_:
-        return VoidTypeImpl.instance;
-      default:
-        throw UnimplementedError('Type kind: ${data.kind}');
-    }
-  }
-
-  List<T> _readTypes<T extends DartType>(
-    List<LinkedNodeType> dataList,
-    List<T> ifEmpty,
-  ) {
-    if (dataList.isEmpty) return ifEmpty;
-
-    var result = List<T>(dataList.length);
-    for (var i = 0; i < dataList.length; ++i) {
-      var data = dataList[i];
-      result[i] = _readType(data);
-    }
-    return result;
+    return _unitContext.readType(data);
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 0766c24..76a97c7 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -18,7 +17,7 @@
 
 /// Serializer of fully resolved ASTs into flat buffers.
 class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
-  final LinkingBundleContext _linkingBundleContext;
+  final LinkingBundleContext _linkingContext;
   final TokensContext _tokensContext;
 
   /// This field is set temporary while visiting [FieldDeclaration] or
@@ -26,7 +25,7 @@
   /// in these declarations.
   LinkedNodeVariablesDeclarationBuilder _variablesDeclaration;
 
-  AstBinaryWriter(this._linkingBundleContext, this._tokensContext);
+  AstBinaryWriter(this._linkingContext, this._tokensContext);
 
   @override
   LinkedNodeBuilder visitAdjacentStrings(AdjacentStrings node) {
@@ -93,8 +92,10 @@
 
   @override
   LinkedNodeBuilder visitAssignmentExpression(AssignmentExpression node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.assignmentExpression(
-      assignmentExpression_element: _getReferenceIndex(node.staticElement),
+      assignmentExpression_element: elementComponents.rawElement,
+      assignmentExpression_elementType: elementComponents.definingType,
       assignmentExpression_leftHandSide: node.leftHandSide.accept(this),
       assignmentExpression_operator: _getToken(node.operator),
       assignmentExpression_rightHandSide: node.rightHandSide.accept(this),
@@ -113,8 +114,10 @@
 
   @override
   LinkedNodeBuilder visitBinaryExpression(BinaryExpression node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.binaryExpression(
-      binaryExpression_element: _getReferenceIndex(node.staticElement),
+      binaryExpression_element: elementComponents.rawElement,
+      binaryExpression_elementType: elementComponents.definingType,
       binaryExpression_leftOperand: node.leftOperand.accept(this),
       binaryExpression_operator: _getToken(node.operator),
       binaryExpression_rightOperand: node.rightOperand.accept(this),
@@ -208,6 +211,7 @@
       classTypeAlias_withClause: node.withClause.accept(this),
     );
     _storeTypeAlias(builder, node);
+    _storeIsSimpleBounded(builder, node);
     return builder;
   }
 
@@ -302,8 +306,10 @@
 
   @override
   LinkedNodeBuilder visitConstructorName(ConstructorName node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.constructorName(
-      constructorName_element: _getReferenceIndex(node.staticElement),
+      constructorName_element: elementComponents.rawElement,
+      constructorName_elementType: elementComponents.definingType,
       constructorName_name: node.name?.accept(this),
       constructorName_period: _getToken(node.period),
       constructorName_type: node.type.accept(this),
@@ -597,6 +603,7 @@
     );
     _storeTypeAlias(builder, node);
     _writeActualReturnType(builder, node);
+    _storeIsSimpleBounded(builder, node);
     return builder;
   }
 
@@ -636,6 +643,7 @@
       genericTypeAlias_typeParameters: node.typeParameters?.accept(this),
     );
     _storeTypeAlias(builder, node);
+    _storeIsSimpleBounded(builder, node);
     return builder;
   }
 
@@ -694,8 +702,10 @@
 
   @override
   LinkedNodeBuilder visitIndexExpression(IndexExpression node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.indexExpression(
-      indexExpression_element: _getReferenceIndex(node.staticElement),
+      indexExpression_element: elementComponents.rawElement,
+      indexExpression_elementType: elementComponents.definingType,
       indexExpression_index: node.index.accept(this),
       indexExpression_leftBracket: _getToken(node.leftBracket),
       indexExpression_period: _getToken(node.period),
@@ -929,9 +939,11 @@
 
   @override
   LinkedNodeBuilder visitPostfixExpression(PostfixExpression node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.postfixExpression(
       expression_type: _writeType(node.staticType),
-      postfixExpression_element: _getReferenceIndex(node.staticElement),
+      postfixExpression_element: elementComponents.rawElement,
+      postfixExpression_elementType: elementComponents.definingType,
       postfixExpression_operand: node.operand.accept(this),
       postfixExpression_operator: _getToken(node.operator),
     );
@@ -949,9 +961,11 @@
 
   @override
   LinkedNodeBuilder visitPrefixExpression(PrefixExpression node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.prefixExpression(
       expression_type: _writeType(node.staticType),
-      prefixExpression_element: _getReferenceIndex(node.staticElement),
+      prefixExpression_element: elementComponents.rawElement,
+      prefixExpression_elementType: elementComponents.definingType,
       prefixExpression_operand: node.operand.accept(this),
       prefixExpression_operator: _getToken(node.operator),
     );
@@ -971,13 +985,15 @@
   @override
   LinkedNodeBuilder visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.redirectingConstructorInvocation(
       redirectingConstructorInvocation_arguments:
           node.argumentList.accept(this),
       redirectingConstructorInvocation_constructorName:
           node.constructorName?.accept(this),
-      redirectingConstructorInvocation_element:
-          _getReferenceIndex(node.staticElement),
+      redirectingConstructorInvocation_element: elementComponents.rawElement,
+      redirectingConstructorInvocation_elementType:
+          elementComponents.definingType,
       redirectingConstructorInvocation_period: _getToken(node.period),
       redirectingConstructorInvocation_thisKeyword: _getToken(node.thisKeyword),
     );
@@ -1052,8 +1068,10 @@
       }
     }
 
+    var elementComponents = _componentsOfElement(element);
     return LinkedNodeBuilder.simpleIdentifier(
-      simpleIdentifier_element: _getReferenceIndex(element),
+      simpleIdentifier_element: elementComponents.rawElement,
+      simpleIdentifier_elementType: elementComponents.definingType,
       simpleIdentifier_token: _getToken(node.token),
       expression_type: _writeType(node.staticType),
     );
@@ -1088,12 +1106,13 @@
   @override
   LinkedNodeBuilder visitSuperConstructorInvocation(
       SuperConstructorInvocation node) {
+    var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.superConstructorInvocation(
       superConstructorInvocation_arguments: node.argumentList.accept(this),
       superConstructorInvocation_constructorName:
           node.constructorName?.accept(this),
-      superConstructorInvocation_element:
-          _getReferenceIndex(node.staticElement),
+      superConstructorInvocation_element: elementComponents.rawElement,
+      superConstructorInvocation_elementType: elementComponents.definingType,
       superConstructorInvocation_period: _getToken(node.period),
       superConstructorInvocation_superKeyword: _getToken(node.superKeyword),
     );
@@ -1222,6 +1241,9 @@
         typeParameter_name: node.name.accept(this));
     _storeDeclaration(builder, node);
     _storeCodeOffsetLength(builder, node);
+    builder.typeParameter_id = _linkingContext.idOfTypeParameter(
+      node.declaredElement,
+    );
     return builder;
   }
 
@@ -1307,19 +1329,15 @@
     return node.accept(this);
   }
 
-  int _getReferenceIndex(Element element) {
-    if (element == null) return 0;
-
+  _ElementComponents _componentsOfElement(Element element) {
     if (element is Member) {
-      element = (element as Member).baseElement;
+      var elementIndex = _indexOfElement(element.baseElement);
+      var definingTypeNode = _writeType(element.definingType);
+      return _ElementComponents(elementIndex, definingTypeNode);
     }
 
-    var reference = (element as ElementImpl).reference;
-    if (identical(element, DynamicElementImpl.instance)) {
-      reference = _linkingBundleContext.dynamicReference;
-    }
-
-    return _linkingBundleContext.indexOfReference(reference);
+    var elementIndex = _indexOfElement(element);
+    return _ElementComponents(elementIndex, null);
   }
 
   int _getToken(Token token) {
@@ -1335,6 +1353,10 @@
     return result;
   }
 
+  int _indexOfElement(Element element) {
+    return _linkingContext.indexOfElement(element);
+  }
+
   void _storeAnnotatedNode(LinkedNodeBuilder builder, AnnotatedNode node) {
     builder
       ..annotatedNode_comment = node.documentationComment?.accept(this)
@@ -1356,6 +1378,7 @@
       ..classOrMixinDeclaration_typeParameters =
           node.typeParameters?.accept(this);
     _storeNamedCompilationUnitMember(builder, node);
+    _storeIsSimpleBounded(builder, node);
   }
 
   void _storeCodeOffsetLength(LinkedNodeBuilder builder, AstNode node) {
@@ -1460,6 +1483,12 @@
       ..invocationExpression_typeArguments = node.typeArguments?.accept(this);
   }
 
+  void _storeIsSimpleBounded(LinkedNodeBuilder builder, AstNode node) {
+    var flag = LazyAst.isSimplyBounded(node);
+    // TODO(scheglov) Check for `null` when writing resolved AST.
+    builder.simplyBoundable_isSimplyBounded = flag;
+  }
+
   void _storeNamedCompilationUnitMember(
       LinkedNodeBuilder builder, NamedCompilationUnitMember node) {
     _storeCompilationUnitMember(builder, node);
@@ -1473,7 +1502,7 @@
     builder
       ..namespaceDirective_combinators = _writeNodeList(node.combinators)
       ..namespaceDirective_configurations = _writeNodeList(node.configurations)
-      ..namespaceDirective_selectedUriContent = node.selectedUriContent
+      ..namespaceDirective_selectedUri = LazyDirective.getSelectedUri(node)
       ..directive_semicolon = _getToken(node.semicolon);
   }
 
@@ -1517,7 +1546,7 @@
     builder
       ..uriBasedDirective_uri = node.uri.accept(this)
       ..uriBasedDirective_uriContent = node.uriContent
-      ..uriBasedDirective_uriElement = _getReferenceIndex(node.uriElement);
+      ..uriBasedDirective_uriElement = _indexOfElement(node.uriElement);
   }
 
   void _writeActualReturnType(LinkedNodeBuilder builder, AstNode node) {
@@ -1545,6 +1574,14 @@
   }
 
   LinkedNodeTypeBuilder _writeType(DartType type) {
-    return _linkingBundleContext.writeType(type);
+    return _linkingContext.writeType(type);
   }
 }
+
+/// Components of a [Member] - the raw element, and the defining type.
+class _ElementComponents {
+  final int rawElement;
+  final LinkedNodeType definingType;
+
+  _ElementComponents(this.rawElement, this.definingType);
+}
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index ab43e11..a8a0d5a 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -21,6 +21,7 @@
     AstNode node, {
     ClassElement enclosingClassElement,
     ExecutableElement enclosingExecutableElement,
+    bool doAstRewrite = false,
   }) {
     var source = _FakeSource();
     var errorListener = AnalysisErrorListener.NULL_LISTENER;
@@ -30,7 +31,13 @@
         nameScope: _nameScope);
     node.accept(typeResolverVisitor);
 
-//    expression.accept(_astRewriteVisitor);
+    if (doAstRewrite) {
+      var astRewriteVisitor = new AstRewriteVisitor(_linker.typeSystem,
+          _library, source, _linker.typeProvider, errorListener,
+          nameScope: _nameScope);
+      node.accept(astRewriteVisitor);
+    }
+
 //    expression.accept(_variableResolverVisitor);
 //    if (_linker.getAst != null) {
 //      expression.accept(_partialResolverVisitor);
diff --git a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
index be3a93a..dab6481 100644
--- a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart' show LibraryScope;
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -13,6 +12,7 @@
 import 'package:analyzer/src/summary2/constructor_initializer_resolver.dart';
 import 'package:analyzer/src/summary2/default_value_resolver.dart';
 import 'package:analyzer/src/summary2/export.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
@@ -20,8 +20,6 @@
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/summary2/reference_resolver.dart';
 import 'package:analyzer/src/summary2/scope.dart';
-import 'package:analyzer/src/summary2/top_level_inference.dart';
-import 'package:analyzer/src/summary2/type_builder.dart';
 
 class SourceLibraryBuilder {
   final Linker linker;
@@ -31,7 +29,7 @@
 
   LinkedLibraryContext context;
 
-  LibraryElement element;
+  LibraryElementImpl element;
   LibraryScope libraryScope;
 
   /// Local declarations.
@@ -48,22 +46,33 @@
     var unitContext = context.units[0];
     for (var directive in unitContext.unit_withDirectives.directives) {
       if (directive is ast.ExportDirective) {
-        var relativeUriStr = directive.uri.stringValue;
-        var relativeUri = Uri.parse(relativeUriStr);
-        var uri = resolveRelativeUri(this.uri, relativeUri);
-        var exported = linker.builders[uri];
-        if (exported != null) {
-          var combinators = directive.combinators.map((node) {
-            if (node is ast.ShowCombinator) {
-              var nameList = node.shownNames.map((i) => i.name).toList();
-              return Combinator.show(nameList);
-            } else if (node is ast.HideCombinator) {
-              var nameList = node.hiddenNames.map((i) => i.name).toList();
-              return Combinator.hide(nameList);
-            }
-          }).toList();
+        Uri uri;
+        try {
+          uri = _selectAbsoluteUri(directive);
+          if (uri == null) continue;
+        } on FormatException {
+          continue;
+        }
 
-          exported.exporters.add(new Export(this, exported, combinators));
+        var combinators = directive.combinators.map((node) {
+          if (node is ast.ShowCombinator) {
+            var nameList = node.shownNames.map((i) => i.name).toList();
+            return Combinator.show(nameList);
+          } else if (node is ast.HideCombinator) {
+            var nameList = node.hiddenNames.map((i) => i.name).toList();
+            return Combinator.hide(nameList);
+          }
+        }).toList();
+
+        var exported = linker.builders[uri];
+        var export = Export(this, exported, combinators);
+        if (exported != null) {
+          exported.exporters.add(export);
+        } else {
+          var references = linker.elementFactory.exportsOfLibrary('$uri');
+          for (var reference in references) {
+            export.addToExportScope(reference.name, reference);
+          }
         }
       }
     }
@@ -275,16 +284,12 @@
     });
   }
 
-  void performTopLevelInference() {
-    TopLevelInference(linker, reference).infer();
-  }
-
   void resolveConstructors() {
-    ConstructorInitializerResolver(linker, reference).resolve();
+    ConstructorInitializerResolver(linker, element).resolve();
   }
 
   void resolveDefaultValues() {
-    DefaultValueResolver(linker, reference).resolve();
+    DefaultValueResolver(linker, element).resolve();
   }
 
   void resolveMetadata() {
@@ -294,11 +299,12 @@
     }
   }
 
-  void resolveTypes(NodesToBuildType nodesToBuildType) {
+  void resolveTypes(List<ast.AstNode> nodesToBuildType) {
     for (var unitContext in context.units) {
       var unitRef = reference.getChild('@unit');
       var unitReference = unitRef.getChild(unitContext.uriStr);
       var resolver = ReferenceResolver(
+        linker.linkingBundleContext,
         nodesToBuildType,
         linker.elementFactory,
         element,
@@ -309,6 +315,20 @@
     }
   }
 
+  void resolveUriDirectives() {
+    var unitContext = context.units[0];
+    for (var directive in unitContext.unit.directives) {
+      if (directive is ast.NamespaceDirective) {
+        try {
+          var uri = _selectAbsoluteUri(directive);
+          if (uri != null) {
+            LazyDirective.setSelectedUri(directive, '$uri');
+          }
+        } on FormatException {}
+      }
+    }
+  }
+
   void storeExportScope() {
     var linkingBundleContext = linker.linkingBundleContext;
     for (var reference in exportScope.map.values) {
@@ -317,48 +337,40 @@
     }
   }
 
-  static void build(Linker linker, Source librarySource,
-      Map<Source, ast.CompilationUnit> libraryUnits) {
-    var libraryUriStr = librarySource.uri.toString();
+  Uri _selectAbsoluteUri(ast.NamespaceDirective directive) {
+    var relativeUriStr = _selectRelativeUri(
+      directive.configurations,
+      directive.uri.stringValue,
+    );
+    if (relativeUriStr.isEmpty) return null;
+    var relativeUri = Uri.parse(relativeUriStr);
+    return resolveRelativeUri(this.uri, relativeUri);
+  }
+
+  String _selectRelativeUri(
+    List<ast.Configuration> configurations,
+    String defaultUri,
+  ) {
+    for (var configuration in configurations) {
+      var name = configuration.name.components.join('.');
+      var value = configuration.value ?? 'true';
+      if (linker.declaredVariables.get(name) == (value)) {
+        return configuration.uri.stringValue;
+      }
+    }
+    return defaultUri;
+  }
+
+  static void build(Linker linker, LinkInputLibrary inputLibrary) {
+    var libraryUri = inputLibrary.source.uri;
+    var libraryUriStr = '$libraryUri';
     var libraryReference = linker.rootReference.getChild(libraryUriStr);
 
-    var unitNodeList = <LinkedNodeUnitBuilder>[];
     var libraryNode = LinkedNodeLibraryBuilder(
-      units: unitNodeList,
       uriStr: libraryUriStr,
     );
 
-    var builder = SourceLibraryBuilder(
-      linker,
-      librarySource.uri,
-      libraryReference,
-      libraryNode,
-    );
-    linker.builders[builder.uri] = builder;
-
-    var unitMap = <String, ast.CompilationUnit>{};
-    ast.CompilationUnit definingUnit;
-    for (var unitSource in libraryUnits.keys) {
-      var unit = libraryUnits[unitSource];
-      definingUnit ??= unit;
-      unitMap['${unitSource.uri}'] = unit;
-    }
-
-    builder.context = linker.bundleContext
-        .addLinkingLibrary(libraryUriStr, libraryNode, unitMap);
-
-//      if (libraryUriStr == 'dart:core') {
-//        for (var declaration in unitNode.compilationUnit_declarations) {
-//          if (declaration.kind == LinkedNodeKind.classDeclaration) {
-//            var nameNode = declaration.namedCompilationUnitMember_name;
-//            if (unitContext.getSimpleName(nameNode) == 'Object') {
-//              declaration.classDeclaration_isDartObject = true;
-//            }
-//          }
-//        }
-//      }
-//    }
-
+    var definingUnit = inputLibrary.units[0].unit;
     for (var directive in definingUnit.directives) {
       if (directive is ast.LibraryDirective) {
         var name = directive.name;
@@ -368,6 +380,20 @@
         break;
       }
     }
+
+    var builder = SourceLibraryBuilder(
+      linker,
+      libraryUri,
+      libraryReference,
+      libraryNode,
+    );
+    linker.builders[builder.uri] = builder;
+
+    builder.context = linker.bundleContext.addLinkingLibrary(
+      libraryUriStr,
+      libraryNode,
+      inputLibrary,
+    );
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
index a0cc02e..fbb7919 100644
--- a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
@@ -3,37 +3,28 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
-import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary2/ast_resolver.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/summary2/linking_node_scope.dart';
 
 class ConstructorInitializerResolver {
-  Linker _linker;
-  LibraryElementImpl _libraryElement;
+  final Linker _linker;
+  final LibraryElementImpl _libraryElement;
 
-  Scope _libraryScope;
-  Scope _classScope;
-
-  LinkedUnitContext _linkedContext;
-
+  ClassElement _classElement;
   ConstructorElement _constructorElement;
-  LinkedNodeBuilder _constructorNode;
+  ConstructorDeclarationImpl _constructorNode;
   AstResolver _astResolver;
 
-  ConstructorInitializerResolver(this._linker, Reference libraryRef) {
-    _libraryElement = _linker.elementFactory.elementOfReference(libraryRef);
-    _libraryScope = LibraryScope(_libraryElement);
-  }
+  ConstructorInitializerResolver(this._linker, this._libraryElement);
 
   void resolve() {
-    for (CompilationUnitElementImpl unit in _libraryElement.units) {
-      _linkedContext = unit.linkedContext;
+    for (var unit in _libraryElement.units) {
       for (var classElement in unit.types) {
-        _classScope = ClassScope(_libraryScope, classElement);
+        _classElement = classElement;
         for (var constructorElement in classElement.constructors) {
           _constructor(constructorElement);
         }
@@ -44,70 +35,47 @@
   void _constructor(ConstructorElementImpl constructorElement) {
     if (constructorElement.isSynthetic) return;
 
-//    _constructorElement = constructorElement;
-//    _constructorNode = constructorElement.linkedNode;
-//
-//    var functionScope = FunctionScope(_classScope, constructorElement);
-//    functionScope.defineParameters();
-//
-//    var nameScope = ConstructorInitializerScope(
-//      functionScope,
-//      constructorElement,
-//    );
-//
-//    _astResolver = AstResolver(_linker, _libraryElement, nameScope);
-//
-//    _initializers();
-//    _redirectedConstructor();
+    _constructorElement = constructorElement;
+    _constructorNode = constructorElement.linkedNode;
+
+    var functionScope = LinkingNodeContext.get(_constructorNode).scope;
+    var initializerScope = ConstructorInitializerScope(
+      functionScope,
+      constructorElement,
+    );
+
+    _astResolver = AstResolver(_linker, _libraryElement, initializerScope);
+
+    _initializers();
+    _redirectedConstructor();
   }
 
   void _initializers() {
-    throw UnimplementedError();
+    var initializers = _constructorNode.initializers;
 
-//    bool isConst = _constructorNode.constructorDeclaration_constKeyword != 0;
-//
-//    var initializers = _constructorNode.constructorDeclaration_initializers;
-//    var resolvedList = List<LinkedNodeBuilder>();
-//    for (var i = 0; i < initializers.length; ++i) {
-//      var unresolvedNode = initializers[i];
-//
-//      // Keep only initializers of constant constructors; or redirects.
-//      if (!isConst &&
-//          unresolvedNode.kind !=
-//              LinkedNodeKind.redirectingConstructorInvocation) {
-//        continue;
-//      }
-//
-//      var reader = AstBinaryReader(_linkedContext);
-//      var unresolvedAst = reader.readNode(unresolvedNode);
-//
-//      var resolvedNode = _astResolver.resolve(
-//        _linkedContext,
-//        unresolvedAst,
-//        enclosingClassElement: _constructorElement.enclosingElement,
-//        enclosingExecutableElement: _constructorElement,
-//      );
-//      resolvedList.add(resolvedNode);
-//    }
-//    _constructorNode.constructorDeclaration_initializers = resolvedList;
+    var isConst = _constructorNode.constKeyword != null;
+    if (!isConst) {
+      initializers.clear();
+      return;
+    }
+
+    for (var initializer in initializers) {
+      _astResolver.resolve(
+        initializer,
+        enclosingClassElement: _classElement,
+        enclosingExecutableElement: _constructorElement,
+      );
+    }
   }
 
   void _redirectedConstructor() {
-    throw UnimplementedError();
-
-//    var redirectedConstructorNode =
-//        _constructorNode.constructorDeclaration_redirectedConstructor;
-//    if (redirectedConstructorNode == null) return;
-//
-//    var reader = AstBinaryReader(_linkedContext);
-//    var unresolvedAst = reader.readNode(redirectedConstructorNode);
-//    var resolvedNode = _astResolver.resolve(
-//      _linkedContext,
-//      unresolvedAst,
-//      enclosingClassElement: _constructorElement.enclosingElement,
-//      enclosingExecutableElement: _constructorElement,
-//    );
-//    _constructorNode.constructorDeclaration_redirectedConstructor =
-//        resolvedNode;
+    var redirected = _constructorNode.redirectedConstructor;
+    if (redirected != null) {
+      _astResolver.resolve(
+        redirected,
+        enclosingClassElement: _classElement,
+        enclosingExecutableElement: _constructorElement,
+      );
+    }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/core_types.dart b/pkg/analyzer/lib/src/summary2/core_types.dart
new file mode 100644
index 0000000..289ea8e
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/core_types.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/summary2/linked_element_factory.dart';
+
+class CoreTypes {
+  final LinkedElementFactory _elementFactory;
+
+  LibraryElement _coreLibrary;
+  ClassElement _objectClass;
+
+  CoreTypes(this._elementFactory);
+
+  LibraryElement get coreLibrary {
+    return _coreLibrary ??= _elementFactory.libraryOfUri('dart:core');
+  }
+
+  ClassElement get objectClass {
+    return _objectClass ??= _getCoreClass('Object');
+  }
+
+  ClassElement _getCoreClass(String name) {
+    return coreLibrary.getType(name);
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 4ee405d..f531465 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -10,45 +11,35 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/summary2/ast_resolver.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/summary2/linking_node_scope.dart';
 
 class DefaultValueResolver {
-  Linker _linker;
-  LibraryElementImpl _libraryElement;
-  LinkedUnitContext _linkedContext;
+  final Linker _linker;
+  final LibraryElementImpl _libraryElement;
 
-  ClassElement _enclosingClassElement;
-  ExecutableElement _enclosingExecutableElement;
-
-  Scope _libraryScope;
-  Scope _classScope;
+  ClassElement _classElement;
+  ExecutableElement _executableElement;
+  Scope _scope;
 
   AstResolver _astResolver;
 
-  DefaultValueResolver(this._linker, Reference libraryRef) {
-    _libraryElement = _linker.elementFactory.elementOfReference(libraryRef);
-    _libraryScope = LibraryScope(_libraryElement);
-  }
+  DefaultValueResolver(this._linker, this._libraryElement);
 
   void resolve() {
     for (CompilationUnitElementImpl unit in _libraryElement.units) {
-      _linkedContext = unit.linkedContext;
-
       for (var classElement in unit.types) {
-        _enclosingClassElement = classElement;
-        _classScope = TypeParameterScope(_libraryScope, classElement);
+        _classElement = classElement;
 
         for (var element in classElement.constructors) {
           _constructor(element);
         }
 
         for (var element in classElement.methods) {
+          _setScopeFromElement(element);
           _method(element);
         }
 
-        _enclosingClassElement = null;
-        _classScope = null;
+        _classElement = null;
       }
 
       for (var element in unit.functions) {
@@ -61,54 +52,46 @@
     if (element.isSynthetic) return;
 
     _astResolver = null;
-    _enclosingExecutableElement = element;
+    _executableElement = element;
+    _setScopeFromElement(element);
 
     _parameters(element.parameters);
   }
 
   void _function(FunctionElementImpl element) {
     _astResolver = null;
-    _enclosingExecutableElement = element;
+    _executableElement = element;
+    _setScopeFromElement(element);
 
     _parameters(element.parameters);
   }
 
   void _method(MethodElementImpl element) {
     _astResolver = null;
-    _enclosingExecutableElement = element;
+    _executableElement = element;
+    _setScopeFromElement(element);
 
     _parameters(element.parameters);
   }
 
   void _parameter(ParameterElementImpl parameter) {
-    if (parameter.isNotOptional) return;
+    Expression defaultValue;
+    var node = parameter.linkedNode;
+    if (node is DefaultFormalParameter) {
+      defaultValue = node.defaultValue;
+    }
+    if (defaultValue == null) return;
 
-//    LinkedNodeBuilder node = parameter.linkedNode;
-//    var unresolvedNode = node.defaultFormalParameter_defaultValue;
-//    if (unresolvedNode == null) return;
-//
-//    var reader = AstBinaryReader(_linkedContext);
-//    var unresolvedAst = reader.readNode(unresolvedNode);
-//
-//    if (_astResolver == null) {
-//      var scope = FunctionScope(
-//        _classScope ?? _libraryScope,
-//        _enclosingExecutableElement,
-//      );
-//      _astResolver = AstResolver(_linker, _libraryElement, scope);
-//    }
-//
-//    var contextType = TypeVariableEliminator(_linker.typeProvider)
-//        .substituteType(parameter.type);
-//    InferenceContext.setType(unresolvedAst, contextType);
-//
-//    var resolvedNode = _astResolver.resolve(
-//      _linkedContext,
-//      unresolvedAst,
-//      enclosingClassElement: _enclosingClassElement,
-//      enclosingExecutableElement: _enclosingExecutableElement,
-//    );
-//    node.defaultFormalParameter_defaultValue = resolvedNode;
+    var contextType = TypeVariableEliminator(_linker.typeProvider)
+        .substituteType(parameter.type);
+    InferenceContext.setType(defaultValue, contextType);
+
+    _astResolver ??= AstResolver(_linker, _libraryElement, _scope);
+    _astResolver.resolve(
+      defaultValue,
+      enclosingClassElement: _classElement,
+      enclosingExecutableElement: _executableElement,
+    );
   }
 
   void _parameters(List<ParameterElement> parameters) {
@@ -116,6 +99,10 @@
       _parameter(parameter);
     }
   }
+
+  void _setScopeFromElement(Element element) {
+    _scope = LinkingNodeContext.get((element as ElementImpl).linkedNode).scope;
+  }
 }
 
 class TypeVariableEliminator extends Substitution {
diff --git a/pkg/analyzer/lib/src/summary2/lazy_ast.dart b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
index d4f01c5..77b9527 100644
--- a/pkg/analyzer/lib/src/summary2/lazy_ast.dart
+++ b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
@@ -11,6 +11,8 @@
 /// Accessor for reading AST lazily, or read data that is stored in IDL, but
 /// cannot be stored in AST, like inferred types.
 class LazyAst {
+  static const _hasOverrideInferenceKey = 'lazyAst_hasOverrideInference';
+  static const _isSimplyBoundedKey = 'lazyAst_simplyBounded';
   static const _returnTypeKey = 'lazyAst_returnType';
   static const _typeKey = 'lazyAst_type';
 
@@ -26,10 +28,26 @@
     return node.getProperty(_typeKey);
   }
 
+  static bool hasOverrideInferenceDone(AstNode node) {
+    return node.getProperty(_hasOverrideInferenceKey) ?? false;
+  }
+
+  static bool isSimplyBounded(AstNode node) {
+    return node.getProperty(_isSimplyBoundedKey);
+  }
+
+  static void setOverrideInferenceDone(AstNode node) {
+    node.setProperty(_hasOverrideInferenceKey, true);
+  }
+
   static void setReturnType(AstNode node, DartType type) {
     node.setProperty(_returnTypeKey, type);
   }
 
+  static void setSimplyBounded(AstNode node, bool simplyBounded) {
+    node.setProperty(_isSimplyBoundedKey, simplyBounded);
+  }
+
   static void setType(AstNode node, DartType type) {
     node.setProperty(_typeKey, type);
   }
@@ -45,7 +63,6 @@
   bool _hasImplementsClause = false;
   bool _hasMembers = false;
   bool _hasMetadata = false;
-  bool _hasTypeParameters = false;
   bool _hasWithClause = false;
 
   LazyClassDeclaration(this.data);
@@ -123,19 +140,6 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    ClassDeclaration node,
-  ) {
-    var lazy = LazyClassDeclaration.get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.classOrMixinDeclaration_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void readWithClause(
     AstBinaryReader reader,
     ClassDeclaration node,
@@ -151,6 +155,7 @@
 
   static void setData(ClassDeclaration node, LinkedNode data) {
     node.setProperty(_key, LazyClassDeclaration(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
 
@@ -163,7 +168,6 @@
   bool _hasImplementsClause = false;
   bool _hasMetadata = false;
   bool _hasSuperclass = false;
-  bool _hasTypeParameters = false;
   bool _hasWithClause = false;
 
   LazyClassTypeAlias(this.data);
@@ -228,19 +232,6 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    ClassTypeAlias node,
-  ) {
-    var lazy = get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.classTypeAlias_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void readWithClause(
     AstBinaryReader reader,
     ClassTypeAlias node,
@@ -256,6 +247,7 @@
 
   static void setData(ClassTypeAlias node, LinkedNode data) {
     node.setProperty(_key, LazyClassTypeAlias(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
 
@@ -267,7 +259,9 @@
   bool _hasBody = false;
   bool _hasDocumentationComment = false;
   bool _hasFormalParameters = false;
+  bool _hasInitializers = false;
   bool _hasMetadata = false;
+  bool _hasRedirectedConstructor = false;
 
   LazyConstructorDeclaration(this.data);
 
@@ -314,6 +308,21 @@
     }
   }
 
+  static void readInitializers(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasInitializers) {
+      var dataList = lazy.data.constructorDeclaration_initializers;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.initializers[i] = reader.readNode(data);
+      }
+      lazy._hasInitializers = true;
+    }
+  }
+
   static void readMetadata(
     AstBinaryReader reader,
     ConstructorDeclaration node,
@@ -329,6 +338,19 @@
     }
   }
 
+  static void readRedirectedConstructor(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasRedirectedConstructor) {
+      node.redirectedConstructor = reader.readNode(
+        lazy.data.constructorDeclaration_redirectedConstructor,
+      );
+      lazy._hasRedirectedConstructor = true;
+    }
+  }
+
   static void setData(ConstructorDeclaration node, LinkedNode data) {
     node.setProperty(_key, LazyConstructorDeclaration(data));
   }
@@ -336,6 +358,7 @@
 
 class LazyDirective {
   static const _key = 'lazyAst';
+  static const _uriKey = 'lazyAst_selectedUri';
 
   final LinkedNode data;
 
@@ -347,6 +370,10 @@
     return node.getProperty(_key);
   }
 
+  static String getSelectedUri(UriBasedDirective node) {
+    return node.getProperty(_uriKey);
+  }
+
   static void readMetadata(AstBinaryReader reader, Directive node) {
     var lazy = get(node);
     if (lazy != null && !lazy._hasMetadata) {
@@ -361,6 +388,13 @@
 
   static void setData(Directive node, LinkedNode data) {
     node.setProperty(_key, LazyDirective(data));
+    if (node is NamespaceDirective) {
+      node.setProperty(_uriKey, data.namespaceDirective_selectedUri);
+    }
+  }
+
+  static void setSelectedUri(UriBasedDirective node, String uriStr) {
+    node.setProperty(_uriKey, uriStr);
   }
 }
 
@@ -605,6 +639,7 @@
     AstBinaryReader reader,
     FunctionDeclaration node,
   ) {
+    readFunctionExpression(reader, node);
     if (reader.isLazy) {
       var lazy = get(node);
       if (!lazy._hasReturnType) {
@@ -668,7 +703,6 @@
 
   bool _hasBody = false;
   bool _hasFormalParameters = false;
-  bool _hasTypeParameters = false;
 
   LazyFunctionExpression(this.data);
 
@@ -702,19 +736,6 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    FunctionExpression node,
-  ) {
-    var lazy = get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.functionExpression_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void setData(FunctionExpression node, LinkedNode data) {
     node.setProperty(_key, LazyFunctionExpression(data));
   }
@@ -729,7 +750,6 @@
   bool _hasFormalParameters = false;
   bool _hasMetadata = false;
   bool _hasReturnType = false;
-  bool _hasTypeParameters = false;
 
   LazyFunctionTypeAlias(this.data);
 
@@ -793,21 +813,9 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    FunctionTypeAlias node,
-  ) {
-    var lazy = get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.functionTypeAlias_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void setData(FunctionTypeAlias node, LinkedNode data) {
     node.setProperty(_key, LazyFunctionTypeAlias(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
 
@@ -865,7 +873,6 @@
 
   bool _hasDocumentationComment = false;
   bool _hasFunction = false;
-  bool _hasTypeParameters = false;
 
   LazyGenericTypeAlias(this.data);
 
@@ -899,21 +906,9 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    GenericTypeAlias node,
-  ) {
-    var lazy = get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.genericTypeAlias_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void setData(GenericTypeAlias node, LinkedNode data) {
     node.setProperty(_key, LazyGenericTypeAlias(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
 
@@ -927,7 +922,6 @@
   bool _hasFormalParameters = false;
   bool _hasMetadata = false;
   bool _hasReturnType = false;
-  bool _hasTypeParameters = false;
 
   LazyMethodDeclaration(this.data);
 
@@ -1004,19 +998,6 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    MethodDeclaration node,
-  ) {
-    var lazy = get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.methodDeclaration_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void setData(MethodDeclaration node, LinkedNode data) {
     node.setProperty(_key, LazyMethodDeclaration(data));
   }
@@ -1031,7 +1012,6 @@
   bool _hasOnClause = false;
   bool _hasImplementsClause = false;
   bool _hasMembers = false;
-  bool _hasTypeParameters = false;
 
   LazyMixinDeclaration(this.data);
 
@@ -1085,7 +1065,7 @@
     MixinDeclarationImpl node,
   ) {
     var lazy = get(node);
-    if (!lazy._hasOnClause) {
+    if (lazy != null && !lazy._hasOnClause) {
       node.onClause = reader.readNode(
         lazy.data.mixinDeclaration_onClause,
       );
@@ -1093,21 +1073,9 @@
     }
   }
 
-  static void readTypeParameters(
-    AstBinaryReader reader,
-    MixinDeclarationImpl node,
-  ) {
-    var lazy = get(node);
-    if (lazy != null && !lazy._hasTypeParameters) {
-      node.typeParameters = reader.readNode(
-        lazy.data.classOrMixinDeclaration_typeParameters,
-      );
-      lazy._hasTypeParameters = true;
-    }
-  }
-
   static void setData(MixinDeclaration node, LinkedNode data) {
     node.setProperty(_key, LazyMixinDeclaration(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 989a7f4..77430ea 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
+import 'package:analyzer/dart/ast/ast.dart' show AstNode, CompilationUnit;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -20,21 +21,26 @@
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/linking_bundle_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/summary2/simply_bounded.dart';
 import 'package:analyzer/src/summary2/tokens_writer.dart';
+import 'package:analyzer/src/summary2/top_level_inference.dart';
 import 'package:analyzer/src/summary2/type_builder.dart';
 
 LinkResult link(
   AnalysisOptions analysisOptions,
   SourceFactory sourceFactory,
-  List<LinkedNodeBundle> inputs,
-  Map<Source, Map<Source, CompilationUnit>> unitMap,
+  DeclaredVariables declaredVariables,
+  List<LinkedNodeBundle> inputBundles,
+  List<LinkInputLibrary> inputLibraries,
 ) {
-  var linker = Linker(analysisOptions, sourceFactory);
-  linker.link(inputs, unitMap);
+  var linker = Linker(analysisOptions, sourceFactory, declaredVariables);
+  linker.link(inputBundles, inputLibraries);
   return LinkResult(linker.linkingBundle);
 }
 
 class Linker {
+  final DeclaredVariables declaredVariables;
+
   final Reference rootReference = Reference.root();
   LinkedElementFactory elementFactory;
 
@@ -50,7 +56,11 @@
   Dart2TypeSystem typeSystem;
   InheritanceManager2 inheritance;
 
-  Linker(AnalysisOptions analysisOptions, SourceFactory sourceFactory) {
+  Linker(
+    AnalysisOptions analysisOptions,
+    SourceFactory sourceFactory,
+    this.declaredVariables,
+  ) {
     var dynamicRef = rootReference.getChild('dart:core').getChild('dynamic');
     dynamicRef.element = DynamicElementImpl.instance;
 
@@ -73,15 +83,15 @@
     );
   }
 
-  void link(List<LinkedNodeBundle> inputs,
-      Map<Source, Map<Source, CompilationUnit>> unitMap) {
-    for (var input in inputs) {
+  void link(List<LinkedNodeBundle> inputBundles,
+      List<LinkInputLibrary> inputLibraries) {
+    for (var input in inputBundles) {
       var inputBundleContext = LinkedBundleContext(elementFactory, input);
       elementFactory.addBundle(inputBundleContext);
     }
 
-    for (var librarySource in unitMap.keys) {
-      SourceLibraryBuilder.build(this, librarySource, unitMap[librarySource]);
+    for (var inputLibrary in inputLibraries) {
+      SourceLibraryBuilder.build(this, inputLibrary);
     }
     // TODO(scheglov) do in build() ?
     elementFactory.addBundle(bundleContext);
@@ -104,11 +114,13 @@
   }
 
   void _buildOutlines() {
+    _resolveUriDirectives();
     _addExporters();
     _computeLibraryScopes();
     _addSyntheticConstructors();
     _createTypeSystem();
     _resolveTypes();
+    _createLoadLibraryFunctions();
     _performTopLevelInference();
     _resolveConstructors();
     _resolveDefaultValues();
@@ -196,6 +208,12 @@
     );
   }
 
+  void _createLoadLibraryFunctions() {
+    for (var library in builders.values) {
+      library.element.createLoadLibraryFunction(typeProvider);
+    }
+  }
+
   void _createTypeSystem() {
     var coreRef = rootReference.getChild('dart:core');
     var coreLib = elementFactory.elementOfReference(coreRef);
@@ -215,21 +233,19 @@
   }
 
   void _performTopLevelInference() {
-    for (var library in builders.values) {
-      library.performTopLevelInference();
-    }
+    TopLevelInference(this).infer();
   }
 
   void _resolveConstructors() {
-//    for (var library in builders.values) {
-//      library.resolveConstructors();
-//    }
+    for (var library in builders.values) {
+      library.resolveConstructors();
+    }
   }
 
   void _resolveDefaultValues() {
-//    for (var library in builders.values) {
-//      library.resolveDefaultValues();
-//    }
+    for (var library in builders.values) {
+      library.resolveDefaultValues();
+    }
   }
 
   void _resolveMetadata() {
@@ -239,13 +255,33 @@
   }
 
   void _resolveTypes() {
-    var nodesToBuildType = NodesToBuildType();
+    var nodesToBuildType = <AstNode>[];
     for (var library in builders.values) {
       library.resolveTypes(nodesToBuildType);
     }
-//    computeSimplyBounded(bundleContext, builders.values);
-    TypeBuilder(linkingBundleContext).build(nodesToBuildType);
+    computeSimplyBounded(bundleContext, builders.values);
+    TypeBuilder(typeSystem).build(nodesToBuildType);
   }
+
+  void _resolveUriDirectives() {
+    for (var library in builders.values) {
+      library.resolveUriDirectives();
+    }
+  }
+}
+
+class LinkInputLibrary {
+  final Source source;
+  final List<LinkInputUnit> units;
+
+  LinkInputLibrary(this.source, this.units);
+}
+
+class LinkInputUnit {
+  final Source source;
+  final CompilationUnit unit;
+
+  LinkInputUnit(this.source, this.unit);
 }
 
 class LinkResult {
diff --git a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
index 88f8655..bb079ee 100644
--- a/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_bundle_context.dart
@@ -2,14 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -45,25 +41,29 @@
   LinkedBundleContext.forAst(this.elementFactory, this._references)
       : _bundle = null;
 
-  LinkedLibraryContext addLinkingLibrary(String uriStr,
-      LinkedNodeLibraryBuilder data, Map<String, CompilationUnit> unitMap) {
+  LinkedLibraryContext addLinkingLibrary(
+    String uriStr,
+    LinkedNodeLibraryBuilder data,
+    LinkInputLibrary inputLibrary,
+  ) {
     var uriStr = data.uriStr;
     var libraryContext = LinkedLibraryContext(uriStr, this, data);
     libraryMap[uriStr] = libraryContext;
 
-    var uriUriStrList = unitMap.keys.toList();
-    for (var unitIndex = 0; unitIndex < uriUriStrList.length; ++unitIndex) {
-      var unitUriStr = uriUriStrList[unitIndex];
-      var unit = unitMap[unitUriStr];
-      var unitContext = LinkedUnitContext(
-        this,
-        libraryContext,
-        unitIndex,
-        unitUriStr,
-        null,
-        unit: unit,
+    var unitIndex = 0;
+    for (var inputUnit in inputLibrary.units) {
+      var source = inputUnit.source;
+      var unitUriStr = source != null ? '${source.uri}' : '';
+      libraryContext.units.add(
+        LinkedUnitContext(
+          this,
+          libraryContext,
+          unitIndex++,
+          unitUriStr,
+          null,
+          unit: inputUnit.unit,
+        ),
       );
-      libraryContext.units.add(unitContext);
     }
     return libraryContext;
   }
@@ -82,52 +82,6 @@
     return result;
   }
 
-  InterfaceType getInterfaceType(LinkedNodeType linkedType) {
-    var type = getType(linkedType);
-    if (type is InterfaceType && !type.element.isEnum) {
-      return type;
-    }
-    return null;
-  }
-
-  DartType getType(LinkedNodeType linkedType) {
-    var kind = linkedType.kind;
-    if (kind == LinkedNodeTypeKind.dynamic_) {
-      return DynamicTypeImpl.instance;
-    } else if (kind == LinkedNodeTypeKind.genericTypeAlias) {
-      var reference = referenceOfIndex(linkedType.genericTypeAliasReference);
-      return GenericTypeAliasElementImpl.typeAfterSubstitution(
-        elementFactory.elementOfReference(reference),
-        linkedType.genericTypeAliasTypeArguments.map(getType).toList(),
-      );
-    } else if (kind == LinkedNodeTypeKind.function) {
-      var returnType = getType(linkedType.functionReturnType);
-      var formalParameters = linkedType.functionFormalParameters.map((p) {
-        return ParameterElementImpl.synthetic(
-          p.name,
-          getType(p.type),
-          _formalParameterKind(p.kind),
-        );
-      }).toList();
-      return FunctionElementImpl.synthetic(formalParameters, returnType).type;
-    } else if (kind == LinkedNodeTypeKind.interface) {
-      var reference = referenceOfIndex(linkedType.interfaceClass);
-      Element element = elementFactory.elementOfReference(reference);
-      return InterfaceTypeImpl.explicit(
-        element,
-        linkedType.interfaceTypeArguments.map(getType).toList(),
-      );
-    } else if (kind == LinkedNodeTypeKind.typeParameter) {
-      var reference = referenceOfIndex(linkedType.typeParameterParameter);
-      Element element = elementFactory.elementOfReference(reference);
-      return TypeParameterTypeImpl(element);
-    } else if (kind == LinkedNodeTypeKind.void_) {
-      return VoidTypeImpl.instance;
-    } else {
-      throw UnimplementedError('$kind');
-    }
-  }
-
   Reference referenceOfIndex(int index) {
     var reference = _references[index];
     if (reference != null) return reference;
@@ -147,16 +101,6 @@
 
     return reference;
   }
-
-  ParameterKind _formalParameterKind(LinkedNodeFormalParameterKind kind) {
-    if (kind == LinkedNodeFormalParameterKind.optionalNamed) {
-      return ParameterKind.NAMED;
-    }
-    if (kind == LinkedNodeFormalParameterKind.optionalPositional) {
-      return ParameterKind.POSITIONAL;
-    }
-    return ParameterKind.REQUIRED;
-  }
 }
 
 class LinkedLibraryContext {
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index e16238f..41b8880 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/core_types.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -19,9 +20,15 @@
   final Reference rootReference;
   final Map<String, LinkedLibraryContext> libraryMap = {};
 
+  CoreTypes _coreTypes;
+
   LinkedElementFactory(
       this.analysisContext, this.analysisSession, this.rootReference);
 
+  CoreTypes get coreTypes {
+    return _coreTypes ??= CoreTypes(this);
+  }
+
   void addBundle(LinkedBundleContext context) {
     libraryMap.addAll(context.libraryMap);
   }
@@ -152,11 +159,6 @@
       return _typeAlias(unit, reference);
     }
 
-    if (parentName == '@typeParameter') {
-      var enclosing = elementOfReference(parent2) as TypeParameterizedElement;
-      return _typeParameter(enclosing, reference);
-    }
-
     if (parentName == '@unit') {
       elementOfReference(parent2);
       // Creating a library fills all its units.
@@ -248,7 +250,14 @@
 
     libraryElement.definingCompilationUnit = units[0];
     libraryElement.parts = units.skip(1).toList();
-    return reference.element = libraryElement;
+    reference.element = libraryElement;
+
+    var typeProvider = elementFactory.analysisContext.typeProvider;
+    if (typeProvider != null) {
+      libraryElement.createLoadLibraryFunction(typeProvider);
+    }
+
+    return libraryElement;
   }
 
   EnumElementImpl _enum(CompilationUnitElementImpl unit, Reference reference) {
@@ -296,14 +305,6 @@
     return reference.element;
   }
 
-  Element _typeParameter(
-      TypeParameterizedElement enclosing, Reference reference) {
-    enclosing.typeParameters;
-    // Requesting type parameters sets elements for all their references.
-    assert(reference.element != null);
-    return reference.element;
-  }
-
   /// Index nodes for which we choose to create elements individually,
   /// for example [ClassDeclaration], so that its [Reference] has the node,
   /// and we can call the [ClassElementImpl] constructor.
@@ -314,20 +315,33 @@
   ) {
     var classRef = unitRef.getChild('@class');
     var enumRef = unitRef.getChild('@enum');
+    var functionRef = unitRef.getChild('@function');
     var typeAliasRef = unitRef.getChild('@typeAlias');
+    var variableRef = unitRef.getChild('@variable');
     for (var declaration in unitNode.declarations) {
       if (declaration is ClassDeclaration) {
         var name = declaration.name.name;
         classRef.getChild(name).node2 = declaration;
+      } else if (declaration is ClassTypeAlias) {
+        var name = declaration.name.name;
+        classRef.getChild(name).node2 = declaration;
       } else if (declaration is EnumDeclaration) {
         var name = declaration.name.name;
         enumRef.getChild(name).node2 = declaration;
+      } else if (declaration is FunctionDeclaration) {
+        var name = declaration.name.name;
+        functionRef.getChild(name).node2 = declaration;
       } else if (declaration is FunctionTypeAlias) {
         var name = declaration.name.name;
         typeAliasRef.getChild(name).node2 = declaration;
       } else if (declaration is GenericTypeAlias) {
         var name = declaration.name.name;
         typeAliasRef.getChild(name).node2 = declaration;
+      } else if (declaration is TopLevelVariableDeclaration) {
+        for (var variable in declaration.variables.variables) {
+          var name = variable.name.name;
+          variableRef.getChild(name).node2 = declaration;
+        }
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 0451be4..7c044db 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/ast_binary_reader.dart';
 import 'package:analyzer/src/summary2/lazy_ast.dart';
@@ -27,6 +28,17 @@
   CompilationUnit _unit;
   bool _hasDirectivesRead = false;
 
+  /// Mapping from identifiers to real or synthetic type parameters.
+  ///
+  /// Real type parameters have corresponding [TypeParameter] nodes, and are
+  /// referenced from other AST nodes.
+  ///
+  /// Synthetic type parameters are added when [readType] begins reading a
+  /// [FunctionType], and removed when reading is done.
+  final Map<int, TypeParameterElement> _typeParameters = {};
+
+  int _nextSyntheticTypeParameterId = 0x10000;
+
   LinkedUnitContext(this.bundleContext, this.libraryContext,
       this.indexInLibrary, this.uriStr, this.data,
       {CompilationUnit unit})
@@ -59,11 +71,20 @@
     return _unit;
   }
 
-  /// Return the absolute URI referenced in the [directive].
-  Uri directiveUri(Uri libraryUri, UriBasedDirective directive) {
-    var relativeUriStr = directive.uri.stringValue;
-    var relativeUri = Uri.parse(relativeUriStr);
-    return resolveRelativeUri(libraryUri, relativeUri);
+  /// Every [TypeParameter] node has [TypeParameterElement], which is created
+  /// during reading of this node. All type parameter nodes are read before
+  /// any nodes that reference them (bounds are read lazily later).
+  void addTypeParameter(int id, TypeParameter node) {
+    var element = TypeParameterElementImpl.forLinkedNode(null, null, node);
+    _typeParameters[id] = element;
+    node.name.staticElement = element;
+  }
+
+  /// Return the [LibraryElement] referenced in the [node].
+  LibraryElement directiveLibrary(UriBasedDirective node) {
+    var uriStr = LazyDirective.getSelectedUri(node);
+    if (uriStr == null || uriStr.isEmpty) return null;
+    return bundleContext.elementFactory.libraryOfUri(uriStr);
   }
 
   int getCodeLength(AstNode node) {
@@ -116,6 +137,18 @@
     return '';
   }
 
+  List<ConstructorInitializer> getConstructorInitializers(
+    ConstructorDeclaration node,
+  ) {
+    LazyConstructorDeclaration.readInitializers(_astReader, node);
+    return node.initializers;
+  }
+
+  ConstructorName getConstructorRedirected(ConstructorDeclaration node) {
+    LazyConstructorDeclaration.readRedirectedConstructor(_astReader, node);
+    return node.redirectedConstructor;
+  }
+
   Iterable<ConstructorDeclaration> getConstructors(AstNode node) sync* {
     if (node is ClassOrMixinDeclaration) {
       var members = _getClassOrMixinMembers(node);
@@ -257,7 +290,20 @@
   }
 
   InterfaceType getInterfaceType(LinkedNodeType linkedType) {
-    return bundleContext.getInterfaceType(linkedType);
+    var type = readType(linkedType);
+    if (type is InterfaceType && !type.element.isEnum) {
+      return type;
+    }
+    return null;
+  }
+
+  Comment getLibraryDocumentationComment(CompilationUnit unit) {
+    for (var directive in unit.directives) {
+      if (directive is LibraryDirective) {
+        return directive.documentationComment;
+      }
+    }
+    return null;
   }
 
   List<Annotation> getLibraryMetadata(CompilationUnit unit) {
@@ -448,10 +494,8 @@
 
   TypeParameterList getTypeParameters2(AstNode node) {
     if (node is ClassDeclaration) {
-      LazyClassDeclaration.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else if (node is ClassTypeAlias) {
-      LazyClassTypeAlias.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else if (node is ConstructorDeclaration) {
       return null;
@@ -459,21 +503,16 @@
       LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
       return getTypeParameters2(node.functionExpression);
     } else if (node is FunctionExpression) {
-      LazyFunctionExpression.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else if (node is FunctionTypeAlias) {
-      LazyFunctionTypeAlias.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else if (node is GenericFunctionType) {
       return node.typeParameters;
     } else if (node is GenericTypeAlias) {
-      LazyGenericTypeAlias.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else if (node is MethodDeclaration) {
-      LazyMethodDeclaration.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else if (node is MixinDeclaration) {
-      LazyMixinDeclaration.readTypeParameters(_astReader, node);
       return node.typeParameters;
     } else {
       throw UnimplementedError('${node.runtimeType}');
@@ -500,6 +539,30 @@
     }
   }
 
+  bool hasImplicitReturnType(AstNode node) {
+    if (node is MethodDeclaration) {
+      return node.returnType == null;
+    }
+    return false;
+  }
+
+  bool hasImplicitType(AstNode node) {
+    if (node is VariableDeclaration) {
+      VariableDeclarationList parent = node.parent;
+      return parent.type == null;
+    } else if (node is SimpleFormalParameter) {
+      return node.type == null;
+    }
+    return false;
+  }
+
+  bool hasOverrideInferenceDone(AstNode node) {
+    // Only nodes in the libraries being linked might be not inferred yet.
+    if (_astReader.isLazy) return true;
+
+    return LazyAst.hasOverrideInferenceDone(node);
+  }
+
   bool isAbstract(AstNode node) {
     if (node is ClassDeclaration) {
       return node.abstractKeyword != null;
@@ -551,8 +614,10 @@
     return isConstKeyword(node.variableDeclarationList_keyword);
   }
 
-  bool isCovariantField(AstNode node) {
-    if (node is VariableDeclaration) {
+  bool isCovariant(AstNode node) {
+    if (node is FormalParameter) {
+      return node.covariantKeyword != null;
+    } else if (node is VariableDeclaration) {
       var parent2 = node.parent.parent;
       return parent2 is FieldDeclaration && parent2.covariantKeyword != null;
     }
@@ -627,6 +692,10 @@
     }
   }
 
+  bool isSimplyBounded(AstNode node) {
+    return LazyAst.isSimplyBounded(node);
+  }
+
   bool isStatic(AstNode node) {
     if (node is FunctionDeclaration) {
       return true;
@@ -659,16 +728,86 @@
     return _astReader.readNode(linkedNode);
   }
 
-  void setReturnType(LinkedNodeBuilder node, DartType type) {
-    throw UnimplementedError();
-//    var typeData = bundleContext.linking.writeType(type);
-//    node.functionDeclaration_returnType2 = typeData;
+  DartType readType(LinkedNodeType linkedType) {
+    if (linkedType == null) return null;
+
+    var kind = linkedType.kind;
+    if (kind == LinkedNodeTypeKind.bottom) {
+      return BottomTypeImpl.instance;
+    } else if (kind == LinkedNodeTypeKind.dynamic_) {
+      return DynamicTypeImpl.instance;
+    } else if (kind == LinkedNodeTypeKind.function) {
+      var typeParameterDataList = linkedType.functionTypeParameters;
+
+      var typeParameters = <TypeParameterElement>[];
+      for (var typeParameterData in typeParameterDataList) {
+        var element = TypeParameterElementImpl(typeParameterData.name, -1);
+        typeParameters.add(element);
+        _typeParameters[_nextSyntheticTypeParameterId++] = element;
+      }
+
+      var returnType = readType(linkedType.functionReturnType);
+      var formalParameters = linkedType.functionFormalParameters.map((p) {
+        var type = readType(p.type);
+        var kind = _formalParameterKind(p.kind);
+        return ParameterElementImpl.synthetic(p.name, type, kind);
+      }).toList();
+
+      for (var i = 0; i < typeParameterDataList.length; ++i) {
+        _typeParameters.remove(--_nextSyntheticTypeParameterId);
+      }
+
+      return FunctionTypeImpl.synthetic(
+        returnType,
+        typeParameters,
+        formalParameters,
+      );
+    } else if (kind == LinkedNodeTypeKind.interface) {
+      var element = bundleContext.elementOfIndex(linkedType.interfaceClass);
+      return InterfaceTypeImpl.explicit(
+        element,
+        linkedType.interfaceTypeArguments.map(readType).toList(),
+      );
+    } else if (kind == LinkedNodeTypeKind.typeParameter) {
+      var id = linkedType.typeParameterId;
+      var element = _typeParameters[id];
+      assert(element != null);
+      return TypeParameterTypeImpl(element);
+    } else if (kind == LinkedNodeTypeKind.void_) {
+      return VoidTypeImpl.instance;
+    } else {
+      throw UnimplementedError('$kind');
+    }
   }
 
-  void setVariableType(LinkedNodeBuilder node, DartType type) {
-    throw UnimplementedError();
-//    var typeData = bundleContext.linking.writeType(type);
-//    node.simpleFormalParameter_type2 = typeData;
+  void setOverrideInferenceDone(AstNode node) {
+    assert(!_astReader.isLazy);
+    LazyAst.setOverrideInferenceDone(node);
+  }
+
+  void setReturnType(AstNode node, DartType type) {
+    LazyAst.setReturnType(node, type);
+  }
+
+  void setVariableType(AstNode node, DartType type) {
+    LazyAst.setType(node, type);
+  }
+
+  bool shouldBeConstFieldElement(AstNode node) {
+    if (node is VariableDeclaration) {
+      VariableDeclarationList variableList = node.parent;
+      if (variableList.isConst) return true;
+
+      if (variableList.isFinal) {
+        ClassDeclaration classDeclaration = variableList.parent.parent;
+        for (var member in classDeclaration.members) {
+          if (member is ConstructorDeclaration && member.constKeyword != null) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
   }
 
   Iterable<VariableDeclaration> topLevelVariables(CompilationUnit unit) sync* {
@@ -681,6 +820,16 @@
     }
   }
 
+  ParameterKind _formalParameterKind(LinkedNodeFormalParameterKind kind) {
+    if (kind == LinkedNodeFormalParameterKind.optionalNamed) {
+      return ParameterKind.NAMED;
+    }
+    if (kind == LinkedNodeFormalParameterKind.optionalPositional) {
+      return ParameterKind.POSITIONAL;
+    }
+    return ParameterKind.REQUIRED;
+  }
+
   List<ClassMember> _getClassOrMixinMembers(ClassOrMixinDeclaration node) {
     if (node is ClassDeclaration) {
       LazyClassDeclaration.readMembers(_astReader, node);
diff --git a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
index 6a9fc44..06d86ce 100644
--- a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
@@ -5,7 +5,9 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -28,8 +30,35 @@
     name: [''],
   );
 
+  final Map<TypeParameterElement, int> _typeParameters = Map.identity();
+  int _nextTypeParameterId = 1;
+  int _nextSyntheticTypeParameterId = 0x10000;
+
   LinkingBundleContext(this.dynamicReference);
 
+  void addTypeParameter(TypeParameterElement element) {
+    _typeParameters[element] = _nextTypeParameterId++;
+  }
+
+  int idOfTypeParameter(TypeParameterElement element) {
+    return _typeParameters[element];
+  }
+
+  int indexOfElement(Element element) {
+    if (element == null) return 0;
+
+    if (identical(element, DynamicElementImpl.instance)) {
+      return indexOfReference(dynamicReference);
+    }
+
+    if (element is Member) {
+      element = (element as Member).baseElement;
+    }
+
+    var reference = (element as ElementImpl).reference;
+    return indexOfReference(reference);
+  }
+
   int indexOfReference(Reference reference) {
     if (reference == null) return 0;
     if (reference.parent == null) return 0;
@@ -56,29 +85,18 @@
         kind: LinkedNodeTypeKind.dynamic_,
       );
     } else if (type is FunctionType) {
-      return LinkedNodeTypeBuilder(
-        kind: LinkedNodeTypeKind.function,
-        functionFormalParameters: type.parameters
-            .map((p) => LinkedNodeTypeFormalParameterBuilder(
-                  // ignore: deprecated_member_use_from_same_package
-                  kind: _formalParameterKind(p.parameterKind),
-                  name: p.name,
-                  type: writeType(p.type),
-                ))
-            .toList(),
-        functionReturnType: writeType(type.returnType),
-        functionTypeParameters: _getReferences(type.typeParameters),
-      );
+      return _writeFunctionType(type);
     } else if (type is InterfaceType) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.interface,
-        interfaceClass: _getReferenceIndex(type.element),
+        interfaceClass: indexOfElement(type.element),
         interfaceTypeArguments: type.typeArguments.map(writeType).toList(),
       );
     } else if (type is TypeParameterType) {
+      TypeParameterElementImpl element = type.element;
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.typeParameter,
-        typeParameterParameter: _getReferenceIndex(type.element),
+        typeParameterId: _typeParameters[element],
       );
     } else if (type is VoidType) {
       return LinkedNodeTypeBuilder(
@@ -89,7 +107,9 @@
     }
   }
 
-  LinkedNodeFormalParameterKind _formalParameterKind(ParameterKind kind) {
+  LinkedNodeFormalParameterKind _formalParameterKind(ParameterElement p) {
+    // ignore: deprecated_member_use_from_same_package
+    var kind = p.parameterKind;
     if (kind == ParameterKind.NAMED) {
       return LinkedNodeFormalParameterKind.optionalNamed;
     }
@@ -99,19 +119,57 @@
     return LinkedNodeFormalParameterKind.required;
   }
 
-  int _getReferenceIndex(Element element) {
-    if (element == null) return 0;
+  FunctionType _toSyntheticFunctionType(FunctionType type) {
+    var typeParameters = type.typeFormals;
 
-    var reference = (element as ElementImpl).reference;
-    return indexOfReference(reference);
+    if (typeParameters.isEmpty) return type;
+
+    var onlySyntheticTypeParameters = typeParameters.every((e) {
+      return e is TypeParameterElementImpl && e.linkedNode == null;
+    });
+    if (onlySyntheticTypeParameters) return type;
+
+    var parameters = getFreshTypeParameters(typeParameters);
+    return parameters.applyToFunctionType(type);
   }
 
-  List<int> _getReferences(List<Element> elements) {
-    var result = List<int>(elements.length);
-    for (var i = 0; i < elements.length; ++i) {
-      var element = elements[i];
-      result[i] = _getReferenceIndex(element);
+  LinkedNodeTypeBuilder _writeFunctionType(FunctionType type) {
+    type = _toSyntheticFunctionType(type);
+
+    var typeParameterBuilders = <LinkedNodeTypeTypeParameterBuilder>[];
+
+    var typeParameters = type.typeFormals;
+    for (var i = 0; i < typeParameters.length; ++i) {
+      var typeParameter = typeParameters[i];
+      _typeParameters[typeParameter] = _nextSyntheticTypeParameterId++;
+      typeParameterBuilders.add(
+        LinkedNodeTypeTypeParameterBuilder(name: typeParameter.name),
+      );
     }
+
+    for (var i = 0; i < typeParameters.length; ++i) {
+      var typeParameter = typeParameters[i];
+      typeParameterBuilders[i].bound = writeType(typeParameter.bound);
+    }
+
+    var result = LinkedNodeTypeBuilder(
+      kind: LinkedNodeTypeKind.function,
+      functionFormalParameters: type.parameters
+          .map((p) => LinkedNodeTypeFormalParameterBuilder(
+                kind: _formalParameterKind(p),
+                name: p.name,
+                type: writeType(p.type),
+              ))
+          .toList(),
+      functionReturnType: writeType(type.returnType),
+      functionTypeParameters: typeParameterBuilders,
+    );
+
+    for (var typeParameter in typeParameters) {
+      _typeParameters.remove(typeParameter);
+      --_nextSyntheticTypeParameterId;
+    }
+
     return result;
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/linking_node_scope.dart b/pkg/analyzer/lib/src/summary2/linking_node_scope.dart
new file mode 100644
index 0000000..7617125
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/linking_node_scope.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+/// This class provides access to [Scope]s corresponding to [AstNode]s.
+class LinkingNodeContext {
+  static const _key = 'linkingNodeContext';
+
+  final Scope scope;
+
+  LinkingNodeContext(AstNode node, this.scope) {
+    node.setProperty(_key, this);
+  }
+
+  static LinkingNodeContext get(AstNode node) {
+    LinkingNodeContext context = node.getProperty(_key);
+    if (context == null) {
+      throw StateError('No context for: $node');
+    }
+    return context;
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/reference.dart b/pkg/analyzer/lib/src/summary2/reference.dart
index 7f8af39..989ab17 100644
--- a/pkg/analyzer/lib/src/summary2/reference.dart
+++ b/pkg/analyzer/lib/src/summary2/reference.dart
@@ -71,8 +71,6 @@
 
   bool get isTypeAlias => parent != null && parent.name == '@typeAlias';
 
-  bool get isTypeParameter => parent != null && parent.name == '@typeParameter';
-
   int get numOfChildren => _children != null ? _children.length : 0;
 
   /// Return the child with the given name, or `null` if does not exist.
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 4d27523e..8601a46 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -10,29 +10,9 @@
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
+import 'package:analyzer/src/summary2/linking_bundle_context.dart';
+import 'package:analyzer/src/summary2/linking_node_scope.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:analyzer/src/summary2/type_builder.dart';
-
-// TODO(scheglov) This class is not used, not [get] yet.
-class LinkingNodeContext {
-  static const _key = 'linkingNodeContext';
-
-  final Scope scope;
-
-  LinkingNodeContext(this.scope);
-
-  static LinkingNodeContext get(AstNode node) {
-    LinkingNodeContext context = node.getProperty(_key);
-    if (context == null) {
-      throw StateError('No context for: $node');
-    }
-    return context;
-  }
-
-  static void set(AstNode node, LinkingNodeContext context) {
-    node.setProperty(_key, context);
-  }
-}
 
 //class ReferenceResolver {
 //  final LinkingBundleContext linkingBundleContext;
@@ -530,7 +510,8 @@
 /// the type is set, otherwise we keep it empty, so we will attempt to infer
 /// it later).
 class ReferenceResolver extends ThrowingAstVisitor<void> {
-  final NodesToBuildType nodesToBuildType;
+  final LinkingBundleContext linkingContext;
+  final List<AstNode> nodesToBuildType;
   final LinkedElementFactory elementFactory;
   final LibraryElement _libraryElement;
 
@@ -538,6 +519,7 @@
   Scope scope;
 
   ReferenceResolver(
+    this.linkingContext,
     this.nodesToBuildType,
     this.elementFactory,
     this._libraryElement,
@@ -556,6 +538,7 @@
     var name = node.name.name;
     reference = reference.getChild('@class').getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = ClassElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -564,7 +547,7 @@
     node.name.staticElement = element;
     scope = new TypeParameterScope(scope, element);
     scope = new ClassScope(scope, element);
-    LinkingNodeContext.set(node, LinkingNodeContext(scope));
+    LinkingNodeContext(node, scope);
 
     node.typeParameters?.accept(this);
     node.extendsClause?.accept(this);
@@ -584,6 +567,7 @@
     var name = node.name.name;
     reference = reference.getChild('@class').getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = ClassElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -592,7 +576,7 @@
     node.name.staticElement = element;
     scope = new TypeParameterScope(scope, element);
     scope = new ClassScope(scope, element);
-    LinkingNodeContext.set(node, LinkingNodeContext(scope));
+    LinkingNodeContext(node, scope);
 
     node.typeParameters?.accept(this);
     node.superclass?.accept(this);
@@ -605,13 +589,32 @@
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
-    LinkingNodeContext.set(node, LinkingNodeContext(scope));
+    LinkingNodeContext(node, scope);
     node.declarations.accept(this);
   }
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var name = node.name?.name ?? '';
+    reference = reference.getChild('@constructor').getChild(name);
+
+    var element = ConstructorElementImpl.forLinkedNode(
+      outerReference.element,
+      reference,
+      node,
+    );
+
+    var functionScope = FunctionScope(scope, element);
+    functionScope.defineParameters();
+    LinkingNodeContext(node, functionScope);
+
     node.parameters?.accept(this);
+
+    scope = outerScope;
+    reference = outerReference;
   }
 
   @override
@@ -639,7 +642,7 @@
   void visitFieldFormalParameter(FieldFormalParameter node) {
     node.type?.accept(this);
     node.parameters?.accept(this);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
   }
 
   @override
@@ -655,6 +658,7 @@
     var name = node.name.name;
     reference = reference.getChild('@function').getChild(name);
 
+    _createTypeParameterElements(node.functionExpression.typeParameters);
     var element = FunctionElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -662,11 +666,11 @@
     );
     node.name.staticElement = element;
     scope = new FunctionScope(scope, element);
-    LinkingNodeContext.set(node, LinkingNodeContext(scope));
+    LinkingNodeContext(node, scope);
 
     node.returnType?.accept(this);
     node.functionExpression.accept(this);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
 
     scope = outerScope;
     reference = outerReference;
@@ -686,6 +690,7 @@
     var name = node.name.name;
     reference = reference.getChild('@typeAlias').getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = GenericTypeAliasElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -697,7 +702,7 @@
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
 
     scope = outerScope;
     reference = outerReference;
@@ -709,7 +714,7 @@
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
 
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
   }
 
   @override
@@ -720,6 +725,7 @@
     var name = '${outerReference.numOfChildren}';
     reference = reference.getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = GenericFunctionTypeElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -730,8 +736,8 @@
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
-    nodesToBuildType.addTypeAnnotation(node);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
+    nodesToBuildType.add(node);
 
     scope = outerScope;
     reference = outerReference;
@@ -745,6 +751,7 @@
     var name = node.name.name;
     reference = reference.getChild('@typeAlias').getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = GenericTypeAliasElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -773,6 +780,7 @@
     var name = node.name.name;
     reference = reference.getChild('@method').getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = MethodElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -780,12 +788,12 @@
     );
     node.name.staticElement = element;
     scope = new FunctionScope(scope, element);
-    LinkingNodeContext.set(node, LinkingNodeContext(scope));
+    LinkingNodeContext(node, scope);
 
     node.returnType?.accept(this);
     node.parameters?.accept(this);
     node.typeParameters?.accept(this);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
 
     scope = outerScope;
     reference = outerReference;
@@ -799,6 +807,7 @@
     var name = node.name.name;
     reference = reference.getChild('@class').getChild(name);
 
+    _createTypeParameterElements(node.typeParameters);
     var element = ClassElementImpl.forLinkedNode(
       outerReference.element,
       reference,
@@ -825,7 +834,7 @@
   @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     node.type?.accept(this);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
   }
 
   @override
@@ -857,7 +866,7 @@
 
     node.typeArguments?.accept(this);
 
-    nodesToBuildType.addTypeAnnotation(node);
+    nodesToBuildType.add(node);
   }
 
   @override
@@ -873,11 +882,25 @@
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     node.type?.accept(this);
-    nodesToBuildType.addDeclaration(node);
+    nodesToBuildType.add(node);
   }
 
   @override
   void visitWithClause(WithClause node) {
     node.mixinTypes.accept(this);
   }
+
+  void _createTypeParameterElement(TypeParameter node) {
+    var element = TypeParameterElementImpl.forLinkedNode(null, null, node);
+    node.name.staticElement = element;
+    linkingContext.addTypeParameter(element);
+  }
+
+  void _createTypeParameterElements(TypeParameterList typeParameterList) {
+    if (typeParameterList == null) return;
+
+    for (var typeParameter in typeParameterList.typeParameters) {
+      _createTypeParameterElement(typeParameter);
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index 13a6dc4..cac5831 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -2,16 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/summary/format.dart';
-import 'package:analyzer/src/summary/idl.dart' show LinkedNode;
-import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary/link.dart' as graph
     show DependencyWalker, Node;
 import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-import 'package:analyzer/src/summary2/type_builder.dart';
 
 /// Compute simple-boundedness for all classes and generic types aliases in
 /// the source [libraryBuilders].  There might be dependencies between them,
@@ -23,14 +21,17 @@
   var walker = SimplyBoundedDependencyWalker(bundleContext);
   var nodes = <SimplyBoundedNode>[];
   for (var libraryBuilder in libraryBuilders) {
-    var unitsRef = libraryBuilder.reference.getChild('@unit');
-    for (var unitRef in unitsRef.children) {
-      for (var classRef in unitRef.getChild('@class').children) {
-        var node = walker.getNode(classRef);
+    for (var unit in libraryBuilder.element.units) {
+      for (var element in unit.functionTypeAliases) {
+        var node = walker.getNode(element);
         nodes.add(node);
       }
-      for (var ref in unitRef.getChild('@typeAlias').children) {
-        var node = walker.getNode(ref);
+      for (var element in unit.mixins) {
+        var node = walker.getNode(element);
+        nodes.add(node);
+      }
+      for (var element in unit.types) {
+        var node = walker.getNode(element);
         nodes.add(node);
       }
     }
@@ -40,8 +41,7 @@
     if (!node.isEvaluated) {
       walker.walk(node);
     }
-    LinkedNodeBuilder builder = node._reference.node;
-    builder.simplyBoundable_isSimplyBounded = node.isSimplyBounded;
+    LazyAst.setSimplyBounded(node._node, node.isSimplyBounded);
   }
 }
 
@@ -49,7 +49,7 @@
 class SimplyBoundedDependencyWalker
     extends graph.DependencyWalker<SimplyBoundedNode> {
   final LinkedBundleContext bundleContext;
-  final Map<Reference, SimplyBoundedNode> nodeMap = {};
+  final Map<Element, SimplyBoundedNode> nodeMap = Map.identity();
 
   SimplyBoundedDependencyWalker(this.bundleContext);
 
@@ -65,31 +65,56 @@
     }
   }
 
-  SimplyBoundedNode getNode(Reference reference) {
-    var node = nodeMap[reference];
-    if (node == null) {
-      if (reference.isClass) {
-        var parameters = LinkedUnitContext.getTypeParameters(reference.node);
-        node = SimplyBoundedNode(
+  SimplyBoundedNode getNode(Element element) {
+    var graphNode = nodeMap[element];
+    if (graphNode == null) {
+      var node = (element as ElementImpl).linkedNode;
+      if (node is ClassDeclaration) {
+        var parameters = node.typeParameters?.typeParameters;
+        graphNode = SimplyBoundedNode(
           this,
-          reference,
-          parameters ?? const <LinkedNode>[],
-          const <LinkedNode>[],
+          node,
+          parameters ?? const <TypeParameter>[],
+          const <TypeAnnotation>[],
         );
-      } else if (reference.isTypeAlias) {
-        var parameters = LinkedUnitContext.getTypeParameters(reference.node);
-        node = SimplyBoundedNode(
+      } else if (node is ClassTypeAlias) {
+        var parameters = node.typeParameters?.typeParameters;
+        graphNode = SimplyBoundedNode(
           this,
-          reference,
-          parameters ?? const <LinkedNode>[],
-          _collectTypedefRhsTypes(reference.node),
+          node,
+          parameters ?? const <TypeParameter>[],
+          const <TypeAnnotation>[],
+        );
+      } else if (node is FunctionTypeAlias) {
+        var parameters = node.typeParameters?.typeParameters;
+        graphNode = SimplyBoundedNode(
+          this,
+          node,
+          parameters ?? const <TypeParameter>[],
+          _collectTypedefRhsTypes(node),
+        );
+      } else if (node is GenericTypeAlias) {
+        var parameters = node.typeParameters?.typeParameters;
+        graphNode = SimplyBoundedNode(
+          this,
+          node,
+          parameters ?? const <TypeParameter>[],
+          _collectTypedefRhsTypes(node),
+        );
+      } else if (node is MixinDeclaration) {
+        var parameters = node.typeParameters?.typeParameters;
+        graphNode = SimplyBoundedNode(
+          this,
+          node,
+          parameters ?? const <TypeParameter>[],
+          const <TypeAnnotation>[],
         );
       } else {
-        throw UnimplementedError('$reference');
+        throw UnimplementedError('(${node.runtimeType}) $node');
       }
-      nodeMap[reference] = node;
+      nodeMap[element] = graphNode;
     }
-    return node;
+    return graphNode;
   }
 
   /// Collects all the type references appearing on the "right hand side" of a
@@ -100,33 +125,19 @@
   /// declaration, the type that *would* appear after the "=" if it were
   /// converted to a new style typedef declaration.  This means that type
   /// parameter declarations and their bounds are not included.
-  static List<LinkedNode> _collectTypedefRhsTypes(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.functionTypeAlias) {
-      var types = <LinkedNode>[];
-      _TypeCollector.addType(
-        types,
-        node.functionTypeAlias_returnType,
-      );
-      _TypeCollector.visitParameters(
-        types,
-        node.functionTypeAlias_formalParameters,
-      );
-      return types;
-    } else if (kind == LinkedNodeKind.genericTypeAlias) {
-      var types = <LinkedNode>[];
-      var function = node.genericTypeAlias_functionType;
-      _TypeCollector.addType(
-        types,
-        function.genericFunctionType_returnType,
-      );
-      _TypeCollector.visitParameters(
-        types,
-        function.genericFunctionType_formalParameters,
-      );
-      return types;
+  static List<TypeAnnotation> _collectTypedefRhsTypes(AstNode node) {
+    if (node is FunctionTypeAlias) {
+      var collector = _TypeCollector();
+      collector.addType(node.returnType);
+      collector.visitParameters(node.parameters);
+      return collector.types;
+    } else if (node is GenericTypeAlias) {
+      var collector = _TypeCollector();
+      collector.addType(node.functionType.returnType);
+      collector.visitParameters(node.functionType.parameters);
+      return collector.types;
     } else {
-      throw StateError('$kind');
+      throw StateError('(${node.runtimeType}) $node');
     }
   }
 }
@@ -135,14 +146,14 @@
 /// whether types are simply bounded.
 class SimplyBoundedNode extends graph.Node<SimplyBoundedNode> {
   final SimplyBoundedDependencyWalker _walker;
-  final Reference _reference;
+  final AstNode _node;
 
   /// The type parameters of the type whose simple-boundedness we check.
-  final List<LinkedNode> _typeParameters;
+  final List<TypeParameter> _typeParameters;
 
   /// If the type whose simple-boundedness we check is a typedef, the types
   /// appearing in its "right hand side".
-  final List<LinkedNode> _rhsTypes;
+  final List<TypeAnnotation> _rhsTypes;
 
   @override
   bool isEvaluated = false;
@@ -159,7 +170,7 @@
 
   SimplyBoundedNode(
     this._walker,
-    this._reference,
+    this._node,
     this._typeParameters,
     this._rhsTypes,
   );
@@ -168,7 +179,7 @@
   List<SimplyBoundedNode> computeDependencies() {
     var dependencies = <SimplyBoundedNode>[];
     for (var typeParameter in _typeParameters) {
-      var bound = typeParameter.typeParameter_bound;
+      var bound = typeParameter.bound;
       if (bound != null) {
         if (!_visitType(dependencies, bound, false)) {
           // Note: we might consider setting isEvaluated=true here to prevent an
@@ -223,35 +234,32 @@
   /// If `false` is returned, further visiting is short-circuited.
   ///
   /// Otherwise `true` is returned.
-  bool _visitType(List<SimplyBoundedNode> dependencies, LinkedNode type,
+  bool _visitType(List<SimplyBoundedNode> dependencies, TypeAnnotation type,
       bool allowTypeParameters) {
     if (type == null) return true;
 
-    if (type.kind == LinkedNodeKind.typeName) {
-      var element = TypeBuilder.typeNameElementIndex(type.typeName_name);
-      var reference = _walker.bundleContext.referenceOfIndex(element);
+    if (type is TypeName) {
+      var element = type.name.staticElement;
 
-      if (reference.isTypeParameter) {
+      if (element is TypeParameterElement) {
         return allowTypeParameters;
       }
 
-      var arguments = type.typeName_typeArguments;
+      var arguments = type.typeArguments;
       if (arguments == null) {
-        var graphNode = _walker.nodeMap[reference];
+        var graphNode = _walker.nodeMap[element];
 
         // If not a node being linked, then the flag is already set.
         if (graphNode == null) {
-          if (reference.isClass || reference.isTypeAlias) {
-            var elementFactory = _walker.bundleContext.elementFactory;
-            var node = elementFactory.nodeOfReference(reference);
-            return node.simplyBoundable_isSimplyBounded;
+          if (element is TypeParameterizedElement) {
+            return element.isSimplyBounded;
           }
           return true;
         }
 
         dependencies.add(graphNode);
       } else {
-        for (var argument in arguments.typeArgumentList_arguments) {
+        for (var argument in arguments.arguments) {
           if (!_visitType(dependencies, argument, allowTypeParameters)) {
             return false;
           }
@@ -260,14 +268,11 @@
       return true;
     }
 
-    if (type.kind == LinkedNodeKind.genericFunctionType) {
-      var types = <LinkedNode>[];
-      _TypeCollector.addType(types, type.genericFunctionType_returnType);
-      _TypeCollector.visitParameters(
-        types,
-        type.genericFunctionType_formalParameters,
-      );
-      for (var type in types) {
+    if (type is GenericFunctionType) {
+      var collector = _TypeCollector();
+      collector.addType(type.returnType);
+      collector.visitParameters(type.parameters);
+      for (var type in collector.types) {
         if (!_visitType(dependencies, type, allowTypeParameters)) {
           return false;
         }
@@ -275,39 +280,36 @@
       return true;
     }
 
-    throw UnimplementedError('${type.kind}');
+    throw UnimplementedError('(${type.runtimeType}) $type');
   }
 }
 
-/// Helper for collecting type annotations in formal parameters.
+/// Helper for collecting type annotations.
 class _TypeCollector {
-  static void addType(List<LinkedNode> types, LinkedNode type) {
+  final List<TypeAnnotation> types = [];
+
+  void addType(TypeAnnotation type) {
     if (type != null) {
       types.add(type);
     }
   }
 
-  static void visitParameter(List<LinkedNode> types, LinkedNode parameter) {
-    var kind = parameter.kind;
-    if (kind == LinkedNodeKind.defaultFormalParameter) {
-      visitParameter(types, parameter.defaultFormalParameter_parameter);
-    } else if (kind == LinkedNodeKind.functionTypedFormalParameter) {
-      addType(types, parameter.functionTypedFormalParameter_returnType);
-      visitParameters(
-        types,
-        parameter.functionTypedFormalParameter_formalParameters,
-      );
-    } else if (kind == LinkedNodeKind.simpleFormalParameter) {
-      addType(types, parameter.simpleFormalParameter_type);
+  void visitParameter(FormalParameter node) {
+    if (node is DefaultFormalParameter) {
+      visitParameter(node.parameter);
+    } else if (node is FunctionTypedFormalParameter) {
+      addType(node.returnType);
+      visitParameters(node.parameters);
+    } else if (node is SimpleFormalParameter) {
+      addType(node.type);
     } else {
-      throw UnimplementedError('$kind');
+      throw UnimplementedError('(${node.runtimeType}) $node');
     }
   }
 
-  static void visitParameters(List<LinkedNode> types, LinkedNode parameters) {
-    assert(parameters.kind == LinkedNodeKind.formalParameterList);
-    for (var parameter in parameters.formalParameterList_parameters) {
-      visitParameter(types, parameter);
+  void visitParameters(FormalParameterList parameterList) {
+    for (var parameter in parameterList.parameters) {
+      visitParameter(parameter);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index c5b38e4..60b10d9 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -3,16 +3,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/summary/link.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/src/summary2/ast_resolver.dart';
 import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/summary2/linking_node_scope.dart';
+import 'package:analyzer/src/task/strong_mode.dart';
 
 DartType _dynamicIfNull(DartType type) {
   if (type == null || type.isBottom || type.isDartCoreNull) {
@@ -21,73 +26,55 @@
   return type;
 }
 
-/// TODO(scheglov) This is not a valid implementation of top-level inference.
-/// See https://bit.ly/2HYfAKg
-///
-/// In general inference of constructor field formal parameters should be
-/// interleaved with inference of fields. There are resynthesis tests that
-/// fail because of this limitation.
+AstNode _getLinkedNode(Element element) {
+  return (element as ElementImpl).linkedNode;
+}
+
 class TopLevelInference {
   final Linker linker;
-  LibraryElementImpl _libraryElement;
 
-  Scope _libraryScope;
-  Scope _nameScope;
+  TopLevelInference(this.linker);
 
-  LinkedUnitContext _linkedContext;
-  CompilationUnitElementImpl unitElement;
-
-  TopLevelInference(this.linker, Reference libraryRef) {
-    _libraryElement = linker.elementFactory.elementOfReference(libraryRef);
-    _libraryScope = LibraryScope(_libraryElement);
-    _nameScope = _libraryScope;
-  }
-
-  DynamicTypeImpl get _dynamicType {
-    return DynamicTypeImpl.instance;
-  }
-
-  VoidTypeImpl get _voidType => VoidTypeImpl.instance;
+  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
 
   void infer() {
-    _setOmittedReturnTypes();
-    _inferFieldsTemporary();
+    _performOverrideInference();
+    _InitializerInference(linker).perform();
     _inferConstructorFieldFormals();
   }
 
   void _inferConstructorFieldFormals() {
-    for (CompilationUnitElementImpl unit in _libraryElement.units) {
-      this.unitElement = unit;
-      _linkedContext = unit.linkedContext;
+    for (var builder in linker.builders.values) {
+      for (var unit in builder.element.units) {
+        for (var class_ in unit.types) {
+          var fields = <String, DartType>{};
+          for (var field in class_.fields) {
+            if (field.isSynthetic) continue;
 
-      for (var class_ in unit.types) {
-        var fields = <String, DartType>{};
-        for (FieldElementImpl field in class_.fields) {
-          if (field.isSynthetic) continue;
-
-          var name = field.name;
-          var type = field.type;
-          if (type == null) {
-            throw StateError('Field $name should have a type.');
+            var name = field.name;
+            var type = field.type;
+            if (type == null) {
+              throw StateError('Field $name should have a type.');
+            }
+            fields[name] ??= type;
           }
-          fields[name] ??= type;
-        }
 
-        for (ConstructorElementImpl constructor in class_.constructors) {
-          for (ParameterElementImpl parameter in constructor.parameters) {
-            if (parameter is FieldFormalParameterElement) {
-              FormalParameter node = parameter.linkedNode;
-              if (node is DefaultFormalParameter) {
-                var defaultParameter = node as DefaultFormalParameter;
-                node = defaultParameter.parameter;
-              }
+          for (var constructor in class_.constructors) {
+            for (var parameter in constructor.parameters) {
+              if (parameter is FieldFormalParameterElement) {
+                var node = _getLinkedNode(parameter);
+                if (node is DefaultFormalParameter) {
+                  var defaultParameter = node as DefaultFormalParameter;
+                  node = defaultParameter.parameter;
+                }
 
-              if (node is FieldFormalParameter &&
-                  node.type == null &&
-                  node.parameters == null) {
-                var name = parameter.name;
-                var type = fields[name] ?? _dynamicType;
-                LazyAst.setType(node, type);
+                if (node is FieldFormalParameter &&
+                    node.type == null &&
+                    node.parameters == null) {
+                  var name = parameter.name;
+                  var type = fields[name] ?? _dynamicType;
+                  LazyAst.setType(node, type);
+                }
               }
             }
           }
@@ -96,116 +83,162 @@
     }
   }
 
-  void _inferFieldsTemporary() {
-    for (CompilationUnitElementImpl unit in _libraryElement.units) {
-      this.unitElement = unit;
-      _linkedContext = unit.linkedContext;
-
-      for (var class_ in unit.types) {
-        _inferFieldsTemporaryClass(class_);
-      }
-
-      for (var mixin_ in unit.mixins) {
-        _inferFieldsTemporaryClass(mixin_);
-      }
-
-      for (TopLevelVariableElementImpl variable in unit.topLevelVariables) {
-        if (variable.isSynthetic) continue;
-        VariableDeclaration node = variable.linkedNode;
-        VariableDeclarationList parent = node.parent;
-        if (parent.type == null || _linkedContext.isConst(node)) {
-          _inferVariableTypeFromInitializerTemporary(node);
-        }
+  void _performOverrideInference() {
+    for (var builder in linker.builders.values) {
+      for (var unit in builder.element.units) {
+        new InstanceMemberInferrer(
+          linker.typeProvider,
+          linker.inheritance,
+        ).inferCompilationUnit(unit);
       }
     }
   }
+}
 
-  void _inferFieldsTemporaryClass(ClassElement class_) {
-    var prevScope = _nameScope;
+class _InferenceDependenciesCollector extends RecursiveAstVisitor<void> {
+  final Set<PropertyInducingElement> _set = Set.identity();
 
-    _nameScope = TypeParameterScope(_nameScope, class_);
-    _nameScope = ClassScope(_nameScope, class_);
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    var element = node.staticElement;
+    if (element is PropertyAccessorElement && element.isGetter) {
+      _set.add(element.variable);
+    }
+  }
+}
 
-    for (FieldElementImpl field in class_.fields) {
-      if (field.isSynthetic) continue;
-      VariableDeclaration node = field.linkedNode;
-      VariableDeclarationList parent = node.parent;
-      // TODO(scheglov) Use inheritance
-      // TODO(scheglov) infer in the correct order
-      if (parent.type == null || parent.isConst) {
-        _inferVariableTypeFromInitializerTemporary(node);
-      }
+class _InferenceNode extends graph.Node<_InferenceNode> {
+  final _InferenceWalker _walker;
+  final LibraryElement _library;
+  final Scope _scope;
+  final VariableDeclaration _node;
+
+  @override
+  bool isEvaluated = false;
+
+  _InferenceNode(this._walker, this._library, this._scope, this._node);
+
+  @override
+  List<_InferenceNode> computeDependencies() {
+    _node.initializer.accept(LocalElementBuilder(ElementHolder(), null));
+
+    _resolveInitializer();
+
+    var collector = _InferenceDependenciesCollector();
+    _node.initializer.accept(collector);
+
+    if (collector._set.isEmpty) {
+      return const <_InferenceNode>[];
     }
 
-    _nameScope = prevScope;
+    return collector._set
+        .map(_walker.getNode)
+        .where((node) => node != null)
+        .toList();
   }
 
-  void _inferVariableTypeFromInitializerTemporary(VariableDeclaration node) {
-    var initializer = node.initializer;
+  void evaluate() {
+    _resolveInitializer();
 
-    if (initializer == null) {
-      LazyAst.setType(node, _dynamicType);
-      return;
-    }
-
-    var astResolver = AstResolver(linker, _libraryElement, _nameScope);
-    astResolver.resolve(initializer);
-
-    VariableDeclarationList parent = node.parent;
+    VariableDeclarationList parent = _node.parent;
     if (parent.type == null) {
-      var initializerType = initializer.staticType;
+      var initializerType = _node.initializer.staticType;
       initializerType = _dynamicIfNull(initializerType);
-      LazyAst.setType(node, initializerType);
+      LazyAst.setType(_node, initializerType);
+    }
+
+    isEvaluated = true;
+  }
+
+  void markCircular() {
+    LazyAst.setType(_node, DynamicTypeImpl.instance);
+    isEvaluated = true;
+  }
+
+  void _resolveInitializer() {
+    var astResolver = AstResolver(_walker._linker, _library, _scope);
+    astResolver.resolve(_node.initializer, doAstRewrite: true);
+  }
+}
+
+class _InferenceWalker extends graph.DependencyWalker<_InferenceNode> {
+  final Linker _linker;
+  final Map<Element, _InferenceNode> _nodes = Map.identity();
+
+  _InferenceWalker(this._linker);
+
+  void addNode(Element element, LibraryElement library, Scope scope,
+      VariableDeclaration node) {
+    _nodes[element] = _InferenceNode(this, library, scope, node);
+  }
+
+  @override
+  void evaluate(_InferenceNode v) {
+    v.evaluate();
+  }
+
+  @override
+  void evaluateScc(List<_InferenceNode> scc) {
+    for (var node in scc) {
+      node.markCircular();
     }
   }
 
-  void _setOmittedReturnTypes() {
-    for (CompilationUnitElementImpl unit in _libraryElement.units) {
-      this.unitElement = unit;
-      _linkedContext = unit.linkedContext;
+  _InferenceNode getNode(Element element) {
+    return _nodes[element];
+  }
 
-      for (var class_ in unit.types) {
-        _setOmittedReturnTypesClass(class_);
-      }
-
-      for (var mixin_ in unit.mixins) {
-        _setOmittedReturnTypesClass(mixin_);
-      }
-
-      for (FunctionElementImpl function in unit.functions) {
-        FunctionDeclaration node = function.linkedNode;
-        if (node.returnType == null) {
-          LazyAst.setReturnType(node, _dynamicType);
-        }
-      }
-
-      for (PropertyAccessorElementImpl accessor in unit.accessors) {
-        if (accessor.isSynthetic) continue;
-        if (accessor.isSetter) {
-          LazyAst.setReturnType(accessor.linkedNode, _voidType);
-        }
+  void walkNodes() {
+    for (var node in _nodes.values) {
+      if (!node.isEvaluated) {
+        walk(node);
       }
     }
   }
+}
 
-  void _setOmittedReturnTypesClass(ClassElement class_) {
-    for (MethodElementImpl method in class_.methods) {
-      MethodDeclaration node = method.linkedNode;
-      if (node.returnType == null) {
-        LazyAst.setReturnType(node, _dynamicType);
+class _InitializerInference {
+  final Linker _linker;
+  final _InferenceWalker _walker;
+
+  LibraryElement _library;
+  Scope _scope;
+
+  _InitializerInference(this._linker) : _walker = _InferenceWalker(_linker);
+
+  void perform() {
+    for (var builder in _linker.builders.values) {
+      _library = builder.element;
+      for (var unit in _library.units) {
+        for (var class_ in unit.types) {
+          var node = _getLinkedNode(class_);
+          _scope = LinkingNodeContext.get(node).scope;
+          for (var element in class_.fields) {
+            _addNode(element);
+          }
+        }
+
+        _scope = builder.libraryScope;
+        for (var element in unit.topLevelVariables) {
+          _addNode(element);
+        }
       }
     }
+    _walker.walkNodes();
+  }
 
-    for (PropertyAccessorElementImpl accessor in class_.accessors) {
-      if (accessor.isSynthetic) continue;
+  void _addNode(PropertyInducingElement element) {
+    if (element.isSynthetic) return;
 
-      MethodDeclaration node = accessor.linkedNode;
-      if (node.returnType != null) continue;
-
-      if (accessor.isSetter) {
-        LazyAst.setReturnType(node, _voidType);
+    VariableDeclaration node = _getLinkedNode(element);
+    VariableDeclarationList variableList = node.parent;
+    if (variableList.type == null || element.isConst) {
+      if (node.initializer != null) {
+        _walker.addNode(element, _library, _scope, node);
       } else {
-        LazyAst.setReturnType(node, _dynamicType);
+        if (LazyAst.getType(node) == null) {
+          LazyAst.setType(node, DynamicTypeImpl.instance);
+        }
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/summary2/type_builder.dart b/pkg/analyzer/lib/src/summary2/type_builder.dart
index 3588181..9a677ee 100644
--- a/pkg/analyzer/lib/src/summary2/type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/type_builder.dart
@@ -9,82 +9,68 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/summary2/lazy_ast.dart';
-import 'package:analyzer/src/summary2/linking_bundle_context.dart';
 
-/// Type annotations and declarations to build types for.
-///
-/// Not all types can be build during reference resolution phase.
-/// For example `A` means `A<num>` if `class A<T extends num>`, but we don't
-/// know this until we resolved `A` declaration, and we might have not yet.
-///
-/// So, we remember type annotations that should be resolved later, and
-/// declarations to set types from explicit type annotations.
-class NodesToBuildType {
-  final List<NodeToBuildType> items = [];
-
-  void addDeclaration(AstNode declaration) {
-    items.add(NodeToBuildType._(null, declaration));
-  }
-
-  void addTypeAnnotation(TypeAnnotation typeAnnotation) {
-    items.add(NodeToBuildType._(typeAnnotation, null));
-  }
-}
-
-/// A type annotation to build type for, or a declaration to set its explicitly
-/// declared type.
-class NodeToBuildType {
-  final TypeAnnotation typeAnnotation;
-  final AstNode declaration;
-
-  NodeToBuildType._(this.typeAnnotation, this.declaration);
-}
-
-/// Build types in a [NodesToBuildType].
 class TypeBuilder {
-  final LinkingBundleContext bundleContext;
+  final Dart2TypeSystem typeSystem;
 
-  TypeBuilder(this.bundleContext);
+  /// The set of type annotations, and declaration in the build unit, for which
+  /// we need to build types, but have not built yet.
+  final Set<AstNode> _nodesToBuildType = Set.identity();
 
-  DynamicTypeImpl get _dynamicType {
-    return DynamicTypeImpl.instance;
-  }
+  TypeBuilder(this.typeSystem);
 
-  void build(NodesToBuildType nodesToBuildType) {
-    for (var item in nodesToBuildType.items) {
-      if (item.typeAnnotation != null) {
-        var node = item.typeAnnotation;
-        if (node is GenericFunctionType) {
-          _buildGenericFunctionType(node);
-        } else if (node is TypeName) {
-          _buildTypeName(node);
-        } else {
-          throw StateError('${node.runtimeType}');
-        }
-      } else if (item.declaration != null) {
-        _setTypesForDeclaration(item.declaration);
-      }
+  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
+
+  VoidTypeImpl get _voidType => VoidTypeImpl.instance;
+
+  /// The [nodes] list is a mix of [TypeAnnotation]s and declarations, where
+  /// usually type annotations come before declarations that use them, but this
+  /// is not guaranteed, and not even always possible. For example references
+  /// to typedefs declared in another unit being built - we need to build types
+  /// for this typedef, which might reference another unit (encountered before
+  /// or after the one defining the typedef).
+  void build(List<AstNode> nodes) {
+    _nodesToBuildType.addAll(nodes);
+    for (var item in nodes) {
+      _build(item);
     }
   }
 
-  DartType _buildFunctionType(
+  void _build(AstNode node) {
+    if (node == null) return;
+    if (!_nodesToBuildType.remove(node)) return;
+
+    if (node is TypeAnnotation) {
+      _typeAnnotation(node);
+    } else {
+      _declaration(node);
+    }
+  }
+
+  FunctionType _buildFunctionType(
+    TypeParameterList typeParameterList,
     TypeAnnotation returnTypeNode,
     FormalParameterList parameterList,
   ) {
     var returnType = returnTypeNode?.type ?? _dynamicType;
 
-    // TODO(scheglov) type parameters
-    var typeParameters = const <TypeParameterElement>[];
+    List<TypeParameterElement> typeParameters;
+    if (typeParameterList != null) {
+      typeParameters = typeParameterList.typeParameters
+          .map<TypeParameterElement>((p) => p.declaredElement)
+          .toList();
+    } else {
+      typeParameters = const <TypeParameterElement>[];
+    }
 
-    var formalParameters = parameterList.parameters.map((p) {
-      // TODO(scheglov) other types and kinds
+    var formalParameters = parameterList.parameters.map((parameter) {
       return ParameterElementImpl.synthetic(
-        (p as SimpleFormalParameter).identifier.name,
-        LazyAst.getType(p),
-        ParameterKind.REQUIRED,
+        parameter.identifier?.name ?? '',
+        LazyAst.getType(parameter),
+        // ignore: deprecated_member_use_from_same_package
+        parameter.kind,
       );
     }).toList();
 
@@ -95,12 +81,109 @@
     );
   }
 
-  void _buildGenericFunctionType(GenericFunctionTypeImpl node) {
-    // TODO(scheglov) Type parameters?
-    node.type = _buildFunctionType(node.returnType, node.parameters);
+  void _declaration(AstNode node) {
+    if (node is FieldFormalParameter) {
+      _fieldFormalParameter(node);
+    } else if (node is FunctionDeclaration) {
+      var defaultReturnType = node.isSetter ? _voidType : _dynamicType;
+      var returnType = node.returnType?.type ?? defaultReturnType;
+      LazyAst.setReturnType(node, returnType);
+    } else if (node is FunctionTypeAlias) {
+      _functionTypeAlias(node);
+    } else if (node is FunctionTypedFormalParameter) {
+      _functionTypedFormalParameter(node);
+    } else if (node is GenericFunctionType) {
+      _genericFunctionType(node);
+    } else if (node is MethodDeclaration) {
+      var defaultReturnType = node.isSetter ? _voidType : _dynamicType;
+      var returnType = node.returnType?.type ?? defaultReturnType;
+      LazyAst.setReturnType(node, returnType);
+    } else if (node is SimpleFormalParameter) {
+      _build(node.type);
+      LazyAst.setType(node, node.type?.type ?? _dynamicType);
+    } else if (node is VariableDeclarationList) {
+      var type = node.type?.type;
+      if (type != null) {
+        for (var variable in node.variables) {
+          LazyAst.setType(variable, type);
+        }
+      }
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
   }
 
-  void _buildTypeName(TypeName node) {
+  void _fieldFormalParameter(FieldFormalParameter node) {
+    var parameterList = node.parameters;
+    if (parameterList != null) {
+      var type = _buildFunctionType(
+        node.typeParameters,
+        node.type,
+        parameterList,
+      );
+      LazyAst.setType(node, type);
+    } else {
+      LazyAst.setType(node, node.type?.type ?? _dynamicType);
+    }
+  }
+
+  void _formalParameterList(FormalParameterList node) {
+    for (var formalParameter in node.parameters) {
+      if (formalParameter is SimpleFormalParameter) {
+        _build(formalParameter);
+      }
+    }
+  }
+
+  void _functionTypeAlias(FunctionTypeAlias node) {
+    var returnTypeNode = node.returnType;
+    _build(returnTypeNode);
+    LazyAst.setReturnType(node, returnTypeNode?.type ?? _dynamicType);
+
+    _typeParameterList(node.typeParameters);
+    _formalParameterList(node.parameters);
+  }
+
+  void _functionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    var type = _buildFunctionType(
+      node.typeParameters,
+      node.returnType,
+      node.parameters,
+    );
+    LazyAst.setType(node, type);
+  }
+
+  void _genericFunctionType(GenericFunctionTypeImpl node) {
+    var returnTypeNode = node.returnType;
+    _build(returnTypeNode);
+    LazyAst.setReturnType(node, returnTypeNode?.type ?? _dynamicType);
+
+    _typeParameterList(node.typeParameters);
+    _formalParameterList(node.parameters);
+
+    node.type = _buildFunctionType(
+      node.typeParameters,
+      node.returnType,
+      node.parameters,
+    );
+  }
+
+  List<DartType> _listOfDynamic(int typeParametersLength) {
+    return List<DartType>.filled(typeParametersLength, _dynamicType);
+  }
+
+  void _typeAnnotation(TypeAnnotation node) {
+    if (node is GenericFunctionType) {
+      _genericFunctionType(node);
+    } else if (node is TypeName) {
+      node.type = _dynamicType;
+      _typeName(node);
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  void _typeName(TypeName node) {
     var element = node.name.staticElement;
 
     List<DartType> typeArguments;
@@ -113,220 +196,65 @@
       if (element.isEnum) {
         node.type = InterfaceTypeImpl.explicit(element, const []);
       } else {
-        // TODO(scheglov) Use instantiate to bounds.
+        var rawType = element.type;
+
         var typeParametersLength = element.typeParameters.length;
-        if (typeArguments == null ||
-            typeArguments.length != typeParametersLength) {
-          typeArguments = List<DartType>.filled(
-            typeParametersLength,
-            DynamicTypeImpl.instance,
-          );
+        if (typeParametersLength == 0) {
+          node.type = rawType;
+          return;
         }
+
+        if (typeArguments == null) {
+          node.type = typeSystem.instantiateToBounds(rawType);
+          return;
+        }
+
+        if (typeArguments.length != typeParametersLength) {
+          typeArguments = _listOfDynamic(typeParametersLength);
+        }
+
         node.type = InterfaceTypeImpl.explicit(element, typeArguments);
       }
     } else if (element is GenericTypeAliasElement) {
-      // TODO(scheglov) Use instantiate to bounds.
-      var typeParametersLength = element.typeParameters.length;
-      if (typeArguments == null ||
-          typeArguments.length != typeParametersLength) {
-        typeArguments = List<DartType>.filled(
-          typeParametersLength,
-          DynamicTypeImpl.instance,
+      _build((element as ElementImpl).linkedNode);
+
+      var rawType = element.function.type;
+
+      var typeParameters = element.typeParameters;
+      var typeParametersLength = typeParameters.length;
+      if (typeParametersLength == 0) {
+        node.type = rawType;
+        return;
+      }
+
+      if (typeArguments == null) {
+        typeArguments = typeSystem.instantiateTypeFormalsToBounds(
+          typeParameters,
         );
+      } else if (typeArguments.length != typeParametersLength) {
+        typeArguments = _listOfDynamic(typeParametersLength);
       }
 
       var substitution = Substitution.fromPairs(
-        element.typeParameters,
+        typeParameters,
         typeArguments,
       );
-
-      // TODO(scheglov) Not sure if I like this.
-      var type = substitution.substituteType(element.function.type);
-      node.type = type;
+      node.type = substitution.substituteType(rawType);
     } else if (element is TypeParameterElement) {
       node.type = TypeParameterTypeImpl(element);
     } else {
-//      throw UnimplementedError('${element.runtimeType}');
-      // TODO(scheglov) implement
-      node.type = DynamicTypeImpl.instance;
-    }
-
-//    var referenceIndex = typeNameElementIndex(node.typeName_name);
-//    var reference = bundleContext.referenceOfIndex(referenceIndex);
-//
-//    List<LinkedNodeTypeBuilder> typeArguments;
-//    var typeArgumentList = node.typeName_typeArguments;
-//    if (typeArgumentList != null) {
-//      typeArguments = typeArgumentList.typeArgumentList_arguments
-//          .map((node) => _getType(node))
-//          .toList();
-//    }
-//
-//    if (reference.isClass) {
-//      // TODO(scheglov) Use instantiate to bounds.
-//      var typeParametersLength = _typeParametersLength(reference);
-//      if (typeArguments == null ||
-//          typeArguments.length != typeParametersLength) {
-//        typeArguments = List<LinkedNodeTypeBuilder>.filled(
-//          typeParametersLength,
-//          _dynamicType,
-//        );
-//      }
-//      node.typeName_type = LinkedNodeTypeBuilder(
-//        kind: LinkedNodeTypeKind.interface,
-//        interfaceClass: referenceIndex,
-//        interfaceTypeArguments: typeArguments,
-//      );
-//    } else if (reference.isDynamic) {
-//      node.typeName_type = LinkedNodeTypeBuilder(
-//        kind: LinkedNodeTypeKind.dynamic_,
-//      );
-//    } else if (reference.isTypeAlias) {
-//      // TODO(scheglov) Use instantiate to bounds.
-//      var typeParametersLength = _typeParametersLength(reference);
-//      if (typeArguments == null ||
-//          typeArguments.length != typeParametersLength) {
-//        typeArguments = List<LinkedNodeTypeBuilder>.filled(
-//          typeParametersLength,
-//          _dynamicType,
-//        );
-//      }
-//      node.typeName_type = LinkedNodeTypeBuilder(
-//        kind: LinkedNodeTypeKind.genericTypeAlias,
-//        genericTypeAliasReference: referenceIndex,
-//        genericTypeAliasTypeArguments: typeArguments,
-//      );
-//    } else if (reference.isEnum) {
-//      node.typeName_type = LinkedNodeTypeBuilder(
-//        kind: LinkedNodeTypeKind.interface,
-//        interfaceClass: referenceIndex,
-//      );
-//    } else if (reference.isTypeParameter) {
-//      node.typeName_type = LinkedNodeTypeBuilder(
-//        kind: LinkedNodeTypeKind.typeParameter,
-//        typeParameterParameter: referenceIndex,
-//      );
-//    } else {
-//      node.typeName_type = _dynamicType;
-//    }
-  }
-
-  void _fieldFormalParameter(FieldFormalParameter node) {
-    var parameterList = node.parameters;
-    if (parameterList != null) {
-      var type = _buildFunctionType(node.type, parameterList);
-      LazyAst.setType(node, type);
-    } else {
-      LazyAst.setType(node, node.type?.type ?? _dynamicType);
+      // We might get all kinds of elements, including not type at all.
+      // For example a PrefixElement, or a getter, etc.
+      // In all these cases the type is dynamic.
+      node.type = _dynamicType;
     }
   }
 
-  void _functionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    var type = _buildFunctionType(node.returnType, node.parameters);
-    LazyAst.setType(node, type);
-  }
+  void _typeParameterList(TypeParameterList node) {
+    if (node == null) return;
 
-//  LinkedNodeTypeBuilder _getFormalParameterType(LinkedNode node) {
-//    var kind = node.kind;
-//    if (kind == LinkedNodeKind.defaultFormalParameter) {
-//      return _getFormalParameterType(node.defaultFormalParameter_parameter);
-//    }
-//    if (kind == LinkedNodeKind.functionTypedFormalParameter) {
-//      return node.functionTypedFormalParameter_type2;
-//    }
-//    if (kind == LinkedNodeKind.simpleFormalParameter) {
-//      return _getType(node.simpleFormalParameter_type);
-//    }
-//    throw UnimplementedError('$kind');
-//  }
-
-//  LinkedNodeTypeBuilder _getType(LinkedNodeBuilder node) {
-//    if (node == null) return _dynamicType;
-//
-//    var kind = node.kind;
-//    if (kind == LinkedNodeKind.genericFunctionType) {
-//      return node.genericFunctionType_type;
-//    } else if (kind == LinkedNodeKind.typeName) {
-//      return node.typeName_type;
-//    } else {
-//      throw UnimplementedError('$kind');
-//    }
-//  }
-
-  void _setTypesForDeclaration(AstNode node) {
-    if (node is FieldFormalParameter) {
-      _fieldFormalParameter(node);
-    } else if (node is FunctionDeclaration) {
-      LazyAst.setReturnType(node, node.returnType?.type ?? _dynamicType);
-    } else if (node is FunctionTypeAlias) {
-      LazyAst.setReturnType(node, node.returnType?.type ?? _dynamicType);
-    } else if (node is FunctionTypedFormalParameter) {
-      _functionTypedFormalParameter(node);
-    } else if (node is GenericFunctionType) {
-      LazyAst.setReturnType(node, node.returnType?.type ?? _dynamicType);
-    } else if (node is MethodDeclaration) {
-      if (node.returnType != null) {
-        LazyAst.setReturnType(node, node.returnType.type);
-      }
-    } else if (node is SimpleFormalParameter) {
-      // TODO(scheglov) use top-level inference
-      LazyAst.setType(node, node.type?.type ?? _dynamicType);
-    } else if (node is VariableDeclarationList) {
-      var type = node.type?.type;
-      if (type != null) {
-        for (var variable in node.variables) {
-          LazyAst.setType(variable, type);
-        }
-      }
-    } else {
-      throw UnimplementedError('${node.runtimeType}');
-    }
-//    var kind = node.kind;
-//    if (kind == LinkedNodeKind.fieldFormalParameter) {
-//      _fieldFormalParameter(node);
-//    } else if (kind == LinkedNodeKind.functionDeclaration) {
-//      node.functionDeclaration_returnType2 = _getType(
-//        node.functionDeclaration_returnType,
-//      );
-//    } else if (kind == LinkedNodeKind.functionTypeAlias) {
-//      node.functionTypeAlias_returnType2 = _getType(
-//        node.functionTypeAlias_returnType,
-//      );
-//    } else if (kind == LinkedNodeKind.functionTypedFormalParameter) {
-//      _functionTypedFormalParameter(node);
-//    } else if (kind == LinkedNodeKind.genericFunctionType) {
-//      node.genericFunctionType_returnType2 = _getType(
-//        node.genericFunctionType_returnType,
-//      );
-//    } else if (kind == LinkedNodeKind.methodDeclaration) {
-//      node.methodDeclaration_returnType2 = _getType(
-//        node.methodDeclaration_returnType,
-//      );
-//    } else if (kind == LinkedNodeKind.simpleFormalParameter) {
-//      node.simpleFormalParameter_type2 = _getType(
-//        node.simpleFormalParameter_type,
-//      );
-//    } else if (kind == LinkedNodeKind.variableDeclarationList) {
-//      var typeNode = node.variableDeclarationList_type;
-//      for (var variable in node.variableDeclarationList_variables) {
-//        variable.variableDeclaration_type2 = _getType(typeNode);
-//      }
-//    } else {
-//      throw UnimplementedError('$kind');
-//    }
-  }
-
-//  int _typeParametersLength(Reference reference) {
-//    var node = bundleContext.elementFactory.nodeOfReference(reference);
-//    return LinkedUnitContext.getTypeParameters(node)?.length ?? 0;
-//  }
-
-  static int typeNameElementIndex(LinkedNode name) {
-    if (name.kind == LinkedNodeKind.simpleIdentifier) {
-      return name.simpleIdentifier_element;
-    } else {
-      var identifier = name.prefixedIdentifier_identifier;
-      return identifier.simpleIdentifier_element;
+    for (var typeParameter in node.typeParameters) {
+      _build(typeParameter.bound);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index 0ae39f9..35a6337 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -156,6 +156,7 @@
       DartType type = matchingParameter?.type ?? typeProvider.dynamicType;
       if (parameterType == null) {
         if (type is FunctionType &&
+            type.element != null &&
             type.element is! TypeDefiningElement &&
             type.element.enclosingElement is! TypeDefiningElement) {
           // The resulting parameter's type element has an `enclosingElement` of
diff --git a/pkg/analyzer/test/error/error_test.dart b/pkg/analyzer/test/error/error_test.dart
index b68dbac..e07ea71 100644
--- a/pkg/analyzer/test/error/error_test.dart
+++ b/pkg/analyzer/test/error/error_test.dart
@@ -12,16 +12,17 @@
 
 import '../generated/parser_test.dart';
 
-List<String> _analyzerRootComponents;
-
 main() {
-  _analyzerRootComponents =
-      path.split(path.fromUri(Platform.script.resolve("../../")));
+  _analyzerRootComponents = path.split(path.fromUri(Platform.script));
+  int index = _analyzerRootComponents.lastIndexOf('analyzer');
+  _analyzerRootComponents = _analyzerRootComponents.sublist(0, index + 1);
   defineReflectiveSuite(() {
     defineReflectiveTests(ErrorCodeValuesTest);
   });
 }
 
+List<String> _analyzerRootComponents;
+
 @reflectiveTest
 class ErrorCodeValuesTest extends ParserTestCase {
   bool bad() {
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 6318820..46f7960 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class CheckedModeCompileTimeErrorCodeTest extends DriverResolutionTest {
   test_assertion_throws() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(int x, int y) : assert(x < y);
 }
@@ -46,7 +46,7 @@
   test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() async {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   final Unresolved x;
   const A(String this.x);
@@ -151,7 +151,7 @@
   test_fieldFormalParameterAssignableToField_typedef() async {
     // foo has the runtime type dynamic -> dynamic, so it is not assignable
     // to A.f.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 typedef String Int2String(int x);
 class A {
   final Int2String f;
@@ -175,7 +175,7 @@
   }
 
   test_fieldFormalParameterNotAssignableToField() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   final int x;
   const A(this.x);
@@ -191,7 +191,7 @@
     // According to checked-mode type checking rules, a value of type A is not
     // assignable to a field of type B, because B extends A (the subtyping
     // relationship is in the wrong direction).
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
 }
@@ -208,7 +208,7 @@
   }
 
   test_fieldFormalParameterNotAssignableToField_fieldType() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   final int x;
   const A(this.x);
@@ -221,7 +221,7 @@
   }
 
   test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   final Unresolved x;
   const A(String this.x);
@@ -237,7 +237,7 @@
     // According to checked-mode type checking rules, a value of type A is not
     // assignable to a field of type B, because B implements A (the subtyping
     // relationship is in the wrong direction).
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
 }
@@ -253,7 +253,7 @@
 
   test_fieldFormalParameterNotAssignableToField_list() async {
     // <num>[1, 2, 3] has type List<num>, which is not a subtype of List<int>.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(List<int> x);
 }
@@ -265,7 +265,7 @@
   test_fieldFormalParameterNotAssignableToField_map_keyMismatch() async {
     // <num, int>{1: 2} has type Map<num, int>, which is not a subtype of
     // Map<int, int>.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(Map<int, int> x);
 }
@@ -277,7 +277,7 @@
   test_fieldFormalParameterNotAssignableToField_map_valueMismatch() async {
     // <int, num>{1: 2} has type Map<int, num>, which is not a subtype of
     // Map<int, int>.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(Map<int, int> x);
 }
@@ -287,7 +287,7 @@
   }
 
   test_fieldFormalParameterNotAssignableToField_optional() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   final int x;
   const A([this.x = 'foo']);
@@ -302,7 +302,7 @@
   test_fieldFormalParameterNotAssignableToField_typedef() async {
     // foo has the runtime type String -> int, so it should not be assignable
     // to A.f (A.f requires it to be int -> String).
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 typedef String Int2String(int x);
 class A {
   final Int2String f;
@@ -317,7 +317,7 @@
   }
 
   test_fieldInitializerNotAssignable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   final int x;
   const A() : x = '';
@@ -329,7 +329,7 @@
   }
 
   test_fieldTypeMismatch() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(x) : y = x;
   final int y;
@@ -339,7 +339,7 @@
   }
 
   test_fieldTypeMismatch_generic() async {
-    await assertErrorsInCode(
+    await assertErrorCodesInCode(
       r'''
 class C<T> {
   final T x = y;
@@ -356,7 +356,7 @@
   }
 
   test_fieldTypeMismatch_unresolved() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(x) : y = x;
   final Unresolved y;
@@ -369,7 +369,7 @@
   }
 
   test_fieldTypeOk_generic() async {
-    await assertErrorsInCode(
+    await assertErrorCodesInCode(
       r'''
 class C<T> {
   final T x = y;
@@ -395,7 +395,7 @@
   test_fieldTypeOk_unresolved_null() async {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(x) : y = x;
   final Unresolved y;
@@ -405,27 +405,27 @@
   }
 
   test_listElementTypeNotAssignable() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <String> [42];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_listLiteral_inferredElementType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const Object x = [1];
 const List<String> y = x;
 ''', [CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH]);
   }
 
   test_mapLiteral_inferredKeyType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const Object x = {1: 1};
 const Map<String, dynamic> y = x;
 ''', [CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH]);
   }
 
   test_mapLiteral_inferredValueType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const Object x = {1: 1};
 const Map<dynamic, String> y = x;
 ''', [CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH]);
@@ -451,7 +451,7 @@
   test_parameterAssignable_undefined_null() async {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(Unresolved x);
 }
@@ -460,7 +460,7 @@
   }
 
   test_parameterNotAssignable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(int x);
 }
@@ -472,7 +472,7 @@
   }
 
   test_parameterNotAssignable_typeSubstitution() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<T> {
   const A(T x);
 }
@@ -484,7 +484,7 @@
   }
 
   test_parameterNotAssignable_undefined() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A(Unresolved x);
 }
@@ -496,7 +496,7 @@
   }
 
   test_redirectingConstructor_paramTypeMismatch() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A.a1(x) : this.a2(x);
   const A.a2(String x);
@@ -506,7 +506,7 @@
   }
 
   test_superConstructor_paramTypeMismatch() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class C {
   final double d;
   const C(this.d);
@@ -527,13 +527,13 @@
   test_topLevelVarAssignable_undefined_null() async {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const Unresolved x = null;
 ''', [StaticWarningCode.UNDEFINED_CLASS]);
   }
 
   test_topLevelVarNotAssignable() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const int x = 'foo';
 ''', [
       CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
@@ -542,7 +542,7 @@
   }
 
   test_topLevelVarNotAssignable_undefined() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const Unresolved x = 'foo';
 ''', [
       CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 2ab9c7b..f8b7ac6 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -88,7 +88,7 @@
 
   test_defaultValueInFunctionTypeAlias_new_named() async {
     // This test used to fail with UI as code enabled. Test the fix here.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 typedef F = int Function({Map<String, String> m: const {}});
 ''', [
       ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE,
@@ -98,7 +98,7 @@
   test_defaultValueInFunctionTypeAlias_new_named_ambiguous() async {
     // Test that the strong checker does not crash when given an ambiguous
     // set or map literal.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 typedef F = int Function({Object m: const {1, 2: 3}});
 ''', [
       ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE,
@@ -114,7 +114,7 @@
     ..enabledExperiments = [EnableString.control_flow_collections];
 
   test_awaitForIn_declaredVariableWrongType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 import 'dart:async';
 f() async {
   Stream<String> stream;
@@ -124,7 +124,7 @@
   }
 
   test_awaitForIn_existingVariableWrongType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 import 'dart:async';
 f() async {
   Stream<String> stream;
@@ -135,7 +135,7 @@
   }
 
   test_awaitForIn_notStream() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f() async {
   await for (var i in true) {}
 }
@@ -143,7 +143,7 @@
   }
 
   test_duplicateDefinition_for_initializers() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   for (int i = 0, i = 0; i < 5;) {}
 }
@@ -151,14 +151,14 @@
   }
 
   test_expectedOneListTypeArgument() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   <int, int>[];
 }''', [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
   }
 
   test_expectedOneSetTypeArgument() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   <int, int, int>{2, 3};
 }''', [StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS]);
@@ -167,21 +167,21 @@
   test_expectedTwoMapTypeArguments_three_ambiguous() async {
     // TODO(brianwilkerson) We probably need a new error code for "expected
     //  either one or two type arguments" to handle the ambiguous case.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   <int, int, int>{};
 }''', [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
   }
 
   test_expectedTwoMapTypeArguments_three_map() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   <int, int, int>{1:2};
 }''', [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
   }
 
   test_forIn_declaredVariableWrongType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f() {
   for (int i in <String>[]) {}
 }
@@ -189,7 +189,7 @@
   }
 
   test_forIn_existingVariableWrongType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f() {
   int i;
   for (i in <String>[]) {}
@@ -198,7 +198,7 @@
   }
 
   test_forIn_notIterable() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f() {
   for (var i in true) {}
 }
@@ -206,7 +206,7 @@
   }
 
   test_forIn_typeBoundBad() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class Foo<T extends Iterable<int>> {
   void method(T iterable) {
     for (String i in iterable) {}
@@ -216,7 +216,7 @@
   }
 
   test_forInWithConstVariable_forEach_identifier() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   const x = 0;
   for (x in [0, 1, 2]) {}
@@ -225,7 +225,7 @@
   }
 
   test_forInWithConstVariable_forEach_loopVariable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   for (const x in [0, 1, 2]) {}
 }
@@ -233,7 +233,7 @@
   }
 
   test_generalizedVoid_useOfInForeachIterableError() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 void main() {
   void x;
   for (var v in x) {}
@@ -242,7 +242,7 @@
   }
 
   test_generalizedVoid_useOfVoidInForeachVariableError() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 void main() {
   void x;
   var y;
@@ -252,7 +252,7 @@
   }
 
   test_invalidTypeArgumentInConstList() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<E> {
   m() {
     return const <E>[];
@@ -262,7 +262,7 @@
   }
 
   test_invalidTypeArgumentInConstMap_key() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<E> {
   m() {
     return const <E, String>{};
@@ -272,7 +272,7 @@
   }
 
   test_invalidTypeArgumentInConstMap_value() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<E> {
   m() {
     return const <String, E>{};
@@ -282,7 +282,7 @@
   }
 
   test_invalidTypeArgumentInConstSet_class() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<E> {
   m() {
     return const <E>{};
@@ -292,20 +292,20 @@
   }
 
   test_listElementTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <String>[42];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_mapValueTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <String, String>{'a' : 2};
 ''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_nonBoolCondition_for_declaration() async {
     // https://github.com/dart-lang/sdk/issues/24713
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   for (int i = 0; 3;) {}
 }
@@ -314,7 +314,7 @@
 
   test_nonBoolCondition_for_expression() async {
     // https://github.com/dart-lang/sdk/issues/24713
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   int i;
   for (i = 0; 3;) {}
@@ -325,7 +325,7 @@
     // TODO(danrubel) Fasta is not recovering well.
     // Ideally we would produce a single diagnostic:
     // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   {'a' : 0, 'b' : 1}.length;
 }
@@ -351,7 +351,7 @@
     // TODO(danrubel) Fasta is not recovering well.
     // Ideally we would produce a single diagnostic:
     // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   {'a' : 0, 'b' : 1};
 }
@@ -373,7 +373,7 @@
   }
 
   test_setElementTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <String>{42};
 ''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
@@ -382,7 +382,7 @@
 @reflectiveTest
 class InvalidTypeArgumentInConstSetTest extends DriverResolutionTest {
   test_class() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<E> {
   m() {
     return const <E>{};
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 738676c..ef81da6 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -2058,6 +2058,30 @@
   void test_nullCheckPropertyAccess3() {
     parseNNBDCompilationUnit('f() { var x = super.p! + 7; }');
   }
+
+  void test_postfix_null_assertion_and_unary_prefix_operator_precedence() {
+    // -x! is parsed as -(x!).
+    var unit = parseNNBDCompilationUnit('void main() { -x!; }');
+    var function = unit.declarations[0] as FunctionDeclaration;
+    var body = function.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var outerExpression = statement.expression as PrefixExpression;
+    expect(outerExpression.operator.type, TokenType.MINUS);
+    var innerExpression = outerExpression.operand as PostfixExpression;
+    expect(innerExpression.operator.type, TokenType.BANG);
+  }
+
+  void test_postfix_null_assertion_of_postfix_expression() {
+    // x++! is parsed as (x++)!.
+    var unit = parseNNBDCompilationUnit('void main() { x++!; }');
+    var function = unit.declarations[0] as FunctionDeclaration;
+    var body = function.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var outerExpression = statement.expression as PostfixExpression;
+    expect(outerExpression.operator.type, TokenType.BANG);
+    var innerExpression = outerExpression.operand as PostfixExpression;
+    expect(innerExpression.operator.type, TokenType.PLUS_PLUS);
+  }
 }
 
 /**
@@ -2730,6 +2754,101 @@
 @reflectiveTest
 class TopLevelParserTest_Fasta extends FastaParserTestCase
     with TopLevelParserTestMixin {
+  void test_languageVersion_afterImport() {
+    var unit = parseCompilationUnit('''
+import 'foo.dart';
+// @dart = 2.3
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion, isNull);
+  }
+
+  void test_languageVersion_beforeComment() {
+    var unit = parseCompilationUnit('''
+// some other comment
+// @dart = 2.3
+// yet another comment
+import 'foo.dart';
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion.major, 2);
+    expect(unit.languageVersion.minor, 3);
+  }
+
+  void test_languageVersion_beforeFunction() {
+    var unit = parseCompilationUnit('''
+// @dart = 2.3
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion.major, 2);
+    expect(unit.languageVersion.minor, 3);
+  }
+
+  void test_languageVersion_beforeImport() {
+    var unit = parseCompilationUnit('''
+// @dart = 2.3
+import 'foo.dart';
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion.major, 2);
+    expect(unit.languageVersion.minor, 3);
+  }
+
+  void test_languageVersion_beforeImport_afterScript() {
+    var unit = parseCompilationUnit('''
+#!/bin/dart
+// @dart = 2.3
+import 'foo.dart';
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion.major, 2);
+    expect(unit.languageVersion.minor, 3);
+  }
+
+  void test_languageVersion_beforeLibrary() {
+    var unit = parseCompilationUnit('''
+// @dart = 2.3
+library foo;
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion.major, 2);
+    expect(unit.languageVersion.minor, 3);
+  }
+
+  void test_languageVersion_incomplete_version() {
+    var unit = parseCompilationUnit('''
+// @dart = 2.
+library foo;
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion, isNull);
+  }
+
+  void test_languageVersion_invalid_identifier() {
+    var unit = parseCompilationUnit('''
+// @dart = blat
+library foo;
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion, isNull);
+  }
+
+  void test_languageVersion_invalid_version() {
+    var unit = parseCompilationUnit('''
+// @dart = 2.x
+library foo;
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion, isNull);
+  }
+
+  void test_languageVersion_unspecified() {
+    var unit = parseCompilationUnit('''
+main() {}
+''') as CompilationUnitImpl;
+    expect(unit.languageVersion, isNull);
+  }
+
   void test_parseClassDeclaration_native_allowed() {
     allowNativeClause = true;
     test_parseClassDeclaration_native();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index fae0a92..13c908b 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -3933,13 +3933,26 @@
   }
 
   void test_invalidInterpolation_missingClosingBrace_issue35900() {
-    parseCompilationUnit(r"main () { print('${x' '); }", errors: [
-      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 23, 1),
-      expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 26, 1),
-      expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 3),
-      expectedError(ParserErrorCode.EXPECTED_STRING_LITERAL, 23, 1),
-      expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 27, 0),
-    ]);
+    parseCompilationUnit(r"main () { print('${x' '); }",
+        errors: usingFastaParser
+            ? [
+                expectedError(ScannerErrorCode.EXPECTED_TOKEN, 23, 1),
+                expectedError(
+                    ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 26, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 3),
+                expectedError(ParserErrorCode.EXPECTED_STRING_LITERAL, 23, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 27, 0),
+              ]
+            : [
+                expectedError(ScannerErrorCode.EXPECTED_TOKEN, 23, 1),
+                expectedError(
+                    ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 26, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 20, 3),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 23, 1),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 23, 1),
+                expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 23, 1),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 23, 1),
+              ]);
   }
 
   void test_invalidInterpolationIdentifier_startWithDigit() {
@@ -5364,6 +5377,20 @@
         errors: [expectedError(ParserErrorCode.TYPEDEF_IN_CLASS, 10, 7)]);
   }
 
+  void test_unexpectedCommaThenInterpolation() {
+    // https://github.com/Dart-Code/Dart-Code/issues/1548
+    parseCompilationUnit(r"main() { String s = 'a' 'b', 'c$foo'; return s; }",
+        errors: usingFastaParser
+            ? [
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 29, 2),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 29, 2),
+              ]
+            : [
+                expectedError(ParserErrorCode.MISSING_IDENTIFIER, 29, 2),
+                expectedError(ParserErrorCode.EXPECTED_TOKEN, 29, 1),
+              ]);
+  }
+
   void test_unexpectedTerminatorForParameterGroup_named() {
     createParser('(a, b})');
     FormalParameterList list = parser.parseFormalParameterList();
@@ -7888,6 +7915,18 @@
     expect(throwExpression.expression, isNotNull);
   }
 
+  void test_parseUnaryExpression_decrement_identifier_index() {
+    PrefixExpression expression = parseExpression('--a[0]');
+    expect(expression, isNotNull);
+    assertNoErrors();
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
+    expect(expression.operand, isNotNull);
+    IndexExpression operand = expression.operand as IndexExpression;
+    expect(operand.realTarget, const TypeMatcher<SimpleIdentifier>());
+    expect(operand.index is IntegerLiteral, isTrue);
+  }
+
   void test_parseUnaryExpression_decrement_normal() {
     PrefixExpression expression = parseUnaryExpression('--x');
     expect(expression, isNotNull);
@@ -7940,6 +7979,18 @@
     expect(operand.operand, isNotNull);
   }
 
+  void test_parseUnaryExpression_increment_identifier_index() {
+    PrefixExpression expression = parseExpression('++a[0]');
+    expect(expression, isNotNull);
+    assertNoErrors();
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
+    IndexExpression operand = expression.operand as IndexExpression;
+    expect(operand.realTarget, const TypeMatcher<SimpleIdentifier>());
+    expect(operand.index is IntegerLiteral, isTrue);
+  }
+
   void test_parseUnaryExpression_increment_normal() {
     PrefixExpression expression = parseUnaryExpression('++x');
     expect(expression, isNotNull);
@@ -7973,6 +8024,18 @@
     expect(operand.propertyName.name, "x");
   }
 
+  void test_parseUnaryExpression_minus_identifier_index() {
+    PrefixExpression expression = parseExpression('-a[0]');
+    expect(expression, isNotNull);
+    assertNoErrors();
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    expect(expression.operand, isNotNull);
+    IndexExpression operand = expression.operand as IndexExpression;
+    expect(operand.realTarget, const TypeMatcher<SimpleIdentifier>());
+    expect(operand.index is IntegerLiteral, isTrue);
+  }
+
   void test_parseUnaryExpression_minus_normal() {
     PrefixExpression expression = parseUnaryExpression('-x');
     expect(expression, isNotNull);
@@ -8026,6 +8089,18 @@
     expect(expression.operator.type, TokenType.TILDE);
     expect(expression.operand, isNotNull);
   }
+
+  void test_parseUnaryExpression_tilde_identifier_index() {
+    PrefixExpression expression = parseExpression('~a[0]');
+    expect(expression, isNotNull);
+    assertNoErrors();
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.TILDE);
+    expect(expression.operand, isNotNull);
+    IndexExpression operand = expression.operand as IndexExpression;
+    expect(operand.realTarget, const TypeMatcher<SimpleIdentifier>());
+    expect(operand.index is IntegerLiteral, isTrue);
+  }
 }
 
 /**
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index a90bde8..3da22d1 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -168,7 +168,7 @@
 @reflectiveTest
 class ErrorResolverTest extends DriverResolutionTest {
   test_breakLabelOnSwitchMember() async {
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 class A {
   void m(int i) {
     switch (i) {
@@ -182,7 +182,7 @@
   }
 
   test_continueLabelOnSwitch() async {
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 class A {
   void m(int i) {
     l: switch (i) {
@@ -201,7 +201,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       ParserErrorCode.MISSING_FUNCTION_PARAMETERS,
       ParserErrorCode.EXPECTED_TOKEN
     ]);
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 7924563..47bfbff 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -715,7 +715,8 @@
   a.f = a.f.toString();
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    assertTestErrorsWithCodes(
+        [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verifyTestResolved();
   }
 
@@ -795,7 +796,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
     verifyTestResolved();
   }
 
@@ -823,7 +824,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
     verifyTestResolved();
   }
 
@@ -862,7 +863,7 @@
   b[0][0] = 'hi';
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verifyTestResolved();
   }
 
@@ -903,7 +904,8 @@
 class B {}
 class C = Object with A;''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verifyTestResolved();
 
     var a = findElement.class_('A');
@@ -917,7 +919,7 @@
 }
 class C = Object with A;''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR],
     );
     verifyTestResolved();
@@ -949,7 +951,7 @@
 }
 class C = Object with A;''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
     verifyTestResolved();
 
     var a = findElement.class_('A');
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index b6ba562..25a512d 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -18,23 +18,15 @@
 
 import 'analysis_context_factory.dart';
 
-/**
- * The class `EngineTestCase` defines utility methods for making assertions.
- */
+/// The class `EngineTestCase` defines utility methods for making assertions.
 class EngineTestCase {
-  /**
-   * Flag indicating whether the fasta parser is being used.
-   */
+  /// Return `true` if the fasta parser is being used.
   bool get usingFastaParser => Parser.useFasta;
 
-  /**
-   * Assert that the given collection has the same number of elements as the number of specified
-   * names, and that for each specified name, a corresponding element can be found in the given
-   * collection with that name.
-   *
-   * @param elements the elements
-   * @param names the names
-   */
+  /// Assert that the given collection of [elements] has the same number of
+  /// elements as the number of specified [names], and that for each specified
+  /// name, a corresponding element can be found in the given collection with
+  /// that name.
   void assertNamedElements(List<Element> elements, List<String> names) {
     for (String elemName in names) {
       bool found = false;
@@ -64,13 +56,8 @@
         resourceProvider: new MemoryResourceProvider());
   }
 
-  /**
-   * Return the getter in the given type with the given name. Inherited getters are ignored.
-   *
-   * @param type the type in which the getter is declared
-   * @param getterName the name of the getter to be returned
-   * @return the property accessor element representing the getter with the given name
-   */
+  /// Return the getter in the given [type] with the given [name]. Inherited
+  /// getters are ignored.
   PropertyAccessorElement getGetter(InterfaceType type, String getterName) {
     for (PropertyAccessorElement accessor in type.element.accessors) {
       if (accessor.isGetter && accessor.name == getterName) {
@@ -80,13 +67,8 @@
     fail("Could not find getter named $getterName in ${type.displayName}");
   }
 
-  /**
-   * Return the method in the given type with the given name. Inherited methods are ignored.
-   *
-   * @param type the type in which the method is declared
-   * @param methodName the name of the method to be returned
-   * @return the method element representing the method with the given name
-   */
+  /// Return the method in the given [type] with the given [name]. Inherited
+  /// methods are ignored.
   MethodElement getMethod(InterfaceType type, String methodName) {
     for (MethodElement method in type.element.methods) {
       if (method.name == methodName) {
@@ -100,9 +82,7 @@
 
   void tearDown() {}
 
-  /**
-   * @return the [AstNode] with requested type at offset of the "prefix".
-   */
+  /// Return the [AstNode] with requested type at offset of the [prefix].
   static AstNode findNode(
       AstNode root, String code, String prefix, Predicate<AstNode> predicate) {
     int offset = code.indexOf(prefix);
@@ -113,9 +93,7 @@
     return node.thisOrAncestorMatching(predicate);
   }
 
-  /**
-   * Find the [SimpleIdentifier] with at offset of the "prefix".
-   */
+  /// Find the [SimpleIdentifier] with at offset of the [prefix].
   static SimpleIdentifier findSimpleIdentifier(
       AstNode root, String code, String prefix) {
     int offset = code.indexOf(prefix);
@@ -126,110 +104,144 @@
   }
 }
 
-/**
- * A description of an error that is expected to be reported.
- */
+/// A description of an error that is expected to be reported.
 class ExpectedError {
-  /**
-   * An empty array of error descriptors used when no errors are expected.
-   */
+  /// An empty array of error descriptors used when no errors are expected.
   static List<ExpectedError> NO_ERRORS = <ExpectedError>[];
 
-  /**
-   * The error code associated with the error.
-   */
+  /// The error code associated with the error.
   final ErrorCode code;
 
-  /**
-   * The offset of the beginning of the error's region.
-   */
+  /// The offset of the beginning of the error's region.
   final int offset;
 
-  /**
-   * The offset of the beginning of the error's region.
-   */
+  /// The offset of the beginning of the error's region.
   final int length;
 
-  /**
-   * Initialize a newly created error description.
-   */
+  /// Initialize a newly created error description.
   ExpectedError(this.code, this.offset, this.length);
+
+  /// Return `true` if the [error] matches this description of what it's
+  /// expected to be.
+  bool matches(AnalysisError error) {
+    return error.offset == offset &&
+        error.length == length &&
+        error.errorCode == code;
+  }
 }
 
-/**
- * An error listener that collects all of the errors passed to it for later
- * examination.
- */
+/// An error listener that collects all of the errors passed to it for later
+/// examination.
 class GatheringErrorListener implements AnalysisErrorListener {
-  /**
-   * A flag indicating whether error ranges are to be compared when comparing
-   * expected and actual errors.
-   */
+  /// A flag indicating whether error ranges are to be compared when comparing
+  /// expected and actual errors.
   final bool checkRanges;
 
-  /**
-   * A list containing the errors that were collected.
-   */
+  /// A list containing the errors that were collected.
   List<AnalysisError> _errors = <AnalysisError>[];
 
-  /**
-   * A table mapping sources to the line information for the source.
-   */
+  /// A table mapping sources to the line information for the source.
   Map<Source, LineInfo> _lineInfoMap = <Source, LineInfo>{};
 
-  /**
-   * Initialize a newly created error listener to collect errors.
-   */
+  /// Initialize a newly created error listener to collect errors.
   GatheringErrorListener({this.checkRanges = Parser.useFasta});
 
-  /**
-   * Return the errors that were collected.
-   */
+  /// Return the errors that were collected.
   List<AnalysisError> get errors => _errors;
 
-  /**
-   * Return `true` if at least one error has been gathered.
-   */
+  /// Return `true` if at least one error has been gathered.
   bool get hasErrors => _errors.length > 0;
 
-  /**
-   * Add the given [errors] to this listener.
-   */
+  /// Add the given [errors] to this listener.
   void addAll(List<AnalysisError> errors) {
     for (AnalysisError error in errors) {
       onError(error);
     }
   }
 
-  /**
-   * Add all of the errors recorded by the given [listener] to this listener.
-   */
+  /// Add all of the errors recorded by the given [listener] to this listener.
   void addAll2(RecordingErrorListener listener) {
     addAll(listener.errors);
   }
 
-  /**
-   * Assert that the number of errors that have been gathered matches the number
-   * of [expectedErrors] and that they have the expected error codes and
-   * locations. The order in which the errors were gathered is ignored.
-   */
+  /// Assert that the number of errors that have been gathered matches the
+  /// number of [expectedErrors] and that they have the expected error codes and
+  /// locations. The order in which the errors were gathered is ignored.
   void assertErrors(List<ExpectedError> expectedErrors) {
-    if (_errors.length != expectedErrors.length) {
-      _fail(expectedErrors);
-    }
-    List<ExpectedError> remainingErrors = expectedErrors.toList();
-    for (AnalysisError error in _errors) {
-      if (!_foundAndRemoved(remainingErrors, error)) {
-        _fail(expectedErrors);
+    //
+    // Match actual errors to expected errors.
+    //
+    List<AnalysisError> unmatchedActual = errors.toList();
+    List<ExpectedError> unmatchedExpected = expectedErrors.toList();
+    int actualIndex = 0;
+    while (actualIndex < unmatchedActual.length) {
+      bool matchFound = false;
+      int expectedIndex = 0;
+      while (expectedIndex < unmatchedExpected.length) {
+        if (unmatchedExpected[expectedIndex]
+            .matches(unmatchedActual[actualIndex])) {
+          matchFound = true;
+          unmatchedActual.removeAt(actualIndex);
+          unmatchedExpected.removeAt(expectedIndex);
+          break;
+        }
+        expectedIndex++;
       }
+      if (!matchFound) {
+        actualIndex++;
+      }
+    }
+    //
+    // Write the results.
+    //
+    StringBuffer buffer = new StringBuffer();
+    if (unmatchedExpected.isNotEmpty) {
+      buffer.writeln('Expected but did not find:');
+      for (ExpectedError expected in unmatchedExpected) {
+        buffer.write('  ');
+        buffer.write(expected.code);
+        buffer.write(' [');
+        buffer.write(expected.offset);
+        buffer.write(', ');
+        buffer.write(expected.length);
+        buffer.writeln(']');
+      }
+    }
+    if (unmatchedActual.isNotEmpty) {
+      if (buffer.isNotEmpty) {
+        buffer.writeln();
+      }
+      buffer.writeln('Found but did not expect:');
+      for (AnalysisError actual in unmatchedActual) {
+        buffer.write('  ');
+        buffer.write(actual.errorCode);
+        buffer.write(' [');
+        buffer.write(actual.offset);
+        buffer.write(', ');
+        buffer.write(actual.length);
+        buffer.writeln(']');
+      }
+    }
+    if (buffer.isNotEmpty) {
+      errors.sort((first, second) => first.offset.compareTo(second.offset));
+      buffer.writeln();
+      buffer.writeln('To accept the current state, expect:');
+      for (AnalysisError actual in errors) {
+        buffer.write('  error(');
+        buffer.write(actual.errorCode);
+        buffer.write(', ');
+        buffer.write(actual.offset);
+        buffer.write(', ');
+        buffer.write(actual.length);
+        buffer.writeln('),');
+      }
+      fail(buffer.toString());
     }
   }
 
-  /**
-   * Assert that the number of errors that have been gathered matches the number
-   * of [expectedErrorCodes] and that they have the expected error codes. The
-   * order in which the errors were gathered is ignored.
-   */
+  /// Assert that the number of errors that have been gathered matches the
+  /// number of [expectedErrorCodes] and that they have the expected error
+  /// codes. The order in which the errors were gathered is ignored.
   void assertErrorsWithCodes(
       [List<ErrorCode> expectedErrorCodes = const <ErrorCode>[]]) {
     StringBuffer buffer = new StringBuffer();
@@ -310,12 +322,10 @@
     }
   }
 
-  /**
-   * Assert that the number of errors that have been gathered matches the number
-   * of [expectedSeverities] and that there are the same number of errors and
-   * warnings as specified by the argument. The order in which the errors were
-   * gathered is ignored.
-   */
+  /// Assert that the number of errors that have been gathered matches the
+  /// number of [expectedSeverities] and that there are the same number of
+  /// errors and warnings as specified by the argument. The order in which the
+  /// errors were gathered is ignored.
   void assertErrorsWithSeverities(List<ErrorSeverity> expectedSeverities) {
     int expectedErrorCount = 0;
     int expectedWarningCount = 0;
@@ -337,27 +347,23 @@
     }
     if (expectedErrorCount != actualErrorCount ||
         expectedWarningCount != actualWarningCount) {
-      fail(
-          "Expected $expectedErrorCount errors and $expectedWarningCount warnings, found $actualErrorCount errors and $actualWarningCount warnings");
+      fail("Expected $expectedErrorCount errors "
+          "and $expectedWarningCount warnings, "
+          "found $actualErrorCount errors "
+          "and $actualWarningCount warnings");
     }
   }
 
-  /**
-   * Assert that no errors have been gathered.
-   */
+  /// Assert that no errors have been gathered.
   void assertNoErrors() {
     assertErrors(ExpectedError.NO_ERRORS);
   }
 
-  /**
-   * Return the line information associated with the given [source], or `null`
-   * if no line information has been associated with the source.
-   */
+  /// Return the line information associated with the given [source], or `null`
+  /// if no line information has been associated with the source.
   LineInfo getLineInfo(Source source) => _lineInfoMap[source];
 
-  /**
-   * Return `true` if an error with the given [errorCode] has been gathered.
-   */
+  /// Return `true` if an error with the given [errorCode] has been gathered.
   bool hasError(ErrorCode errorCode) {
     for (AnalysisError error in _errors) {
       if (identical(error.errorCode, errorCode)) {
@@ -372,79 +378,17 @@
     _errors.add(error);
   }
 
-  /**
-   * Set the line information associated with the given [source] to the given
-   * list of [lineStarts].
-   */
+  /// Set the line information associated with the given [source] to the given
+  /// list of [lineStarts].
   void setLineInfo(Source source, List<int> lineStarts) {
     _lineInfoMap[source] = new LineInfo(lineStarts);
   }
-
-  /**
-   * Return `true` if the [actualError] matches the [expectedError].
-   */
-  bool _equalErrors(ExpectedError expectedError, AnalysisError actualError) {
-    if (!identical(expectedError.code, actualError.errorCode)) {
-      return false;
-    } else if (!checkRanges) {
-      return true;
-    }
-    return expectedError.offset == actualError.offset &&
-        expectedError.length == actualError.length;
-  }
-
-  /**
-   * Assert that the number of errors that have been gathered matches the number
-   * of [expectedErrors] and that they have the expected error codes. The order
-   * in which the errors were gathered is ignored.
-   */
-  void _fail(List<ExpectedError> expectedErrors) {
-    StringBuffer buffer = new StringBuffer();
-    buffer.write("Expected ");
-    buffer.write(expectedErrors.length);
-    buffer.write(" errors:");
-    for (ExpectedError error in expectedErrors) {
-      buffer.writeln();
-      int offset = error.offset;
-      buffer.write('  ${error.code} ($offset..${offset + error.length})');
-    }
-    buffer.writeln();
-    buffer.write("found ");
-    buffer.write(_errors.length);
-    buffer.write(" errors:");
-    for (AnalysisError error in _errors) {
-      buffer.writeln();
-      int offset = error.offset;
-      buffer.write('  ${error.errorCode} '
-          '($offset..${offset + error.length}): ${error.message}');
-    }
-    fail(buffer.toString());
-  }
-
-  /**
-   * Search through the given list of [errors] for an error that is equal to the
-   * [targetError]. If one is found, remove it from the list and return `true`,
-   * otherwise return `false` without modifying the list.
-   */
-  bool _foundAndRemoved(List<ExpectedError> errors, AnalysisError targetError) {
-    for (ExpectedError error in errors) {
-      if (_equalErrors(error, targetError)) {
-        errors.remove(error);
-        return true;
-      }
-    }
-    return false;
-  }
 }
 
-/**
- * Instances of the class [TestLogger] implement a logger that can be used by
- * tests.
- */
+/// Instances of the class [TestLogger] implement a logger that can be used by
+/// tests.
 class TestLogger implements Logger {
-  /**
-   * All logged messages.
-   */
+  /// All logged messages.
   List<String> log = [];
 
   @override
@@ -464,15 +408,11 @@
   int _modificationStamp = 0;
   bool exists2 = true;
 
-  /**
-   * A flag indicating whether an exception should be generated when an attempt
-   * is made to access the contents of this source.
-   */
+  /// A flag indicating whether an exception should be generated when an attempt
+  /// is made to access the contents of this source.
   bool generateExceptionOnRead = false;
 
-  /**
-   * The number of times that the contents of this source have been requested.
-   */
+  /// The number of times that the contents of this source have been requested.
   int readCount = 0;
 
   TestSource([this._name = '/test.dart', this._contents]);
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 190bc9b..9084e64 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -35,9 +35,33 @@
     defineReflectiveTests(StrongGenericFunctionInferenceTest);
     defineReflectiveTests(StrongLeastUpperBoundTest);
     defineReflectiveTests(StrongGreatestLowerBoundTest);
+    defineReflectiveTests(TypeSystemTest);
   });
 }
 
+abstract class AbstractTypeSystemTest {
+  TypeProvider typeProvider;
+  Dart2TypeSystem typeSystem;
+
+  DartType get bottomType => typeProvider.bottomType;
+  InterfaceType get doubleType => typeProvider.doubleType;
+  DartType get dynamicType => typeProvider.dynamicType;
+  InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get intType => typeProvider.intType;
+  InterfaceType get iterableType => typeProvider.iterableType;
+  InterfaceType get listType => typeProvider.listType;
+  DartType get nullType => typeProvider.nullType;
+  InterfaceType get numType => typeProvider.numType;
+  InterfaceType get objectType => typeProvider.objectType;
+  InterfaceType get stringType => typeProvider.stringType;
+  DartType get voidType => VoidTypeImpl.instance;
+
+  void setUp() {
+    typeProvider = new TestTypeProvider();
+    typeSystem = new Dart2TypeSystem(typeProvider);
+  }
+}
+
 /**
  * Base class for testing LUB and GLB in spec and strong mode.
  */
@@ -826,26 +850,7 @@
 }
 
 @reflectiveTest
-class StrongAssignabilityTest {
-  TypeProvider typeProvider;
-  TypeSystem typeSystem;
-
-  DartType get bottomType => typeProvider.bottomType;
-  InterfaceType get doubleType => typeProvider.doubleType;
-  DartType get dynamicType => typeProvider.dynamicType;
-  InterfaceType get functionType => typeProvider.functionType;
-  InterfaceType get intType => typeProvider.intType;
-  InterfaceType get listType => typeProvider.listType;
-  InterfaceType get numType => typeProvider.numType;
-  InterfaceType get objectType => typeProvider.objectType;
-  InterfaceType get stringType => typeProvider.stringType;
-  DartType get voidType => VoidTypeImpl.instance;
-
-  void setUp() {
-    typeProvider = new TestTypeProvider();
-    typeSystem = new Dart2TypeSystem(typeProvider);
-  }
-
+class StrongAssignabilityTest extends AbstractTypeSystemTest {
   void test_isAssignableTo_bottom_isBottom() {
     DartType interfaceType = ElementFactory.classElement2('A', []).type;
     List<DartType> interassignable = <DartType>[
@@ -1111,28 +1116,7 @@
 }
 
 @reflectiveTest
-class StrongGenericFunctionInferenceTest {
-  TypeProvider typeProvider;
-  Dart2TypeSystem typeSystem;
-
-  DartType get bottomType => typeProvider.bottomType;
-  InterfaceType get doubleType => typeProvider.doubleType;
-  DartType get dynamicType => typeProvider.dynamicType;
-  InterfaceType get functionType => typeProvider.functionType;
-  InterfaceType get intType => typeProvider.intType;
-  InterfaceType get iterableType => typeProvider.iterableType;
-  InterfaceType get listType => typeProvider.listType;
-  DartType get nullType => typeProvider.nullType;
-  InterfaceType get numType => typeProvider.numType;
-  InterfaceType get objectType => typeProvider.objectType;
-  InterfaceType get stringType => typeProvider.stringType;
-  DartType get voidType => VoidTypeImpl.instance;
-
-  void setUp() {
-    typeProvider = new TestTypeProvider();
-    typeSystem = new Dart2TypeSystem(typeProvider);
-  }
-
+class StrongGenericFunctionInferenceTest extends AbstractTypeSystemTest {
   void test_boundedByAnotherTypeParameter() {
     // <TFrom, TTo extends Iterable<TFrom>>(TFrom) -> TTo
     var tFrom = TypeBuilder.variable('TFrom');
@@ -2293,3 +2277,167 @@
   static TypeParameterType variable(String name, {DartType bound}) =>
       ElementFactory.typeParameterWithType(name, bound).type;
 }
+
+@reflectiveTest
+class TypeSystemTest extends AbstractTypeSystemTest {
+  DartType get futureOrWithNoneType =>
+      typeProvider.futureOrType.instantiate([noneType]);
+  DartType get futureOrWithQuestionType =>
+      typeProvider.futureOrType.instantiate([questionType]);
+  DartType get futureOrWithStarType =>
+      typeProvider.futureOrType.instantiate([starType]);
+
+  DartType get noneType => (typeProvider.stringType as TypeImpl)
+      .withNullability(NullabilitySuffix.none);
+
+  DartType get questionType => (typeProvider.stringType as TypeImpl)
+      .withNullability(NullabilitySuffix.question);
+
+  DartType get starType => (typeProvider.stringType as TypeImpl)
+      .withNullability(NullabilitySuffix.star);
+
+  test_isNonNullable_dynamic() {
+    expect(typeSystem.isNonNullable(dynamicType), false);
+  }
+
+  test_isNonNullable_futureOr_noneArg() {
+    expect(typeSystem.isNonNullable(futureOrWithNoneType), true);
+  }
+
+  test_isNonNullable_futureOr_questionArg() {
+    expect(typeSystem.isNonNullable(futureOrWithQuestionType), true);
+  }
+
+  test_isNonNullable_futureOr_starArg() {
+    expect(typeSystem.isNonNullable(futureOrWithStarType), true);
+  }
+
+  test_isNonNullable_none() {
+    expect(typeSystem.isNonNullable(noneType), true);
+  }
+
+  test_isNonNullable_null() {
+    expect(typeSystem.isNonNullable(nullType), false);
+  }
+
+  test_isNonNullable_question() {
+    expect(typeSystem.isNonNullable(questionType), false);
+  }
+
+  test_isNonNullable_star() {
+    expect(typeSystem.isNonNullable(starType), true);
+  }
+
+  test_isNonNullable_void() {
+    expect(typeSystem.isNonNullable(voidType), false);
+  }
+
+  test_isNullable_dynamic() {
+    expect(typeSystem.isNullable(dynamicType), true);
+  }
+
+  test_isNullable_futureOr_noneArg() {
+    expect(typeSystem.isNullable(futureOrWithNoneType), true);
+  }
+
+  test_isNullable_futureOr_questionArg() {
+    expect(typeSystem.isNullable(futureOrWithQuestionType), true);
+  }
+
+  test_isNullable_futureOr_starArg() {
+    expect(typeSystem.isNullable(futureOrWithStarType), true);
+  }
+
+  test_isNullable_none() {
+    expect(typeSystem.isNullable(noneType), false);
+  }
+
+  test_isNullable_null() {
+    expect(typeSystem.isNullable(nullType), true);
+  }
+
+  test_isNullable_question() {
+    expect(typeSystem.isNullable(questionType), true);
+  }
+
+  test_isNullable_star() {
+    expect(typeSystem.isNullable(starType), true);
+  }
+
+  test_isNullable_void() {
+    expect(typeSystem.isNullable(voidType), true);
+  }
+
+  test_isPotentiallyNonNullable_dynamic() {
+    expect(typeSystem.isPotentiallyNonNullable(dynamicType), false);
+  }
+
+  test_isPotentiallyNonNullable_futureOr_noneArg() {
+    expect(typeSystem.isPotentiallyNonNullable(futureOrWithNoneType), false);
+  }
+
+  test_isPotentiallyNonNullable_futureOr_questionArg() {
+    expect(
+        typeSystem.isPotentiallyNonNullable(futureOrWithQuestionType), false);
+  }
+
+  test_isPotentiallyNonNullable_futureOr_starArg() {
+    expect(typeSystem.isPotentiallyNonNullable(futureOrWithStarType), false);
+  }
+
+  test_isPotentiallyNonNullable_none() {
+    expect(typeSystem.isPotentiallyNonNullable(noneType), true);
+  }
+
+  test_isPotentiallyNonNullable_null() {
+    expect(typeSystem.isPotentiallyNonNullable(nullType), false);
+  }
+
+  test_isPotentiallyNonNullable_question() {
+    expect(typeSystem.isPotentiallyNonNullable(questionType), false);
+  }
+
+  test_isPotentiallyNonNullable_star() {
+    expect(typeSystem.isPotentiallyNonNullable(starType), false);
+  }
+
+  test_isPotentiallyNonNullable_void() {
+    expect(typeSystem.isPotentiallyNonNullable(voidType), false);
+  }
+
+  test_isPotentiallyNullable_dynamic() {
+    expect(typeSystem.isPotentiallyNullable(dynamicType), true);
+  }
+
+  test_isPotentiallyNullable_futureOr_noneArg() {
+    expect(typeSystem.isPotentiallyNullable(futureOrWithNoneType), false);
+  }
+
+  test_isPotentiallyNullable_futureOr_questionArg() {
+    expect(typeSystem.isPotentiallyNullable(futureOrWithQuestionType), false);
+  }
+
+  test_isPotentiallyNullable_futureOr_starArg() {
+    expect(typeSystem.isPotentiallyNullable(futureOrWithStarType), false);
+  }
+
+  test_isPotentiallyNullable_none() {
+    expect(typeSystem.isPotentiallyNullable(noneType), false);
+  }
+
+  test_isPotentiallyNullable_null() {
+    expect(typeSystem.isPotentiallyNullable(nullType), true);
+  }
+
+  test_isPotentiallyNullable_question() {
+    expect(typeSystem.isPotentiallyNullable(questionType), true);
+  }
+
+  test_isPotentiallyNullable_star() {
+    expect(typeSystem.isPotentiallyNullable(starType), false);
+  }
+
+  test_isPotentiallyNullable_void() {
+    expect(typeSystem.isPotentiallyNullable(voidType), true);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index a49a209..f384b0d 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -32,7 +32,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
     assertElement(findNode.simple('foo; // ref'), findElement.getter('foo'));
   }
 
@@ -50,7 +51,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
     assertElement(
       findNode.simple('foo; // ref'),
       findElement.getter('foo', of: 'Foo'),
@@ -69,7 +71,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
     assertElement(findNode.simple('foo; // ref'), findElement.method('foo'));
   }
 
@@ -155,7 +158,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
     assertElement(findNode.simple('foo = 0;'), findElement.setter('foo'));
   }
 
@@ -167,7 +171,8 @@
 class C extends A implements B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES]);
   }
 
   test_conflictingGenericInterfaces_viaMixin() async {
@@ -178,7 +183,8 @@
 class C extends A with B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES]);
   }
 
   test_element_allSupertypes() async {
@@ -296,7 +302,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
     ]);
   }
@@ -309,7 +315,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
     ]);
   }
@@ -346,7 +352,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
     ]);
   }
@@ -359,7 +365,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD,
     ]);
   }
@@ -398,7 +404,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD]);
   }
 
   test_error_conflictingFieldAndMethod_inSuper_getter() async {
@@ -411,7 +418,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD]);
   }
 
   test_error_conflictingFieldAndMethod_inSuper_setter() async {
@@ -424,7 +432,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD]);
   }
 
   test_error_conflictingMethodAndField_inSuper_field() async {
@@ -437,7 +446,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD]);
   }
 
   test_error_conflictingMethodAndField_inSuper_getter() async {
@@ -450,7 +460,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD]);
   }
 
   test_error_conflictingMethodAndField_inSuper_setter() async {
@@ -463,7 +474,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_getter_getter() async {
@@ -474,7 +486,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_getter_method() async {
@@ -485,7 +498,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_getter_setter() async {
@@ -496,7 +510,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_method_getter() async {
@@ -507,7 +522,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_method_method() async {
@@ -518,7 +534,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_method_setter() async {
@@ -529,7 +546,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_setter_getter() async {
@@ -540,7 +558,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_setter_method() async {
@@ -551,7 +570,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_setter_setter() async {
@@ -562,7 +582,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_getter_getter() async {
@@ -575,7 +596,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_getter_method() async {
@@ -588,7 +610,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_getter_setter() async {
@@ -601,7 +624,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_method_getter() async {
@@ -614,7 +638,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_method_method() async {
@@ -627,7 +652,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_method_setter() async {
@@ -640,7 +666,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_setter_method() async {
@@ -653,7 +680,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_setter_setter() async {
@@ -666,7 +694,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_getter_getter() async {
@@ -679,7 +708,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_getter_method() async {
@@ -692,7 +722,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_getter_setter() async {
@@ -705,7 +736,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_method_getter() async {
@@ -718,7 +750,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_method_method() async {
@@ -731,7 +764,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_method_setter() async {
@@ -744,7 +778,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_setter_method() async {
@@ -757,7 +792,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inMixin_setter_setter() async {
@@ -770,7 +806,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_getter_getter() async {
@@ -783,7 +820,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_getter_method() async {
@@ -796,7 +834,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_getter_setter() async {
@@ -809,7 +848,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_method_getter() async {
@@ -822,7 +862,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_method_method() async {
@@ -835,7 +876,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_method_setter() async {
@@ -848,7 +890,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_setter_method() async {
@@ -861,7 +904,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inSuper_setter_setter() async {
@@ -874,7 +918,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_duplicateConstructorDefault() async {
@@ -885,7 +930,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
     ]);
   }
@@ -898,7 +943,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
     ]);
   }
@@ -911,7 +956,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_field_field_static() async {
@@ -922,7 +967,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_field_getter() async {
@@ -933,7 +978,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_field_method() async {
@@ -944,7 +989,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_getter_getter() async {
@@ -955,7 +1000,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_getter_method() async {
@@ -966,7 +1011,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_method_getter() async {
@@ -977,7 +1022,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_method_method() async {
@@ -988,7 +1033,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_method_setter() async {
@@ -999,7 +1044,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_OK_fieldFinal_setter() async {
@@ -1043,7 +1088,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_setter_setter() async {
@@ -1054,7 +1099,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_extendsNonClass_dynamic() async {
@@ -1062,7 +1107,7 @@
 class A extends dynamic {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.EXTENDS_NON_CLASS,
     ]);
 
@@ -1076,7 +1121,7 @@
 class A extends E {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.EXTENDS_NON_CLASS,
     ]);
 
@@ -1093,7 +1138,7 @@
 class A extends M {} // ref
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.EXTENDS_NON_CLASS,
     ]);
 
@@ -1110,7 +1155,7 @@
 class A extends v {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.EXTENDS_NON_CLASS,
     ]);
 
@@ -1124,7 +1169,7 @@
 class B implements A, A {} // ref
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
 
     var a = findElement.class_('A');
     assertTypeName(findNode.typeName('A, A {} // ref'), a, 'A');
@@ -1136,7 +1181,7 @@
 class A {} class C{}
 class B implements A, A, A, A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.IMPLEMENTS_REPEATED,
       CompileTimeErrorCode.IMPLEMENTS_REPEATED,
       CompileTimeErrorCode.IMPLEMENTS_REPEATED
@@ -1150,7 +1195,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
   }
 
   test_error_memberWithClassName_getter_static() async {
@@ -1160,7 +1205,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
 
     var method = findNode.methodDeclaration('C =>');
     expect(method.isGetter, isTrue);
@@ -1175,7 +1220,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
   }
 
   test_error_memberWithClassName_setter_static() async {
@@ -1185,7 +1230,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
 
     var method = findNode.methodDeclaration('C(_)');
     expect(method.isSetter, isTrue);
@@ -1200,7 +1245,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
     ]);
   }
@@ -1220,7 +1265,7 @@
 abstract class X implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
     ]);
   }
@@ -1307,7 +1352,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
     ]);
   }
@@ -1320,7 +1365,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
     ]);
   }
@@ -1336,7 +1381,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
     ]);
   }
@@ -1352,7 +1397,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
     ]);
   }
@@ -1368,7 +1413,7 @@
 abstract class C implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1384,7 +1429,7 @@
 abstract class C implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1400,7 +1445,7 @@
 abstract class C implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1416,7 +1461,7 @@
 abstract class C implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
@@ -1432,7 +1477,7 @@
 abstract class C implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
@@ -1458,7 +1503,7 @@
 class A extends B {}
 class B extends A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1469,7 +1514,7 @@
 class A extends B {}
 class B implements A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1480,7 +1525,7 @@
 class A implements B {}
 class B implements A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1491,7 +1536,7 @@
 class M1 = Object with M2;
 class M2 = Object with M1;''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1506,7 +1551,7 @@
 class M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
     ]);
@@ -1517,7 +1562,7 @@
 abstract class A implements A {}
 class B implements A {}''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
         [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS]);
   }
 
@@ -1527,7 +1572,7 @@
 abstract class B implements A {}
 class C implements A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1540,7 +1585,7 @@
 abstract class C implements A {}
 class D implements A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
@@ -1550,7 +1595,7 @@
   test_recursiveInterfaceInheritanceExtends() async {
     addTestFile("class A extends A {}");
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
         [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS]);
   }
 
@@ -1562,7 +1607,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS,
     ]);
   }
@@ -1570,7 +1615,7 @@
   test_recursiveInterfaceInheritanceImplements() async {
     addTestFile("class A implements A {}");
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
         [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS]);
   }
 
@@ -1580,14 +1625,14 @@
 class M {}
 class B = A with M implements B;''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
         [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS]);
   }
 
   test_recursiveInterfaceInheritanceWith() async {
     addTestFile("class M = Object with M;");
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH,
     ]);
   }
@@ -1601,7 +1646,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_GETTER]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_GETTER]);
   }
 
   test_undefinedSuperMethod() async {
@@ -1613,7 +1658,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
   }
 
   test_undefinedSuperOperator_binaryExpression() async {
@@ -1625,7 +1670,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   test_undefinedSuperOperator_indexBoth() async {
@@ -1637,7 +1682,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
       StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
     ]);
@@ -1652,7 +1697,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   test_undefinedSuperOperator_indexSetter() async {
@@ -1664,7 +1709,7 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
   }
 
   test_undefinedSuperSetter() async {
@@ -1676,6 +1721,6 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_SETTER]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_SETTER]);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index 39a9d4a..0283b13 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -142,7 +142,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONST_NOT_INITIALIZED,
       CompileTimeErrorCode.CONST_NOT_INITIALIZED,
     ]);
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index c21ca09..c731596 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -27,7 +27,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_inference_listLiteral() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
index a3cadc7..7974854 100644
--- a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
@@ -29,7 +29,7 @@
 C<G> x;
 ''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
     );
   }
@@ -41,7 +41,7 @@
 C<Function<S>()> x;
 ''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
     );
   }
@@ -55,7 +55,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
     );
   }
@@ -69,7 +69,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
     );
   }
@@ -85,7 +85,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
     );
   }
@@ -97,7 +97,7 @@
 F<Function<S>()> x;
 ''');
     await resolveTestFile();
-    assertTestErrors(
+    assertTestErrorsWithCodes(
       [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
     );
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart b/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
index cb5ac0b..b9e9d61 100644
--- a/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
@@ -29,7 +29,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
     ]);
 
@@ -70,7 +70,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
     ]);
 
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index 8bfb1f0..98ee882 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -19,6 +19,24 @@
     with InstanceCreationResolutionMixin {}
 
 mixin InstanceCreationResolutionMixin implements ResolutionTest {
+  test_error_newWithInvalidTypeParameters_implicitNew_inference_top() async {
+    addTestFile(r'''
+final foo = Map<int>();
+''');
+    await resolveTestFile();
+    assertTestErrorsWithCodes([
+      StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS,
+    ]);
+
+    var creation = findNode.instanceCreation('Map<int>');
+    assertInstanceCreation(
+      creation,
+      mapElement,
+      'Map<dynamic, dynamic>',
+      expectedConstructorMember: true,
+    );
+  }
+
   test_error_wrongNumberOfTypeArgumentsConstructor_explicitNew() async {
     addTestFile(r'''
 class Foo<X> {
@@ -30,7 +48,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
     ]);
 
@@ -45,24 +63,6 @@
 //    );
   }
 
-  test_error_newWithInvalidTypeParameters_implicitNew_inference_top() async {
-    addTestFile(r'''
-final foo = Map<int>();
-''');
-    await resolveTestFile();
-    assertTestErrors([
-      StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS,
-    ]);
-
-    var creation = findNode.instanceCreation('Map<int>');
-    assertInstanceCreation(
-      creation,
-      mapElement,
-      'Map<dynamic, dynamic>',
-      expectedConstructorMember: true,
-    );
-  }
-
   test_error_wrongNumberOfTypeArgumentsConstructor_explicitNew_prefix() async {
     newFile('/test/lib/a.dart', content: '''
 class Foo<X> {
@@ -77,7 +77,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
     ]);
 
@@ -105,7 +105,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
     ]);
 
@@ -133,7 +133,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
     ]);
 
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index f5a709a..307d438 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -31,7 +31,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
 
     var invocation = findNode.methodInvocation('foo(0)');
     assertMethodInvocation(
@@ -55,7 +56,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
 
     var invocation = findNode.methodInvocation('foo(0)');
     assertMethodInvocation(
@@ -79,7 +81,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
 
     var invocation = findNode.methodInvocation('foo(); // ref');
     assertMethodInvocation(
@@ -187,7 +190,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.AMBIGUOUS_IMPORT,
     ]);
 
@@ -213,7 +216,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.AMBIGUOUS_IMPORT,
     ]);
 
@@ -233,7 +236,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
     ]);
     _assertInvalidInvocation(
@@ -254,7 +257,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
     ]);
     _assertInvalidInvocation(
@@ -271,7 +274,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
     ]);
     _assertInvalidInvocation(
@@ -396,7 +399,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
     ]);
     _assertInvalidInvocation(
@@ -417,7 +420,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
     ]);
     _assertInvalidInvocation(
@@ -440,7 +443,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
     ]);
     _assertInvalidInvocation(
@@ -463,7 +466,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
     ]);
 
@@ -487,7 +490,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
     ]);
 
@@ -511,7 +514,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
     ]);
     _assertInvalidInvocation(
@@ -528,7 +531,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_FUNCTION,
     ]);
     _assertUnresolvedMethodInvocation('foo(0)');
@@ -543,7 +546,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_FUNCTION,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -556,7 +559,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.UNDEFINED_IDENTIFIER,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -570,7 +573,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -586,7 +589,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
 
@@ -607,7 +610,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -622,7 +625,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
 
@@ -637,7 +640,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('C.T();');
@@ -650,7 +653,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -664,7 +667,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -679,7 +682,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -692,7 +695,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
   }
@@ -724,7 +727,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('_foo(0);');
@@ -741,7 +744,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
   }
@@ -756,7 +759,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_METHOD,
     ]);
   }
@@ -772,7 +775,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
     ]);
     _assertUnresolvedMethodInvocation('foo(0);');
@@ -792,7 +795,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
     ]);
 
@@ -816,7 +819,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.URI_DOES_NOT_EXIST,
     ]);
     _assertUnresolvedMethodInvocation('foo(1);');
@@ -836,7 +839,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.URI_DOES_NOT_EXIST,
     ]);
     _assertUnresolvedMethodInvocation('foo(1);');
@@ -854,7 +857,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     _assertInvalidInvocation(
@@ -873,7 +876,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     _assertInvalidInvocation(
@@ -892,7 +895,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     assertMethodInvocation(
@@ -911,7 +914,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     _assertInvalidInvocation(
@@ -930,7 +933,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     // TODO(scheglov) Resolve fully, or don't resolve at all.
@@ -949,7 +952,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     // TODO(scheglov) Resolve fully, or don't resolve at all.
@@ -968,7 +971,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticWarningCode.USE_OF_VOID_RESULT,
     ]);
     // TODO(scheglov) Resolve fully, or don't resolve at all.
@@ -988,7 +991,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
     ]);
     assertMethodInvocation(
@@ -1008,7 +1011,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
     ]);
     assertMethodInvocation(
@@ -1498,7 +1501,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
     ]);
     assertElement(findNode.simple('math()'), findElement.prefix('math'));
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index b84f31a..46ff61b 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -150,7 +150,8 @@
 mixin M on A implements B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES]);
   }
 
   test_element() async {
@@ -237,7 +238,8 @@
 mixin as {}
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
   }
 
   test_error_builtInIdentifierAsTypeName_OK_on() async {
@@ -266,7 +268,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_getter_method() async {
@@ -277,7 +280,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_getter_setter() async {
@@ -288,7 +292,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_method_getter() async {
@@ -299,7 +304,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_method_method() async {
@@ -310,7 +316,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_method_setter() async {
@@ -321,7 +328,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_setter_getter() async {
@@ -332,7 +340,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_setter_method() async {
@@ -343,7 +352,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inClass_setter_setter() async {
@@ -354,7 +364,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_getter_getter() async {
@@ -367,7 +378,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_getter_method() async {
@@ -380,7 +392,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_getter_setter() async {
@@ -393,7 +406,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_method_getter() async {
@@ -406,7 +420,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_method_method() async {
@@ -419,7 +434,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_method_setter() async {
@@ -432,7 +448,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_setter_method() async {
@@ -445,7 +462,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inConstraint_setter_setter() async {
@@ -458,7 +476,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_getter_getter() async {
@@ -471,7 +490,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_getter_method() async {
@@ -484,7 +504,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_getter_setter() async {
@@ -497,7 +518,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_method_getter() async {
@@ -510,7 +532,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_method_method() async {
@@ -523,7 +546,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_method_setter() async {
@@ -536,7 +560,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_setter_method() async {
@@ -549,7 +574,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingStaticAndInstance_inInterface_setter_setter() async {
@@ -562,7 +588,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE]);
   }
 
   test_error_conflictingTypeVariableAndClass() async {
@@ -570,7 +597,7 @@
 mixin M<M> {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
     ]);
   }
@@ -582,7 +609,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
     ]);
   }
@@ -594,7 +621,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
     ]);
   }
@@ -606,7 +633,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
     ]);
   }
@@ -618,7 +645,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
     ]);
   }
@@ -630,7 +657,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
     ]);
   }
@@ -643,7 +670,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_field_method() async {
@@ -654,7 +681,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_getter() async {
@@ -665,7 +692,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_getter_method() async {
@@ -676,7 +703,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_method() async {
@@ -687,7 +714,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_method_getter() async {
@@ -698,7 +725,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_duplicateDefinition_setter() async {
@@ -709,7 +736,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.DUPLICATE_DEFINITION]);
   }
 
   test_error_finalNotInitialized() async {
@@ -719,7 +746,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    assertTestErrorsWithCodes([StaticWarningCode.FINAL_NOT_INITIALIZED]);
   }
 
   test_error_finalNotInitialized_OK() async {
@@ -740,7 +767,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
       StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
     ]);
@@ -754,7 +781,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
 
     var element = findElement.mixin('M');
     var constructorElement = element.constructors.single;
@@ -775,7 +803,7 @@
     var mathImport = findElement.import('dart:math');
     var randomElement = mathImport.importedLibrary.getType('Random');
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
     ]);
 
@@ -793,7 +821,7 @@
 ''');
     await resolveTestFile();
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
     ]);
 
@@ -810,7 +838,7 @@
 ''');
     await resolveTestFile();
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.IMPLEMENTS_NON_CLASS,
       ParserErrorCode.EXPECTED_TYPE_NAME,
     ]);
@@ -829,7 +857,7 @@
 ''');
     await resolveTestFile();
     CompileTimeErrorCode.IMPLEMENTS_REPEATED;
-    assertTestErrors([CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
   }
 
   test_error_memberWithClassName_getter() async {
@@ -839,7 +867,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
   }
 
   test_error_memberWithClassName_getter_static() async {
@@ -849,7 +877,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
   }
 
   test_error_memberWithClassName_setter() async {
@@ -859,7 +887,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
   }
 
   test_error_memberWithClassName_setter_static() async {
@@ -869,7 +897,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
   }
 
   test_error_mixinApplicationConcreteSuperInvokedMemberType_method() async {
@@ -895,7 +923,7 @@
 abstract class X extends B with M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
     ]);
   }
@@ -933,7 +961,7 @@
 abstract class X extends A with M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
     ]);
   }
@@ -957,7 +985,7 @@
 class X extends A with M1, M2 {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
     ]);
   }
@@ -977,7 +1005,7 @@
 class X extends A with M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER
     ]);
   }
@@ -997,7 +1025,7 @@
 abstract class X extends A with M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
     ]);
   }
@@ -1147,7 +1175,7 @@
 abstract class X extends A with M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
     ]);
   }
@@ -1161,7 +1189,7 @@
 class X = Object with M;
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
     ]);
   }
@@ -1175,7 +1203,7 @@
 class X = A<double> with M;
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
     ]);
   }
@@ -1199,7 +1227,7 @@
 class X = C with M;
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
     ]);
   }
@@ -1265,7 +1293,7 @@
 class X = C with M;
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
     ]);
   }
@@ -1279,7 +1307,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
 
     // Even though it is an error for a mixin to declare a constructor,
     // we still build elements for constructors, and resolve them.
@@ -1310,7 +1339,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.MIXIN_INSTANTIATE]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.MIXIN_INSTANTIATE]);
 
     var creation = findNode.instanceCreation('M();');
     var m = findElement.mixin('M');
@@ -1328,7 +1357,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
       CompileTimeErrorCode.MIXIN_INSTANTIATE,
     ]);
@@ -1347,7 +1376,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_INSTANTIATE,
     ]);
 
@@ -1365,7 +1394,7 @@
     var mathImport = findElement.import('dart:math');
     var randomElement = mathImport.importedLibrary.getType('Random');
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS,
     ]);
 
@@ -1383,7 +1412,7 @@
 ''');
     await resolveTestFile();
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
     ]);
 
@@ -1400,7 +1429,7 @@
 ''');
     await resolveTestFile();
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE,
     ]);
 
@@ -1418,7 +1447,7 @@
 ''');
     await resolveTestFile();
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE,
     ]);
 
@@ -1435,7 +1464,7 @@
 ''');
     await resolveTestFile();
 
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE,
       ParserErrorCode.EXPECTED_TYPE_NAME,
     ]);
@@ -1467,7 +1496,7 @@
 ''');
     await resolveTestFile();
     CompileTimeErrorCode.IMPLEMENTS_REPEATED;
-    assertTestErrors([CompileTimeErrorCode.ON_REPEATED]);
+    assertTestErrorsWithCodes([CompileTimeErrorCode.ON_REPEATED]);
   }
 
   test_error_undefinedSuperMethod() async {
@@ -1481,7 +1510,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
+    assertTestErrorsWithCodes([StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
 
     var invocation = findNode.methodInvocation('foo(42)');
     assertElementNull(invocation.methodName);
@@ -1562,7 +1591,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1578,7 +1607,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1594,7 +1623,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1610,7 +1639,7 @@
 mixin M on A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1626,7 +1655,7 @@
 mixin M on A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1642,7 +1671,7 @@
 mixin M on A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE,
     ]);
   }
@@ -1658,7 +1687,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
@@ -1674,7 +1703,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
@@ -1690,7 +1719,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
@@ -1706,7 +1735,7 @@
 mixin M implements A, B {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.INCONSISTENT_INHERITANCE_GETTER_AND_METHOD,
     ]);
   }
@@ -1726,7 +1755,7 @@
 abstract class X extends A with U1, U2, M {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
       CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
       CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
@@ -1827,7 +1856,7 @@
 mixin A implements B {}
 mixin B implements A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1838,7 +1867,7 @@
 mixin A on B {}
 mixin B on A {}''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
     ]);
@@ -1849,7 +1878,7 @@
 mixin A on A {}
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON,
     ]);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
index 1b47f1e..820678a 100644
--- a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
@@ -36,7 +36,7 @@
     assertNoTestErrors();
 
     assertType(findNode.typeName('int? a'), 'int?');
-    assertType(findNode.typeName('int b'), 'int!');
+    assertType(findNode.typeName('int b'), 'int');
   }
 
   test_local_returnType_interfaceType() async {
@@ -50,7 +50,7 @@
     assertNoTestErrors();
 
     assertType(findNode.typeName('int? f'), 'int?');
-    assertType(findNode.typeName('int g'), 'int!');
+    assertType(findNode.typeName('int g'), 'int');
   }
 
   @failingTest
@@ -80,7 +80,7 @@
     assertNoTestErrors();
 
     assertType(findNode.typeName('int? a'), 'int?');
-    assertType(findNode.typeName('int b'), 'int!');
+    assertType(findNode.typeName('int b'), 'int');
   }
 
   test_local_variable_interfaceType_generic() async {
@@ -96,9 +96,9 @@
     assertNoTestErrors();
 
     assertType(findNode.typeName('List<int?>? a'), 'List<int?>?');
-    assertType(findNode.typeName('List<int>? b'), 'List<int!>?');
-    assertType(findNode.typeName('List<int?> c'), 'List<int?>!');
-    assertType(findNode.typeName('List<int> d'), 'List<int!>!');
+    assertType(findNode.typeName('List<int>? b'), 'List<int>?');
+    assertType(findNode.typeName('List<int?> c'), 'List<int?>');
+    assertType(findNode.typeName('List<int> d'), 'List<int>');
   }
 
   test_local_variable_typeParameter() async {
@@ -112,10 +112,22 @@
     await resolveTestFile();
     assertNoTestErrors();
 
-    assertType(findNode.typeName('T a'), 'T!');
+    assertType(findNode.typeName('T a'), 'T');
     assertType(findNode.typeName('T? b'), 'T?');
   }
 
+  test_null_assertion_operator_removes_nullability() async {
+    addTestFile('''
+main() {
+  Object? x = null;
+  x!;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    assertType(findNode.postfix('x!'), 'Object');
+  }
+
   test_typedef_classic() async {
     addTestFile('''
 typedef int? F(bool a, String? b);
@@ -127,7 +139,7 @@
     await resolveTestFile();
     assertNoTestErrors();
 
-    assertType(findNode.typeName('F? a'), '(bool!, String?) → int??');
+    assertType(findNode.typeName('F? a'), '(bool, String?) → int??');
   }
 
   @failingTest
@@ -165,9 +177,9 @@
     await resolveTestFile();
     assertNoTestErrors();
 
-    assertType(findNode.typeName('A {} // 1'), 'A!');
-    assertType(findNode.typeName('A {} // 2'), 'A!');
-    assertType(findNode.typeName('A {} // 3'), 'A!');
+    assertType(findNode.typeName('A {} // 1'), 'A');
+    assertType(findNode.typeName('A {} // 2'), 'A');
+    assertType(findNode.typeName('A {} // 3'), 'A');
   }
 
   test_classTypeAlias_hierarchy() async {
@@ -181,9 +193,9 @@
     await resolveTestFile();
     assertNoTestErrors();
 
-    assertType(findNode.typeName('A with'), 'A!');
-    assertType(findNode.typeName('B implements'), 'B!');
-    assertType(findNode.typeName('C;'), 'C!');
+    assertType(findNode.typeName('A with'), 'A');
+    assertType(findNode.typeName('B implements'), 'B');
+    assertType(findNode.typeName('C;'), 'C');
   }
 
   test_local_variable_interfaceType_notMigrated() async {
@@ -194,7 +206,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([ParserErrorCode.EXPERIMENT_NOT_ENABLED]);
+    assertTestErrorsWithCodes([ParserErrorCode.EXPERIMENT_NOT_ENABLED]);
 
     assertType(findNode.typeName('int? a'), 'int*');
     assertType(findNode.typeName('int b'), 'int*');
@@ -210,7 +222,7 @@
     await resolveTestFile();
     assertNoTestErrors();
 
-    assertType(findNode.typeName('A {} // 1'), 'A!');
-    assertType(findNode.typeName('A {} // 2'), 'A!');
+    assertType(findNode.typeName('A {} // 1'), 'A');
+    assertType(findNode.typeName('A {} // 2'), 'A');
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 0723755..dcc2d69 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -28,7 +28,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
 
     var access = findNode.propertyAccess('foo; // ref');
     assertPropertyAccess(access, findElement.getter('foo', of: 'A'), 'int');
@@ -68,7 +69,8 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+    assertTestErrorsWithCodes(
+        [CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
 
     var access = findNode.propertyAccess('foo = v; // ref');
     assertPropertyAccess(
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 262e9cf..b713264 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -150,11 +150,28 @@
     expect(element.enclosingElement, expectedEnclosing);
   }
 
+  Future<void> assertErrorCodesInCode(
+      String code, List<ErrorCode> errors) async {
+    addTestFile(code);
+    await resolveTestFile();
+    assertTestErrorsWithCodes(errors);
+  }
+
+  Future<void> assertErrorsInCode(
+      String code, List<ExpectedError> expectedErrors) async {
+    addTestFile(code);
+    await resolveTestFile();
+
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    errorListener.addAll(result.errors);
+    errorListener.assertErrors(expectedErrors);
+  }
+
   /**
    * Assert that the number of error codes in reported [errors] matches the
    * number of [expected] error codes. The order of errors is ignored.
    */
-  void assertErrors(List<AnalysisError> errors,
+  void assertErrorsWithCodes(List<AnalysisError> errors,
       [List<ErrorCode> expected = const <ErrorCode>[]]) {
     var errorListener = new GatheringErrorListener();
     for (AnalysisError error in result.errors) {
@@ -175,12 +192,6 @@
     errorListener.assertErrorsWithCodes(expected);
   }
 
-  Future<void> assertErrorsInCode(String code, List<ErrorCode> errors) async {
-    addTestFile(code);
-    await resolveTestFile();
-    assertTestErrors(errors);
-  }
-
   void assertHasTestErrors() {
     expect(result.errors, isNotEmpty);
   }
@@ -319,7 +330,7 @@
   }
 
   void assertNoTestErrors() {
-    assertTestErrors(const <ErrorCode>[]);
+    assertTestErrorsWithCodes(const <ErrorCode>[]);
   }
 
   void assertPropertyAccess(
@@ -338,8 +349,8 @@
 //    assertTypeNull(superExpression);
   }
 
-  void assertTestErrors(List<ErrorCode> expected) {
-    assertErrors(result.errors, expected);
+  void assertTestErrorsWithCodes(List<ErrorCode> expected) {
+    assertErrorsWithCodes(result.errors, expected);
   }
 
   void assertTopGetRef(String search, String name) {
@@ -392,6 +403,9 @@
     expect(node.staticType, isNull);
   }
 
+  ExpectedError error(ErrorCode code, int offset, int length) =>
+      new ExpectedError(code, offset, length);
+
   Element getNodeElement(AstNode node) {
     if (node is Annotation) {
       return node.element;
diff --git a/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart b/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
index 9d08d0e..65de6ba 100644
--- a/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
@@ -41,7 +41,7 @@
 final b = new A().a;
 ''');
     await resolveTestFile();
-    assertTestErrors([StrongModeCode.TOP_LEVEL_INSTANCE_GETTER]);
+    assertTestErrorsWithCodes([StrongModeCode.TOP_LEVEL_INSTANCE_GETTER]);
 
     assertElementTypeDynamic(findElement.field('a').type);
     assertElementTypeDynamic(findElement.topVar('b').type);
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
index 8e95614..202c01bd 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
@@ -30,7 +30,9 @@
 Map<int, int> map;
 Set<int> set;
 var c = {...set, ...map};
-''', [CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH]);
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH, 41, 16),
+    ]);
   }
 }
 
@@ -48,6 +50,8 @@
 var map;
 var set;
 var c = {...set, ...map};
-''', [CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER]);
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER, 26, 16),
+    ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index b40bc8e..28b285e 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -24,7 +24,9 @@
 class A {
   n(void f(int i)) {}
 }
-''', [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 7),
+    ]);
   }
 
   test_interfaceType() async {
@@ -34,6 +36,8 @@
   n(i);
 }
 n(int i) {}
-''', [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 24, 1),
+    ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart
index 2e30543..28ab163 100644
--- a/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart
@@ -23,7 +23,9 @@
   g(@async x) {}
   g(0);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 38, 5),
+    ]);
   }
 
   test_async_argumentLabel() async {
@@ -31,23 +33,33 @@
 f(c) async {
   c.g(async: 0);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 19, 5),
+    ]);
   }
 
   test_async_async() async {
     await assertErrorsInCode('''
 f() async {
   var async = 1;
+  print(async);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 18, 5),
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 37, 5),
+    ]);
   }
 
   test_async_asyncStar() async {
     await assertErrorsInCode('''
 f() async* {
   var async = 1;
+  print(async);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 19, 5),
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 38, 5),
+    ]);
   }
 
   test_async_break() async {
@@ -58,8 +70,8 @@
   }
 }
 ''', [
-      ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
-      CompileTimeErrorCode.LABEL_UNDEFINED
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 39, 5),
+      error(CompileTimeErrorCode.LABEL_UNDEFINED, 39, 5),
     ]);
   }
 
@@ -71,7 +83,9 @@
     g();
   } catch (async) { }
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 47, 5),
+    ]);
   }
 
   test_async_catchStacktrace() async {
@@ -82,7 +96,10 @@
     g();
   } catch (e, async) { }
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 50, 5),
+      error(HintCode.UNUSED_CATCH_STACK, 50, 5),
+    ]);
   }
 
   test_async_continue() async {
@@ -93,8 +110,8 @@
   }
 }
 ''', [
-      ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
-      CompileTimeErrorCode.LABEL_UNDEFINED
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 42, 5),
+      error(CompileTimeErrorCode.LABEL_UNDEFINED, 42, 5),
     ]);
   }
 
@@ -104,7 +121,9 @@
 f() async {
   for (async in []) {}
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 30, 5),
+    ]);
   }
 
   test_async_formalParameter() async {
@@ -113,7 +132,9 @@
   g(int async) {}
   g(0);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 20, 5),
+    ]);
   }
 
   test_async_getter() async {
@@ -124,7 +145,9 @@
 f() async {
   return new C().async;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 63, 5),
+    ]);
   }
 
   test_async_invocation() async {
@@ -135,7 +158,9 @@
 f() async {
   return new C().async();
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 61, 5),
+    ]);
   }
 
   test_async_invocation_cascaded() async {
@@ -146,7 +171,9 @@
 f() async {
   return new C()..async();
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 62, 5),
+    ]);
   }
 
   test_async_label() async {
@@ -155,15 +182,22 @@
   async: g();
 }
 g() {}
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, HintCode.UNUSED_LABEL]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 14, 5),
+      error(HintCode.UNUSED_LABEL, 14, 6),
+    ]);
   }
 
   test_async_localFunction() async {
     await assertErrorsInCode('''
 f() async {
   int async() => null;
+  async();
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 18, 5),
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 37, 5),
+    ]);
   }
 
   test_async_prefix() async {
@@ -172,7 +206,9 @@
 f() async {
   return new async.Future.value(0);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 55, 5),
+    ]);
   }
 
   test_async_setter() async {
@@ -183,7 +219,9 @@
 f() async {
   new C().async = 1;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 61, 5),
+    ]);
   }
 
   test_async_setter_cascaded() async {
@@ -194,7 +232,9 @@
 f() async {
   return new C()..async = 1;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 69, 5),
+    ]);
   }
 
   test_async_stringInterpolation() async {
@@ -203,7 +243,9 @@
 f() async {
   return "$async";
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 38, 5),
+    ]);
   }
 
   test_async_suffix() async {
@@ -216,7 +258,9 @@
 f() async {
   return l.async;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 48, 5),
+    ]);
   }
 
   test_async_switchLabel() async {
@@ -226,15 +270,22 @@
     async: case 0: break;
   }
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, HintCode.UNUSED_LABEL]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 31, 5),
+      error(HintCode.UNUSED_LABEL, 31, 6),
+    ]);
   }
 
   test_async_syncStar() async {
     await assertErrorsInCode('''
 f() sync* {
   var async = 1;
+  print(async);
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 18, 5),
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 37, 5),
+    ]);
   }
 
   test_await_async() async {
@@ -242,7 +293,10 @@
 f() async {
   var await = 1;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 18, 5),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 5),
+    ]);
   }
 
   test_await_asyncStar() async {
@@ -250,7 +304,10 @@
 f() async* {
   var await = 1;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 19, 5),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 19, 5),
+    ]);
   }
 
   test_await_syncStar() async {
@@ -258,6 +315,9 @@
 f() sync* {
   var await = 1;
 }
-''', [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+''', [
+      error(ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER, 18, 5),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 5),
+    ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart b/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
index 3e9bddb..ee5b015 100644
--- a/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
@@ -20,7 +20,9 @@
 m(x) {
   x..a?.b.c;
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 10, 6),
+    ]);
   }
 
   test_beforeCascade() async {
@@ -28,7 +30,9 @@
 m(x) {
   x?.a..m();
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 9, 4),
+    ]);
   }
 
   test_cascadeWithParenthesis() async {
@@ -36,7 +40,9 @@
 m(x) {
   (x?.a)..m();
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 9, 6),
+    ]);
   }
 
   test_definedForNull() async {
@@ -73,7 +79,9 @@
 m(x) {
   x?.a.b();
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 9, 4),
+    ]);
   }
 
   test_multipleInvocations() async {
@@ -83,7 +91,9 @@
     ..m()
     ..m();
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 9, 4),
+    ]);
   }
 
   test_parenthesized() async {
@@ -91,7 +101,9 @@
 m(x) {
   (x?.a).b;
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 9, 6),
+    ]);
   }
 
   test_propertyAccess() async {
@@ -99,6 +111,8 @@
 m(x) {
   x?.a.b;
 }
-''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+''', [
+      error(HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, 9, 4),
+    ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
index f8b4aec..662215a 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
@@ -26,7 +26,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
     ]);
@@ -43,7 +43,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
     ]);
   }
@@ -85,7 +85,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
     ]);
@@ -102,7 +102,7 @@
 }
 ''');
     await resolveTestFile();
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index 47b2dd1..ba1168f 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -14,6 +14,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstEvalThrowsExceptionTest);
     defineReflectiveTests(ConstEvalThrowsExceptionWithConstantUpdateTest);
+    defineReflectiveTests(ConstEvalThrowsExceptionWithUiAsCodeAndConstantsTest);
     defineReflectiveTests(ConstEvalThrowsExceptionWithUIAsCodeTest);
   });
 }
@@ -152,6 +153,18 @@
 }
 
 @reflectiveTest
+class ConstEvalThrowsExceptionWithUiAsCodeAndConstantsTest
+    extends ConstEvalThrowsExceptionWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class ConstEvalThrowsExceptionWithUIAsCodeTest
     extends ConstEvalThrowsExceptionTest {
   @override
@@ -162,37 +175,66 @@
     ];
 
   test_ifElement_false_thenNotEvaluated() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic nil = null;
 const c = [if (1 < 0) nil + 1];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_ifElement_nonBoolCondition_list() async {
-    assertErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 const dynamic nonBool = 3;
 const c = const [if (nonBool) 'a'];
-''', [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]
+            : [
+                CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+                CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT
+              ]);
   }
 
   test_ifElement_nonBoolCondition_map() async {
-    assertErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 const dynamic nonBool = null;
 const c = const {if (nonBool) 'a' : 1};
-''', [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]
+            : [
+                CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+                CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT
+              ]);
   }
 
   test_ifElement_nonBoolCondition_set() async {
-    assertErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 const dynamic nonBool = 'a';
 const c = const {if (nonBool) 3};
-''', [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]
+            : [
+                CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+                CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT
+              ]);
   }
 
   test_ifElement_true_elseNotEvaluated() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic nil = null;
 const c = [if (0 < 1) 3 else nil + 1];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart
index 9822a85..0a03667 100644
--- a/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_map_key_expression_type_implements_equals_test.dart
@@ -34,7 +34,7 @@
   }
 
   test_constField() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   const {double.INFINITY: 0};
 }
@@ -42,7 +42,7 @@
   }
 
   test_direct() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -58,7 +58,7 @@
     // Note: static type of B.a is "dynamic", but actual type of the const
     // object is A.  We need to make sure we examine the actual type when
     // deciding whether there is a problem with operator==.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -75,7 +75,7 @@
   }
 
   test_factory() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const factory A() = B;
 }
@@ -92,7 +92,7 @@
   }
 
   test_super() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
diff --git a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
index 95fa251..ded7bfb 100644
--- a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -12,6 +13,8 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest);
     defineReflectiveTests(
+        ConstSetElementTypeImplementsEqualsWithUIAsCodeAndConstantsTest);
+    defineReflectiveTests(
       ConstSetElementTypeImplementsEqualsWithUIAsCodeTest,
     );
   });
@@ -20,7 +23,7 @@
 @reflectiveTest
 class ConstSetElementTypeImplementsEqualsTest extends DriverResolutionTest {
   test_constField() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   static const a = const A();
   const A();
@@ -33,7 +36,7 @@
   }
 
   test_direct() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -48,7 +51,7 @@
     // Note: static type of B.a is "dynamic", but actual type of the const
     // object is A.  We need to make sure we examine the actual type when
     // deciding whether there is a problem with operator==.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -63,7 +66,7 @@
   }
 
   test_factory() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A { const factory A() = B; }
 
 class B implements A {
@@ -79,7 +82,7 @@
   }
 
   test_super() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -95,14 +98,30 @@
 }
 
 @reflectiveTest
+class ConstSetElementTypeImplementsEqualsWithUIAsCodeAndConstantsTest
+    extends ConstSetElementTypeImplementsEqualsWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class ConstSetElementTypeImplementsEqualsWithUIAsCodeTest
     extends ConstSetElementTypeImplementsEqualsTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_spread_list() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -111,11 +130,15 @@
 main() {
   const {...[A()]};
 }
-''', [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_spread_set() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -124,6 +147,12 @@
 main() {
   const {...{A()}};
 }
-''', [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]
+            : [
+                CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
+                CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT
+              ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
index 9c8d9f4..5863409 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSpreadExpectedListOrSetTest);
+    defineReflectiveTests(ConstSpreadExpectedListOrSetWithConstantsTest);
   });
 }
 
@@ -18,90 +20,141 @@
 class ConstSpreadExpectedListOrSetTest extends DriverResolutionTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_const_listInt() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 5;
 var b = const <int>[...a];
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_listList() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = [5];
 var b = const <int>[...a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_listMap() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int, int>{0: 1};
 var b = const <int>[...a];
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_listNull() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = null;
 var b = const <int>[...a];
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_listNull_nullable() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = null;
 var b = const <int>[...?a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_listSet() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int>{5};
 var b = const <int>[...a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_setInt() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 5;
 var b = const <int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_setList() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int>[5];
 var b = const <int>{...a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_setMap() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int, int>{1: 2};
 var b = const <int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_setNull() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = null;
 var b = const <int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_setNull_nullable() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = null;
 var b = const <int>{...?a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_setSet() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int>{5};
 var b = const <int>{...a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_nonConst_listInt() async {
@@ -118,3 +171,15 @@
 ''');
   }
 }
+
+@reflectiveTest
+class ConstSpreadExpectedListOrSetWithConstantsTest
+    extends ConstSpreadExpectedListOrSetTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
index 405a700..93d86bb 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSpreadExpectedMapTest);
+    defineReflectiveTests(ConstSpreadExpectedMapWithConstantsTest);
   });
 }
 
@@ -18,20 +20,31 @@
 class ConstSpreadExpectedMapTest extends DriverResolutionTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_const_mapInt() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 5;
 var b = const <int, int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_mapList() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int>[5];
 var b = const <int, int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_mapMap() async {
@@ -42,10 +55,14 @@
   }
 
   test_const_mapNull() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = null;
 var b = const <int, int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_mapNull_nullable() async {
@@ -56,10 +73,14 @@
   }
 
   test_const_mapSet() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = <int>{5};
 var b = const <int, int>{...a};
-''', [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_nonConst_mapInt() async {
@@ -76,3 +97,15 @@
 ''');
   }
 }
+
+@reflectiveTest
+class ConstSpreadExpectedMapWithConstantsTest
+    extends ConstSpreadExpectedMapTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
diff --git a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
index f2f92f9..e97aa48 100644
--- a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
@@ -66,7 +66,7 @@
   }
 
   test_deadBlock_conditionalElse() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   true ? 1 : 2;
 }''', [HintCode.DEAD_CODE]);
@@ -82,14 +82,14 @@
 
   test_deadBlock_conditionalElse_nested() async {
     // Test that a dead else-statement can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   true ? true : false && false;
 }''', [HintCode.DEAD_CODE]);
   }
 
   test_deadBlock_conditionalIf() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   false ? 1 : 2;
 }''', [HintCode.DEAD_CODE]);
@@ -105,14 +105,14 @@
 
   test_deadBlock_conditionalIf_nested() async {
     // Test that a dead then-statement can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   false ? false && false : true;
 }''', [HintCode.DEAD_CODE]);
   }
 
   test_deadBlock_else() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   if(true) {} else {}
 }''', [HintCode.DEAD_CODE]);
@@ -128,14 +128,14 @@
 
   test_deadBlock_else_nested() async {
     // Test that a dead else-statement can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   if(true) {} else {if (false) {}}
 }''', [HintCode.DEAD_CODE]);
   }
 
   test_deadBlock_if() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   if(false) {}
 }''', [HintCode.DEAD_CODE]);
@@ -189,14 +189,14 @@
 
   test_deadBlock_if_nested() async {
     // Test that a dead then-statement can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   if(false) {if(false) {}}
 }''', [HintCode.DEAD_CODE]);
   }
 
   test_deadBlock_while() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   while(false) {}
 }''', [HintCode.DEAD_CODE]);
@@ -212,14 +212,14 @@
 
   test_deadBlock_while_nested() async {
     // Test that a dead while body can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   while(false) {if(false) {}}
 }''', [HintCode.DEAD_CODE]);
   }
 
   test_deadCatch_catchFollowingCatch() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f() {
   try {} catch (e) {} catch (e) {}
@@ -228,7 +228,7 @@
 
   test_deadCatch_catchFollowingCatch_nested() async {
     // Test that a dead catch clause can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f() {
   try {} catch (e) {} catch (e) {if(false) {}}
@@ -236,7 +236,7 @@
   }
 
   test_deadCatch_catchFollowingCatch_object() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   try {} on Object catch (e) {} catch (e) {}
 }''', [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
@@ -244,14 +244,14 @@
 
   test_deadCatch_catchFollowingCatch_object_nested() async {
     // Test that a dead catch clause can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   try {} on Object catch (e) {} catch (e) {if(false) {}}
 }''', [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
   }
 
   test_deadCatch_onCatchSubtype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {}
 f() {
@@ -261,7 +261,7 @@
 
   test_deadCatch_onCatchSubtype_nested() async {
     // Test that a dead catch clause can't generate additional violations.
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {}
 f() {
@@ -296,7 +296,7 @@
   }
 
   test_deadFinalReturnInCase() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   switch (true) {
   case true:
@@ -313,7 +313,7 @@
   }
 
   test_deadFinalStatementInCase() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   switch (true) {
   case true:
@@ -330,7 +330,7 @@
   }
 
   test_deadOperandLHS_and() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   bool b = false && false;
 }''', [HintCode.DEAD_CODE]);
@@ -345,14 +345,14 @@
   }
 
   test_deadOperandLHS_and_nested() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   bool b = false && (false && false);
 }''', [HintCode.DEAD_CODE]);
   }
 
   test_deadOperandLHS_or() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   bool b = true || true;
 }''', [HintCode.DEAD_CODE]);
@@ -367,7 +367,7 @@
   }
 
   test_deadOperandLHS_or_nested() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   bool b = true || (false && false);
 }''', [HintCode.DEAD_CODE]);
@@ -375,7 +375,7 @@
 
   test_statementAfterAlwaysThrowsFunction() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 @alwaysThrows
@@ -393,7 +393,7 @@
   @failingTest
   test_statementAfterAlwaysThrowsGetter() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -411,7 +411,7 @@
 
   test_statementAfterAlwaysThrowsMethod() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -429,7 +429,7 @@
   }
 
   test_statementAfterBreak_inDefaultCase() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(v) {
   switch(v) {
     case 1:
@@ -441,7 +441,7 @@
   }
 
   test_statementAfterBreak_inForEachStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   var list;
   for(var l in list) {
@@ -452,7 +452,7 @@
   }
 
   test_statementAfterBreak_inForStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   for(;;) {
     break;
@@ -462,7 +462,7 @@
   }
 
   test_statementAfterBreak_inSwitchCase() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(v) {
   switch(v) {
     case 1:
@@ -473,7 +473,7 @@
   }
 
   test_statementAfterBreak_inWhileStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(v) {
   while(v) {
     break;
@@ -483,7 +483,7 @@
   }
 
   test_statementAfterContinue_inForEachStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   var list;
   for(var l in list) {
@@ -494,7 +494,7 @@
   }
 
   test_statementAfterContinue_inForStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   for(;;) {
     continue;
@@ -504,7 +504,7 @@
   }
 
   test_statementAfterContinue_inWhileStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(v) {
   while(v) {
     continue;
@@ -514,7 +514,7 @@
   }
 
   test_statementAfterExitingIf_returns() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   if (1 > 2) {
     return;
@@ -536,7 +536,7 @@
   }
 
   test_statementAfterRethrow() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   try {
     var one = 1;
@@ -548,7 +548,7 @@
   }
 
   test_statementAfterReturn_function() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   var one = 1;
   return;
@@ -557,7 +557,7 @@
   }
 
   test_statementAfterReturn_ifStatement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(bool b) {
   if(b) {
     var one = 1;
@@ -568,7 +568,7 @@
   }
 
   test_statementAfterReturn_method() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   m() {
     var one = 1;
@@ -579,7 +579,7 @@
   }
 
   test_statementAfterReturn_nested() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   var one = 1;
   return;
@@ -588,7 +588,7 @@
   }
 
   test_statementAfterReturn_twoReturns() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   var one = 1;
   return;
@@ -599,7 +599,7 @@
   }
 
   test_statementAfterThrow() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f() {
   var one = 1;
   throw 'Stop here';
@@ -614,8 +614,20 @@
   AnalysisOptionsImpl get analysisOptions =>
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
+  test_nullCoalesce_dynamic() async {
+    await assertNoErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  dynamic x;
+  x ?? 1;
+}
+''');
+  }
+
   test_nullCoalesce_nonNullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 @pragma('analyzer:non-nullable')
 library foo;
 
@@ -638,8 +650,32 @@
 ''');
   }
 
+  test_nullCoalesce_nullType() async {
+    await assertNoErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  Null x;
+  x ?? 1;
+}
+''');
+  }
+
+  test_nullCoalesceAssign_dynamic() async {
+    await assertNoErrorsInCode(r'''
+@pragma('analyzer:non-nullable')
+library foo;
+
+m() {
+  dynamic x;
+  x ??= 1;
+}
+''');
+  }
+
   test_nullCoalesceAssign_nonNullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 @pragma('analyzer:non-nullable')
 library foo;
 
diff --git a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
index eaadc2d..1ef1b7e 100644
--- a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
@@ -24,7 +24,7 @@
   }
 
   test_double() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(double x, double y) {
   var v = (x / y).toInt();
 }
@@ -40,7 +40,7 @@
   }
 
   test_int() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(int x, int y) {
   var v = (x / y).toInt();
 }
@@ -59,7 +59,7 @@
   }
 
   test_wrappedInParentheses() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(int x, int y) {
   var v = (((x / y))).toInt();
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
index 428e9b2..d168502 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
@@ -28,7 +28,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.DUPLICATE_IMPORT]);
+    assertTestErrorsWithCodes([HintCode.DUPLICATE_IMPORT]);
   }
 
   test_importsHaveIdenticalShowHide() async {
@@ -45,7 +45,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.DUPLICATE_IMPORT]);
+    assertTestErrorsWithCodes([HintCode.DUPLICATE_IMPORT]);
   }
 
   test_oneImportHasHide() async {
@@ -114,7 +114,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
+    assertTestErrorsWithCodes(
+        [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
   }
 
   /// Resolve the test file at [path].
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 6d4a55f..91c8202f 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EqualElementsInConstSetTest);
+    defineReflectiveTests(EqualElementsInConstSetWithUIAsCodeAndConstantsTest);
     defineReflectiveTests(EqualElementsInConstSetWithUIAsCodeTest);
   });
 }
@@ -19,13 +20,13 @@
 @reflectiveTest
 class EqualElementsInConstSetTest extends DriverResolutionTest {
   test_const_entry() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var c = const {1, 2, 1};
 ''', [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]);
   }
 
   test_const_instanceCreation_equalTypeArgs() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<T> {
   const A();
 }
@@ -53,6 +54,18 @@
 }
 
 @reflectiveTest
+class EqualElementsInConstSetWithUIAsCodeAndConstantsTest
+    extends EqualElementsInConstSetWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class EqualElementsInConstSetWithUIAsCodeTest
     extends EqualElementsInConstSetTest {
   @override
@@ -63,50 +76,82 @@
     ];
 
   test_const_ifElement_thenElseFalse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1, if (1 < 0) 2 else 1};
-''', [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_onlyElse() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {if (0 < 1) 1 else 1};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {1, if (0 < 1) 2 else 1};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_onlyThen() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {if (0 < 1) 1 else 1};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {2, if (1 < 0) 2};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1, if (0 < 1) 1};
-''', [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_spread__noDuplicate() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1, ...{2}};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_spread_hasDuplicate() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1, ...{1}};
-''', [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index 3ba9ead..c4ff97b 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EqualKeysInConstMapTest);
+    defineReflectiveTests(EqualKeysInConstMapWithUIAsCodeAndConstantsTest);
     defineReflectiveTests(EqualKeysInConstMapWithUIAsCodeTest);
   });
 }
@@ -19,13 +20,13 @@
 @reflectiveTest
 class EqualKeysInConstMapTest extends DriverResolutionTest {
   test_const_entry() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var c = const {1: null, 2: null, 1: null};
 ''', [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]);
   }
 
   test_const_instanceCreation_equalTypeArgs() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A<T> {
   const A();
 }
@@ -53,6 +54,18 @@
 }
 
 @reflectiveTest
+class EqualKeysInConstMapWithUIAsCodeAndConstantsTest
+    extends EqualKeysInConstMapWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class EqualKeysInConstMapWithUIAsCodeTest extends EqualKeysInConstMapTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
@@ -62,50 +75,82 @@
     ];
 
   test_const_ifElement_thenElseFalse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1: null, if (1 < 0) 2: null else 1: null};
-''', [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_onlyElse() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {if (0 < 1) 1: null else 1: null};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {1: null, if (0 < 1) 2: null else 1: null};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_onlyThen() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {if (0 < 1) 1: null else 1: null};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse() async {
-    assertNoErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 var c = const {2: null, if (1 < 0) 2: 2};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1: null, if (0 < 1) 1: null};
-''', [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_spread__noDuplicate() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1: null, ...{2: null}};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_spread_hasDuplicate() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var c = const {1: null, ...{1: null}};
-''', [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart b/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart
index 613210f..b53dea9 100644
--- a/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart
@@ -22,7 +22,7 @@
   bool get isUiAsCode => analysisOptions.experimentStatus.spread_collections;
 
   test_map() async {
-    await assertErrorsInCode(
+    await assertErrorCodesInCode(
       '''
 var m = <String, int>{'a', 'b' : 2};
 ''',
@@ -38,7 +38,7 @@
   }
 
   test_map_const() async {
-    await assertErrorsInCode(
+    await assertErrorCodesInCode(
       '''
 var m = <String, int>{'a', 'b' : 2};
 ''',
@@ -64,13 +64,13 @@
     ];
 
   test_map() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var m = <String, int>{'a', 'b' : 2};
 ''', [CompileTimeErrorCode.EXPRESSION_IN_MAP]);
   }
 
   test_map_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var m = <String, int>{'a', 'b' : 2};
 ''', [CompileTimeErrorCode.EXPRESSION_IN_MAP]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/import_deferred_library_with_load_function_test.dart b/pkg/analyzer/test/src/diagnostics/import_deferred_library_with_load_function_test.dart
index 93e6065..6563a8a 100644
--- a/pkg/analyzer/test/src/diagnostics/import_deferred_library_with_load_function_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/import_deferred_library_with_load_function_test.dart
@@ -28,7 +28,8 @@
 
     await _resolveTestFile('/pkg1/lib/lib1.dart');
     await _resolveTestFile('/pkg1/lib/lib2.dart');
-    assertTestErrors([HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
+    assertTestErrorsWithCodes(
+        [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
   }
 
   test_deferredImport_withoutLoadLibraryFunction() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index c67ce98..6e45cc9 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class InvalidAssignmentTest extends DriverResolutionTest {
   test_instanceVariable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int x;
 }
@@ -30,7 +30,7 @@
   }
 
   test_localVariable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(var y) {
   if (y is String) {
     int x = y;
@@ -58,7 +58,7 @@
   }
 
   test_staticVariable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   static int x;
 }
@@ -71,7 +71,7 @@
   }
 
   test_typeParameterRecursion_regress35306() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {}
 class C extends D {}
@@ -87,7 +87,7 @@
 
   test_variableDeclaration() async {
     // 17971
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class Point {
   final num x, y;
   Point(this.x, this.y);
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart
index 7ea31a2..c60fc29 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_cast_new_expr_test.dart
@@ -21,7 +21,7 @@
       AnalysisOptionsImpl()..enabledExperiments = ['set-literals'];
 
   test_listLiteral_const() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 const c = <B>[A()];
 class A {
   const A();
@@ -36,7 +36,7 @@
   }
 
   test_listLiteral_nonConst() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 var c = <B>[A()];
 class A {
   const A();
@@ -48,7 +48,7 @@
   }
 
   test_setLiteral_const() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 const c = <B>{A()};
 class A {
   const A();
@@ -63,7 +63,7 @@
   }
 
   test_setLiteral_nonConst() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 var c = <B>{A()};
 class A {
   const A();
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_factory_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_factory_annotation_test.dart
index fc57260..d692547 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_factory_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_factory_annotation_test.dart
@@ -19,7 +19,7 @@
     with PackageMixin {
   test_class() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @factory
 class X {
@@ -29,7 +29,7 @@
 
   test_field() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class X {
   @factory
@@ -40,7 +40,7 @@
 
   test_topLevelFunction() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @factory
 main() { }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_factory_method_impl_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_factory_method_impl_test.dart
index 8ba3959..b685325 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_factory_method_impl_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_factory_method_impl_test.dart
@@ -31,7 +31,7 @@
 
   test_badReturn() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class Stateful {
   State _s = new State();
@@ -131,7 +131,7 @@
 
   test_voidReturn() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 class Stateful {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart
index 85ee340e..f494f73 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_immutable_annotation_test.dart
@@ -30,7 +30,7 @@
 
   test_method() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @immutable
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart
index c9a88ca..5a3c051 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_literal_annotation_test.dart
@@ -30,7 +30,7 @@
 
   test_nonConstConstructor() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @literal
@@ -41,7 +41,7 @@
 
   test_nonConstructor() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @literal
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart
index 7b57b1e..867b204 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_named_test.dart
@@ -58,7 +58,7 @@
   test_equal_values_generic_undefined_value_base() async {
     // Note: we expect some errors due to the constant referring to undefined
     // values, but there should not be any INVALID_OVERRIDE... error.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   m({x = Undefined.value}) {}
 }
@@ -74,7 +74,7 @@
   test_equal_values_generic_undefined_value_both() async {
     // Note: we expect some errors due to the constant referring to undefined
     // values, but there should not be any INVALID_OVERRIDE... error.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   m({x = Undefined.value}) {}
 }
@@ -92,7 +92,7 @@
   test_equal_values_generic_undefined_value_derived() async {
     // Note: we expect some errors due to the constant referring to undefined
     // values, but there should not be any INVALID_OVERRIDE... error.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   m({x = 1}) {}
 }
@@ -175,7 +175,7 @@
   }
 
   Future<void> _assertError(String code) async {
-    await assertErrorsInCode(code, [
+    await assertErrorCodesInCode(code, [
       StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart
index b3f03a6..d1421cb 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_different_default_values_positional_test.dart
@@ -58,7 +58,7 @@
   test_equal_values_generic_undefined_value_base() async {
     // Note: we expect some errors due to the constant referring to undefined
     // values, but there should not be any INVALID_OVERRIDE... error.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   m([x = Undefined.value]) {}
 }
@@ -74,7 +74,7 @@
   test_equal_values_generic_undefined_value_both() async {
     // Note: we expect some errors due to the constant referring to undefined
     // values, but there should not be any INVALID_OVERRIDE... error.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   m([x = Undefined.value]) {}
 }
@@ -92,7 +92,7 @@
   test_equal_values_generic_undefined_value_derived() async {
     // Note: we expect some errors due to the constant referring to undefined
     // values, but there should not be any INVALID_OVERRIDE... error.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   m([x = 1]) {}
 }
@@ -175,7 +175,7 @@
   }
 
   Future<void> _assertError(String code) async {
-    await assertErrorsInCode(code, [
+    await assertErrorCodesInCode(code, [
       StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
index 96f6722c..2194b85 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
@@ -23,7 +23,7 @@
   }
 
   test_namedParameter_withDefault() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 m({@required a = 1}) => null;
@@ -31,7 +31,7 @@
   }
 
   test_positionalParameter_noDefault() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 m([@required a]) => null;
@@ -39,7 +39,7 @@
   }
 
   test_positionalParameter_withDefault() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 m([@required a = 1]) => null;
@@ -47,7 +47,7 @@
   }
 
   test_requiredParameter() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 m(@required a) => null;
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart
index 99876eb..428a164 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_sealed_annotation_test.dart
@@ -31,7 +31,7 @@
   }
 
   test_mixin() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 @sealed mixin M {}
@@ -51,7 +51,7 @@
   }
 
   test_nonClass() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 @sealed m({a = 1}) => null;
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_protected_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_protected_member_test.dart
index 81c2a4c..0458e81 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_protected_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_protected_member_test.dart
@@ -38,7 +38,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertTestErrorsWithCodes([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
   }
 
   test_extendingSubclass() async {
@@ -86,7 +86,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertTestErrorsWithCodes([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
   }
 
   test_field_subclassAndSameLibrary() async {
@@ -145,7 +145,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertTestErrorsWithCodes([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
   }
 
   test_function_sameLibrary() async {
@@ -208,7 +208,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertTestErrorsWithCodes([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
   }
 
   test_getter_subclass() async {
@@ -270,7 +270,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertTestErrorsWithCodes([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
   }
 
   test_method_subclass() async {
@@ -356,7 +356,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
+    assertTestErrorsWithCodes([HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
   }
 
   test_setter_sameClass() async {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index 71dde80..f14c277 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -52,7 +52,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
   }
 
   test_export() async {
@@ -91,7 +92,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
   }
 
   test_method_fromTemplate() async {
@@ -140,7 +142,7 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([
+    assertTestErrorsWithCodes([
       HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER,
       HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER
     ]);
@@ -214,7 +216,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER]);
   }
 
   /// Resolve the test file at [path].
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
index 5090d0d..984fbcf 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_testing_member_test.dart
@@ -37,7 +37,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
   }
 
   test_export() async {
@@ -116,7 +117,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
   }
 
   test_method() async {
@@ -137,7 +139,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
   }
 
   test_protectedAndForTesting_usedAsProtected() async {
@@ -203,7 +206,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
   }
 
   test_topLevelFunction() async {
@@ -222,7 +226,8 @@
 
     await _resolveTestFile('/lib1.dart');
     await _resolveTestFile('/lib2.dart');
-    assertTestErrors([HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
+    assertTestErrorsWithCodes(
+        [HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER]);
   }
 
   /// Resolve the test file at [path].
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart
index dd8ad78..b9523f5 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_visibility_annotation_test.dart
@@ -24,7 +24,7 @@
   }
 
   test_fields_multipleMixed() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   @visibleForTesting int _a, b;
@@ -33,7 +33,7 @@
   }
 
   test_fields_multiplePrivate() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   @visibleForTesting int _a, _b;
@@ -54,14 +54,14 @@
   }
 
   test_privateClass() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting class _C {}
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_privateConstructor() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   @visibleForTesting C._() {}
@@ -70,14 +70,14 @@
   }
 
   test_privateEnum() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting enum _E {a, b, c}
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_privateField() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   @visibleForTesting int _a;
@@ -86,7 +86,7 @@
   }
 
   test_privateMethod() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   @visibleForTesting void _m() {}
@@ -95,42 +95,42 @@
   }
 
   test_privateMixin() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting mixin _M {}
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_privateTopLevelFunction() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting void _f() {}
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_privateTopLevelVariable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting final _a = 1;
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_privateTypedef() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting typedef _T = Function();
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_topLevelVariable_multipleMixed() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting final _a = 1, b = 2;
 ''', [HintCode.INVALID_VISIBILITY_ANNOTATION]);
   }
 
   test_topLevelVariable_multiplePrivate() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @visibleForTesting final _a = 1, _b = 2;
 ''', [
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index 98381f5..65a09dc 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +12,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListElementTypeNotAssignableTest);
+    defineReflectiveTests(
+        ListElementTypeNotAssignableWithUIAsCodeAndConstantsTest);
     defineReflectiveTests(ListElementTypeNotAssignableWithUIAsCodeTest);
   });
 }
@@ -18,13 +21,13 @@
 @reflectiveTest
 class ListElementTypeNotAssignableTest extends DriverResolutionTest {
   test_const_stringInt() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <String>[42];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_const_stringInt_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const dynamic x = 42;
 var v = const <String>[x];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
@@ -50,7 +53,7 @@
   }
 
   test_nonConst_stringInt() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <String>[42];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
@@ -70,59 +73,105 @@
 }
 
 @reflectiveTest
+class ListElementTypeNotAssignableWithUIAsCodeAndConstantsTest
+    extends ListElementTypeNotAssignableWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class ListElementTypeNotAssignableWithUIAsCodeTest
     extends ListElementTypeNotAssignableTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_const_ifElement_thenElseFalse_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <int>[if (1 < 0) a else b];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <int>[if (1 < 0) a else b];
-''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <int>[if (1 < 0) 'a'];
-''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]
+            : [
+                StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+                CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT
+              ]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int>[if (1 < 0) a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int>[if (true) a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int>[if (true) a];
-''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_spread_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <int>[...[0, 1]];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_nonConst_ifElement_thenElseFalse_intDynamic() async {
@@ -142,7 +191,7 @@
   }
 
   test_nonConst_ifElement_thenFalse_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int>[if (1 < 0) 'a'];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/map_entry_not_in_map_test.dart b/pkg/analyzer/test/src/diagnostics/map_entry_not_in_map_test.dart
index 673c83a..782e3e7 100644
--- a/pkg/analyzer/test/src/diagnostics/map_entry_not_in_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_entry_not_in_map_test.dart
@@ -22,7 +22,7 @@
   bool get isUiAsCode => analysisOptions.experimentStatus.spread_collections;
 
   test_set() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var c = <int>{1:2};
 ''', [
       isUiAsCode
@@ -32,7 +32,7 @@
   }
 
   test_set_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var c = const <int>{1:2};
 ''', [
       isUiAsCode
@@ -52,13 +52,13 @@
     ];
 
   test_set() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var c = <int>{1:2};
 ''', [CompileTimeErrorCode.MAP_ENTRY_NOT_IN_MAP]);
   }
 
   test_set_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var c = const <int>{1:2};
 ''', [CompileTimeErrorCode.MAP_ENTRY_NOT_IN_MAP]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
index 2ea6a69..e629629 100644
--- a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapKeyTypeNotAssignableTest);
+    defineReflectiveTests(MapKeyTypeNotAssignableWithUIAsCodeAndConstantsTest);
     defineReflectiveTests(MapKeyTypeNotAssignableWithUIAsCodeTest);
   });
 }
@@ -25,14 +27,14 @@
   }
 
   test_const_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const dynamic a = 'a';
 var v = const <int, bool>{a : true};
 ''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_const_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <int, bool>{'a' : true};
 ''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
   }
@@ -52,80 +54,137 @@
   }
 
   test_nonConst_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int, bool>{'a' : true};
 ''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
   }
 }
 
 @reflectiveTest
+class MapKeyTypeNotAssignableWithUIAsCodeAndConstantsTest
+    extends MapKeyTypeNotAssignableWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class MapKeyTypeNotAssignableWithUIAsCodeTest
     extends MapKeyTypeNotAssignableTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_const_ifElement_thenElseFalse_intInt_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <int, bool>{if (1 < 0) a: true else b: false};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <int, bool>{if (1 < 0) a: true else b: false};
-''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int, bool>{if (1 < 0) a: true};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <int, bool>{if (1 < 0) 'a': true};
-''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]
+            : [
+                StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+                CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT
+              ]);
   }
 
   test_const_ifElement_thenTrue_intInt_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int, bool>{if (true) a: true};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int, bool>{if (true) a: true};
-''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_notConst() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final a = 0;
 var v = const <int, bool>{if (1 < 2) a: true};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_spread_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <int, String>{...{1: 'a'}};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_spread_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int, String>{...{a: 'a'}};
-''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]
+            : [
+                StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+                CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT
+              ]);
   }
 
   test_nonConst_ifElement_thenElseFalse_intInt_dynamic() async {
@@ -145,7 +204,7 @@
   }
 
   test_nonConst_ifElement_thenFalse_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int, bool>{if (1 < 0) 'a': true};
 ''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
   }
@@ -177,7 +236,7 @@
   }
 
   test_nonConst_spread_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int, String>{...{'a': 'a'}};
 ''', [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
index 3a9bc4a..c5e15e3 100644
--- a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +12,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapValueTypeNotAssignableTest);
+    defineReflectiveTests(
+        MapValueTypeNotAssignableWithUIAsCodeAndConstantsTest);
     defineReflectiveTests(MapValueTypeNotAssignableWithUIAsCodeTest);
   });
 }
@@ -25,14 +28,14 @@
   }
 
   test_const_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const dynamic a = 'a';
 var v = const <bool, int>{true: a};
 ''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_const_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <bool, int>{true: 'a'};
 ''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
   }
@@ -52,80 +55,136 @@
   }
 
   test_nonConst_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <bool, int>{true: 'a'};
 ''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
   }
 }
 
 @reflectiveTest
+class MapValueTypeNotAssignableWithUIAsCodeAndConstantsTest
+    extends MapValueTypeNotAssignableWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
+}
+
+@reflectiveTest
 class MapValueTypeNotAssignableWithUIAsCodeTest
     extends MapValueTypeNotAssignableTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_const_ifElement_thenElseFalse_intInt_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <bool, int>{if (1 < 0) true: a else false: b};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <bool, int>{if (1 < 0) true: a else false: b};
-''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <bool, int>{if (1 < 0) true: a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <bool, int>{if (1 < 0) true: 'a'};
-''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]
+            : [
+                StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+                CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT
+              ]);
   }
 
   test_const_ifElement_thenTrue_intInt_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <bool, int>{if (true) true: a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <bool, int>{if (true) true: a};
-''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_notConst() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final a = 0;
 var v = const <bool, int>{if (1 < 2) true: a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_spread_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <bool, int>{...{true: 1}};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_spread_intString_dynamic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <bool, int>{...{true: a}};
-''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]
+            : [
+                StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+                CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT
+              ]);
   }
 
   test_nonConst_ifElement_thenElseFalse_intInt_dynamic() async {
@@ -145,7 +204,7 @@
   }
 
   test_nonConst_ifElement_thenFalse_intString_value() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <bool, int>{if (1 < 0) true: 'a'};
 ''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
   }
@@ -177,7 +236,7 @@
   }
 
   test_nonConst_spread_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <bool, int>{...{true: 'a'}};
 ''', [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
index d73c1e7..99866a3 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
@@ -33,7 +33,7 @@
 
   test_constructorParam_missingArgument() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   C({@Required('must specify an `a`') int a}) {}
@@ -46,7 +46,7 @@
 
   test_constructorParam_noReason() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -61,7 +61,7 @@
 
   test_constructorParam_nullReason() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -76,7 +76,7 @@
 
   test_constructorParam_redirectingConstructorCall() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class C {
   C({@required int x});
@@ -87,7 +87,7 @@
 
   test_functionParam() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 void f({@Required('must specify an `a`') int a}) {}
@@ -100,7 +100,7 @@
 
   test_methodParam() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   void m({@Required('must specify an `a`') int a}) {}
@@ -129,12 +129,12 @@
 
     await _resolveTestFile('/a_lib.dart');
     await _resolveTestFile('/test.dart');
-    assertTestErrors([HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
+    assertTestErrorsWithCodes([HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
   }
 
   test_requiredConstructor_paramSuperCall() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -149,7 +149,7 @@
 
   test_typedef_functionParam() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 
 String test(C c) => c.m()();
diff --git a/pkg/analyzer/test/src/diagnostics/missing_return_test.dart b/pkg/analyzer/test/src/diagnostics/missing_return_test.dart
index a83bb3a..41042fb 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_return_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_return_test.dart
@@ -32,7 +32,7 @@
   }
 
   test_async() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'dart:async';
 Future<int> f() async {}
 ''', [HintCode.MISSING_RETURN]);
@@ -66,7 +66,7 @@
   }
 
   test_factory() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   factory A() {}
 }
@@ -74,20 +74,20 @@
   }
 
   test_function() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 int f() {}
 ''', [HintCode.MISSING_RETURN]);
   }
 
   test_method() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int m() {}
 }''', [HintCode.MISSING_RETURN]);
   }
 
   test_method_inferred() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 abstract class A {
   int m();
 }
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
index ab64700..4d96004 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
@@ -30,7 +30,7 @@
 mixin Bar on Foo {}
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.MIXIN_ON_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.MIXIN_ON_SEALED_CLASS]);
   }
 
   test_withinLibrary_OK() async {
diff --git a/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart b/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart
index 2e425d4..e907d2c 100644
--- a/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/must_be_immutable_test.dart
@@ -22,7 +22,7 @@
   }
 
   test_directAnnotation() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @immutable
 class A {
@@ -32,7 +32,7 @@
   }
 
   test_directMixinAnnotation() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @immutable
 mixin A {
@@ -42,7 +42,7 @@
   }
 
   test_extendsClassWithAnnotation() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @immutable
 class A {}
@@ -64,7 +64,7 @@
   }
 
   test_fromMixinWithAnnotation() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @immutable
 class A {}
@@ -76,7 +76,7 @@
   }
 
   test_mixinApplication() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 @immutable
 class A {}
@@ -88,7 +88,7 @@
   }
 
   test_mixinApplicationBase() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   int x;
diff --git a/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart b/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
index 5ef8e97..588df81 100644
--- a/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/must_call_super_test.dart
@@ -38,7 +38,7 @@
   }
 
   test_fromExtendingClass() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @mustCallSuper
@@ -67,7 +67,7 @@
   }
 
   test_indirectlyInherited() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @mustCallSuper
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
index 4865ced..3199d246 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
 //    defineReflectiveTests(NonBoolConditionTest);
+    defineReflectiveTests(NonBoolConditionWithUIAsCodeAndConstantsTest);
     defineReflectiveTests(NonBoolConditionWithUIAsCodeTest);
   });
 }
@@ -20,6 +21,18 @@
 class NonBoolConditionTest extends DriverResolutionTest {}
 
 @reflectiveTest
+class NonBoolConditionWithUIAsCodeAndConstantsTest
+    extends NonBoolConditionWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonBoolConditionWithUIAsCodeTest extends NonBoolConditionTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
@@ -29,8 +42,15 @@
     ];
 
   test_ifElement() async {
-    assertErrorsInCode('''
+    assertErrorCodesInCode(
+        '''
 const c = [if (3) 1];
-''', [StaticTypeWarningCode.NON_BOOL_CONDITION]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticTypeWarningCode.NON_BOOL_CONDITION]
+            : [
+                StaticTypeWarningCode.NON_BOOL_CONDITION,
+                CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT
+              ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
index e4b8eab..3b24286 100644
--- a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
@@ -62,7 +62,7 @@
   }
 
   test_namedConstructor() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @literal
@@ -75,7 +75,7 @@
   }
 
   test_nonConstContext() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @literal
@@ -102,7 +102,7 @@
   }
 
   test_usingNew() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'package:meta/meta.dart';
 class A {
   @literal
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_if_element_condition_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_if_element_condition_from_deferred_library_test.dart
index 2da7688..759b7de 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_if_element_condition_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_if_element_condition_from_deferred_library_test.dart
@@ -28,14 +28,18 @@
   test_inList_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const [if(a.c) 0];
-}''', [
-      CompileTimeErrorCode
-          .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY
-    ]);
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_inList_nonConst() async {
@@ -51,24 +55,32 @@
   test_inList_notDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertNoErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' as a;
 f() {
   return const [if(a.c) 0];
-}''');
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_inMap_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {if(a.c) 0 : 0};
-}''', [
-      CompileTimeErrorCode
-          .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY
-    ]);
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_inMap_notConst() async {
@@ -84,24 +96,32 @@
   test_inMap_notDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertNoErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' as a;
 f() {
   return const {if(a.c) 0 : 0};
-}''');
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_inSet_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {if(a.c) 0};
-}''', [
-      CompileTimeErrorCode
-          .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY
-    ]);
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_inSet_notConst() async {
@@ -117,10 +137,26 @@
   test_inSet_notDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertNoErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' as a;
 f() {
   return const {if(a.c) 0};
-}''');
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 }
+
+@reflectiveTest
+class NonConstantIfElementConditionFromDeferredLibraryWithConstantsTest
+    extends NonConstantIfElementConditionFromDeferredLibraryTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
index 9a486ea..8359de2 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
@@ -13,6 +13,8 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantListElementFromDeferredLibraryTest);
     defineReflectiveTests(
+        NonConstantListValueFromDeferredLibraryWithUiAsCodeAndConstantsTest);
+    defineReflectiveTests(
         NonConstantListValueFromDeferredLibraryWithUiAsCodeTest);
   });
 }
@@ -23,7 +25,7 @@
   test_const_topLevel_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const [a.c];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
@@ -32,7 +34,7 @@
   test_const_topLevel_deferred_nested() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const [a.c + 1];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
@@ -40,6 +42,18 @@
 }
 
 @reflectiveTest
+class NonConstantListValueFromDeferredLibraryWithUiAsCodeAndConstantsTest
+    extends NonConstantListValueFromDeferredLibraryWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantListValueFromDeferredLibraryWithUiAsCodeTest
     extends NonConstantListElementFromDeferredLibraryTest {
   @override
@@ -54,7 +68,7 @@
     // reports wrong error code (which is not crucial to fix)
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const [ if (cond) 'a' else a.c ];
@@ -64,10 +78,17 @@
   test_const_ifElement_thenTrue_deferredThen() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const [ if (cond) a.c ];
-''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
index 96fd900..aafeb85 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantListElementTest);
+    defineReflectiveTests(NonConstantListElementWithUiAsCodeAndConstantsTest);
     defineReflectiveTests(NonConstantListElementWithUiAsCodeTest);
   });
 }
@@ -19,14 +20,14 @@
 @reflectiveTest
 class NonConstantListElementTest extends DriverResolutionTest {
   test_const_topVar() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [a];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_topVar_nested() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 final dynamic a = 0;
 var v = const [a + 1];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
@@ -41,6 +42,18 @@
 }
 
 @reflectiveTest
+class NonConstantListElementWithUiAsCodeAndConstantsTest
+    extends NonConstantListElementWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantListElementWithUiAsCodeTest
     extends NonConstantListElementTest {
   @override
@@ -51,63 +64,71 @@
     ];
 
   test_const_forElement() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 const Set set = {};
 var v = const [for(final x in set) x];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [if (1 < 0) 0 else a];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [if (1 < 0) a else 0];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [if (1 > 0) 0 else a];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [if (1 > 0) a else 0];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const [if (1 < 0) a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [if (1 < 0) a];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const [if (1 > 0) a];
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const [if (1 > 0) a];
 ''', [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
index ddff55a..692b49b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
@@ -11,6 +11,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(NonConstantMapElementWithUiAsCodeAndConstantTest);
     defineReflectiveTests(NonConstantMapElementWithUiAsCodeTest);
     defineReflectiveTests(NonConstantMapKeyTest);
     defineReflectiveTests(NonConstantMapKeyWithUiAsCodeTest);
@@ -20,6 +21,18 @@
 }
 
 @reflectiveTest
+class NonConstantMapElementWithUiAsCodeAndConstantTest
+    extends NonConstantMapElementWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantMapElementWithUiAsCodeTest extends DriverResolutionTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
@@ -29,7 +42,7 @@
     ];
 
   test_forElement_cannotBeConst() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 void main() {
   const {1: null, for (final x in const []) null: null};
 }
@@ -37,7 +50,7 @@
   }
 
   test_forElement_nested_cannotBeConst() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 void main() {
   const {1: null, if (true) for (final x in const []) null: null};
 }
@@ -54,23 +67,31 @@
   }
 
   test_ifElement_mayBeConst() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 void main() {
   const {1: null, if (true) null: null};
 }
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_ifElement_nested_mayBeConst() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 void main() {
   const {1: null, if (true) if (true) null: null};
 }
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_ifElement_notConstCondition() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 void main() {
   bool notConst = true;
   const {1: null, if (notConst) null: null};
@@ -79,24 +100,32 @@
   }
 
   test_ifElementWithElse_mayBeConst() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 void main() {
   const isTrue = true;
   const {1: null, if (isTrue) null: null else null: null};
 }
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_spreadElement_mayBeConst() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 void main() {
   const {1: null, ...{null: null}};
 }
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_spreadElement_notConst() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 void main() {
   var notConst = {};
   const {1: null, ...notConst};
@@ -108,7 +137,7 @@
 @reflectiveTest
 class NonConstantMapKeyTest extends DriverResolutionTest {
   test_const_topVar() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int, int>{a: 0};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
@@ -132,66 +161,98 @@
     ];
 
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: 0 else a: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0 else 0: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: 0 else a: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0 else 0: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
 
 @reflectiveTest
 class NonConstantMapValueTest extends DriverResolutionTest {
   test_const_topVar() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int, int>{0: a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
@@ -215,58 +276,90 @@
     ];
 
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: 0 else 0: a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a else 0: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: 0 else 0: a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a else 0: 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
index be77d50..43225c7 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
@@ -12,6 +12,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest);
+    defineReflectiveTests(
+        NonConstantMapKeyFromDeferredLibraryWithUiAsCodeAndConstantsTest);
     defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryWithUiAsCodeTest);
   });
 }
@@ -21,7 +23,7 @@
   test_const_topLevel_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const {a.c : 0};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
@@ -30,7 +32,7 @@
   test_const_topLevel_deferred_nested() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const {a.c + 1 : 0};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
@@ -38,6 +40,18 @@
 }
 
 @reflectiveTest
+class NonConstantMapKeyFromDeferredLibraryWithUiAsCodeAndConstantsTest
+    extends NonConstantMapKeyFromDeferredLibraryWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantMapKeyFromDeferredLibraryWithUiAsCodeTest
     extends NonConstantMapKeyFromDeferredLibraryTest {
   @override
@@ -52,7 +66,7 @@
 // reports wrong error code
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const { if (cond) 0: 1 else a.c : 0};
@@ -62,10 +76,14 @@
   test_const_ifElement_thenTrue_deferredThen() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const { if (cond) a.c : 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
index 95ec677..48a454b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapKeyTest);
+    defineReflectiveTests(NonConstantMapKeyWithUiAsCodeAndConstantsTest);
     defineReflectiveTests(NonConstantMapKeyWithUiAsCodeTest);
   });
 }
@@ -19,7 +20,7 @@
 @reflectiveTest
 class NonConstantMapKeyTest extends DriverResolutionTest {
   test_const_topLevel() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 final dynamic a = 0;
 var v = const {a : 0};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
@@ -27,6 +28,18 @@
 }
 
 @reflectiveTest
+class NonConstantMapKeyWithUiAsCodeAndConstantsTest
+    extends NonConstantMapKeyWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantMapKeyWithUiAsCodeTest extends NonConstantMapKeyTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
@@ -36,18 +49,26 @@
     ];
 
   test_const_ifElement_thenTrue_elseFinal() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) 0: 1 else a : 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_thenFinal() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) a : 0};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
index ce04f02..ddfde67 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
@@ -13,6 +13,8 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapValueFromDeferredLibraryTest);
     defineReflectiveTests(
+        NonConstantMapValueFromDeferredLibraryWithUiAsCodeAndConstantsTest);
+    defineReflectiveTests(
         NonConstantMapValueFromDeferredLibraryWithUiAsCodeTest);
   });
 }
@@ -22,7 +24,7 @@
   test_const_topLevel_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const {'a' : a.c};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
@@ -31,7 +33,7 @@
   test_const_topLevel_deferred_nested() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const {'a' : a.c + 1};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
@@ -39,6 +41,18 @@
 }
 
 @reflectiveTest
+class NonConstantMapValueFromDeferredLibraryWithUiAsCodeAndConstantsTest
+    extends NonConstantMapValueFromDeferredLibraryWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantMapValueFromDeferredLibraryWithUiAsCodeTest
     extends NonConstantMapValueFromDeferredLibraryTest {
   @override
@@ -53,7 +67,7 @@
     // reports wrong error code
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const { if (cond) 'a': 'b' else 'c' : a.c};
@@ -63,10 +77,17 @@
   test_const_ifElement_thenTrue_thenDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const { if (cond) 'a' : a.c};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
index 75b20d5..a88a96d 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapValueTest);
+    defineReflectiveTests(NonConstantMapValueWithUiAsCodeAndConstantsTest);
     defineReflectiveTests(NonConstantMapValueWithUiAsCodeTest);
   });
 }
@@ -19,7 +20,7 @@
 @reflectiveTest
 class NonConstantMapValueTest extends DriverResolutionTest {
   test_const_topLevel() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 final dynamic a = 0;
 var v = const {'a' : a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
@@ -27,6 +28,18 @@
 }
 
 @reflectiveTest
+class NonConstantMapValueWithUiAsCodeAndConstantsTest
+    extends NonConstantMapValueWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantMapValueWithUiAsCodeTest extends NonConstantMapValueTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
@@ -36,18 +49,29 @@
     ];
 
   test_const_ifTrue_elseFinal() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) 'a': 'b', 'c' : a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [
+                CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
+                CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT
+              ]);
   }
 
   test_const_ifTrue_thenFinal() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) 'a' : a};
-''', [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_from_deferred_library_test.dart
index 59bdddb..7a2ea68 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_from_deferred_library_test.dart
@@ -13,6 +13,8 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantSetElementFromDeferredLibraryTest);
     defineReflectiveTests(
+        NonConstantSetElementFromDeferredLibraryWithUiAsCodeAndConstantsTest);
+    defineReflectiveTests(
         NonConstantSetElementFromDeferredLibraryWithUiAsCodeTest);
   });
 }
@@ -23,7 +25,7 @@
   test_const_topLevel_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const {a.c};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY]);
@@ -32,7 +34,7 @@
   test_const_topLevel_deferred_nested() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 var v = const {a.c + 1};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY]);
@@ -40,6 +42,18 @@
 }
 
 @reflectiveTest
+class NonConstantSetElementFromDeferredLibraryWithUiAsCodeAndConstantsTest
+    extends NonConstantSetElementFromDeferredLibraryWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantSetElementFromDeferredLibraryWithUiAsCodeTest
     extends NonConstantSetElementFromDeferredLibraryTest {
   @override
@@ -54,7 +68,7 @@
     // reports wrong error code
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const {if (cond) null else a.c};
@@ -64,10 +78,17 @@
   test_const_ifElement_thenTrue_thenDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const {if (cond) a.c};
-''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
index ac0fdf9..753d602 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
@@ -12,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantSetElementTest);
+    defineReflectiveTests(NonConstantSetElementWithUiAsCodeAndConstantsTest);
     defineReflectiveTests(NonConstantSetElementWithUiAsCodeTest);
   });
 }
@@ -19,14 +20,14 @@
 @reflectiveTest
 class NonConstantSetElementTest extends DriverResolutionTest {
   test_const_parameter() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(a) {
   return const {a};
 }''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_topVar() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
@@ -41,6 +42,18 @@
 }
 
 @reflectiveTest
+class NonConstantSetElementWithUiAsCodeAndConstantsTest
+    extends NonConstantSetElementWithUiAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class NonConstantSetElementWithUiAsCodeTest extends NonConstantSetElementTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
@@ -50,63 +63,71 @@
     ];
 
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) 0 else a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) a else 0};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) 0 else a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) a else 0};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int>{if (1 < 0) a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int>{if (1 > 0) a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) a};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_spread_final() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 final Set x = null;
 var v = const {...x};
 ''', [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_spread_expression_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_spread_expression_from_deferred_library_test.dart
index c7f752bd..5d0e702 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_spread_expression_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_spread_expression_from_deferred_library_test.dart
@@ -12,6 +12,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantSpreadExpressionFromDeferredLibraryTest);
+    defineReflectiveTests(
+        NonConstantSpreadExpressionFromDeferredLibraryWithConstantsTest);
   });
 }
 
@@ -28,13 +30,18 @@
   test_inList_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const List c = [];''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const [...a.c];
-}''', [
-      CompileTimeErrorCode.NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY
-    ]);
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_inList_deferred_notConst() async {
@@ -50,23 +57,32 @@
   test_inList_notDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const List c = [];''');
-    await assertNoErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' as a;
 f() {
   return const [...a.c];
-}''');
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
   }
 
   test_inMap_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const Map c = <int, int>{};''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {...a.c};
-}''', [
-      CompileTimeErrorCode.NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY
-    ]);
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_inMap_notConst() async {
@@ -82,23 +98,32 @@
   test_inMap_notDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const Map c = <int, int>{};''');
-    await assertNoErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' as a;
 f() {
   return const {...a.c};
-}''');
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT]);
   }
 
   test_inSet_deferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const Set c = <int>{};''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {...a.c};
-}''', [
-      CompileTimeErrorCode.NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY
-    ]);
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [
+                CompileTimeErrorCode
+                    .NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY
+              ]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_inSet_notConst() async {
@@ -114,10 +139,26 @@
   test_inSet_notDeferred() async {
     newFile(convertPath('/test/lib/lib1.dart'), content: r'''
 const Set c = <int>{};''');
-    await assertNoErrorsInCode(r'''
+    await assertErrorCodesInCode(
+        r'''
 import 'lib1.dart' as a;
 f() {
   return const {...a.c};
-}''');
+}''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 }
+
+@reflectiveTest
+class NonConstantSpreadExpressionFromDeferredLibraryWithConstantsTest
+    extends NonConstantSpreadExpressionFromDeferredLibraryTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
index f326006..08a4506 100644
--- a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
@@ -38,28 +38,28 @@
   }
 
   test_notIterable_direct() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = [...a];
 ''', [CompileTimeErrorCode.NOT_ITERABLE_SPREAD]);
   }
 
   test_notIterable_forElement() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = [for (var i in []) ...a];
 ''', [CompileTimeErrorCode.NOT_ITERABLE_SPREAD]);
   }
 
   test_notIterable_ifElement_else() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = [if (1 > 0) ...[] else ...a];
 ''', [CompileTimeErrorCode.NOT_ITERABLE_SPREAD]);
   }
 
   test_notIterable_ifElement_then() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = [if (1 > 0) ...a];
 ''', [CompileTimeErrorCode.NOT_ITERABLE_SPREAD]);
diff --git a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
index a9bf651..57031dd 100644
--- a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
@@ -38,28 +38,28 @@
   }
 
   test_notMap_direct() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = <int, int>{...a};
 ''', [CompileTimeErrorCode.NOT_MAP_SPREAD]);
   }
 
   test_notMap_forElement() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = <int, int>{for (var i in []) ...a};
 ''', [CompileTimeErrorCode.NOT_MAP_SPREAD]);
   }
 
   test_notMap_ifElement_else() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = <int, int>{if (1 > 0) ...<int, int>{} else ...a};
 ''', [CompileTimeErrorCode.NOT_MAP_SPREAD]);
   }
 
   test_notMap_ifElement_then() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var a = 0;
 var v = <int, int>{if (1 > 0) ...a};
 ''', [CompileTimeErrorCode.NOT_MAP_SPREAD]);
diff --git a/pkg/analyzer/test/src/diagnostics/not_null_aware_null_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_null_aware_null_spread_test.dart
index 4a04ab2..45ffdf8 100644
--- a/pkg/analyzer/test/src/diagnostics/not_null_aware_null_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_null_aware_null_spread_test.dart
@@ -25,13 +25,13 @@
     ];
 
   test_listLiteral_notNullAware_nullLiteral() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = [...null];
 ''', [CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD]);
   }
 
   test_listLiteral_notNullAware_nullTyped() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 Null a = null;
 var v = [...a];
 ''', [CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD]);
@@ -51,13 +51,13 @@
   }
 
   test_mapLiteral_notNullAware_nullLiteral() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int, int>{...null};
 ''', [CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD]);
   }
 
   test_mapLiteral_notNullAware_nullType() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 Null a = null;
 var v = <int, int>{...a};
 ''', [CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD]);
@@ -77,13 +77,13 @@
   }
 
   test_setLiteral_notNullAware_nullLiteral() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int>{...null};
 ''', [CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD]);
   }
 
   test_setLiteral_notNullAware_nullTyped() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 Null a = null;
 var v = <int>{...a};
 ''', [CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD]);
diff --git a/pkg/analyzer/test/src/diagnostics/null_aware_before_operator_test.dart b/pkg/analyzer/test/src/diagnostics/null_aware_before_operator_test.dart
index 5505086..7f89a71 100644
--- a/pkg/analyzer/test/src/diagnostics/null_aware_before_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/null_aware_before_operator_test.dart
@@ -48,7 +48,7 @@
   }
 
   test_minus() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x?.a - '';
 }
diff --git a/pkg/analyzer/test/src/diagnostics/null_aware_in_condition_test.dart b/pkg/analyzer/test/src/diagnostics/null_aware_in_condition_test.dart
index 18bed78..89203f2 100644
--- a/pkg/analyzer/test/src/diagnostics/null_aware_in_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/null_aware_in_condition_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class NullAwareInConditionTest extends DriverResolutionTest {
   test_assert() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   assert (x?.a);
 }
@@ -24,7 +24,7 @@
   }
 
   test_conditionalExpression() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   return x?.a ? 0 : 1;
 }
@@ -32,7 +32,7 @@
   }
 
   test_do() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   do {} while (x?.a);
 }
@@ -40,7 +40,7 @@
   }
 
   test_for() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   for (var v = x; v?.a; v = v.next) {}
 }
@@ -48,7 +48,7 @@
   }
 
   test_if() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   if (x?.a) {}
 }
@@ -56,7 +56,7 @@
   }
 
   test_if_parenthesized() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   if ((x?.a)) {}
 }
@@ -64,7 +64,7 @@
   }
 
   test_while() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   while (x?.a) {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/null_aware_in_logical_operator_test.dart b/pkg/analyzer/test/src/diagnostics/null_aware_in_logical_operator_test.dart
index 05f7a5e..b60810e 100644
--- a/pkg/analyzer/test/src/diagnostics/null_aware_in_logical_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/null_aware_in_logical_operator_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class NullAwareInLogicalOperatorTest extends DriverResolutionTest {
   test_conditionalAnd_first() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x?.a && x.b;
 }
@@ -24,7 +24,7 @@
   }
 
   test_conditionalAnd_second() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x.a && x?.b;
 }
@@ -32,7 +32,7 @@
   }
 
   test_conditionalAnd_third() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x.a && x.b && x?.c;
 }
@@ -40,7 +40,7 @@
   }
 
   test_conditionalOr_first() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x?.a || x.b;
 }
@@ -48,7 +48,7 @@
   }
 
   test_conditionalOr_second() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x.a || x?.b;
 }
@@ -56,7 +56,7 @@
   }
 
   test_conditionalOr_third() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   x.a || x.b || x?.c;
 }
@@ -80,7 +80,7 @@
   }
 
   test_not() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(x) {
   !x?.a;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart
new file mode 100644
index 0000000..b500cd6
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullableTypeInCatchClauseTest);
+  });
+}
+
+@reflectiveTest
+class NullableTypeInCatchClauseTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_noOnClause() async {
+    assertNoErrorsInCode('''
+f() {
+  try {
+  } catch (e) {
+  }
+}
+''');
+  }
+
+  test_on_class() async {
+    assertErrorsInCode('''
+class A {}
+f() {
+  try {
+  } on A? {
+  }
+}
+''', [
+      error(CompileTimeErrorCode.NULLABLE_TYPE_IN_CATCH_CLAUSE, 32, 2),
+    ]);
+  }
+
+  test_on_typeParameter() async {
+    assertErrorsInCode('''
+class A<B> {
+  m() {
+    try {
+    } on B {
+    }
+  }
+}
+''', [
+      error(CompileTimeErrorCode.NULLABLE_TYPE_IN_CATCH_CLAUSE, 40, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart
new file mode 100644
index 0000000..2478d79
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullableTypeInExtendsClauseTest);
+  });
+}
+
+@reflectiveTest
+class NullableTypeInExtendsClauseTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_class_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+class B extends A {}
+''');
+  }
+
+  test_class_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+class B extends A? {}
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE]);
+  }
+
+  test_classAlias_withClass_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+class B {}
+class C = A with B;
+''');
+  }
+
+  test_classAlias_withClass_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+class B {}
+class C = A? with B;
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE]);
+  }
+
+  test_classAlias_withMixin_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+mixin B {}
+class C = A with B;
+''');
+  }
+
+  test_classAlias_withMixin_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+mixin B {}
+class C = A? with B;
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_EXTENDS_CLAUSE]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart
new file mode 100644
index 0000000..ec81d73
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullableTypeInImplementsClauseTest);
+  });
+}
+
+@reflectiveTest
+class NullableTypeInImplementsClauseTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_class_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+class B implements A {}
+''');
+  }
+
+  test_class_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+class B implements A? {}
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE]);
+  }
+
+  test_mixin_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+mixin B implements A {}
+''');
+  }
+
+  test_mixin_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+mixin B implements A? {}
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart
new file mode 100644
index 0000000..d9613ee
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullableTypeInOnClauseTest);
+  });
+}
+
+@reflectiveTest
+class NullableTypeInOnClauseTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+mixin B on A {}
+''');
+  }
+
+  test_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+mixin B on A? {}
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_ON_CLAUSE]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart
new file mode 100644
index 0000000..d25ad1f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullableTypeInWithClauseTest);
+  });
+}
+
+@reflectiveTest
+class NullableTypeInWithClauseTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_class_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+class B with A {}
+''');
+  }
+
+  test_class_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+class B with A? {}
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE]);
+  }
+
+  test_classAlias_withClass_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+class B {}
+class C = A with B;
+''');
+  }
+
+  test_classAlias_withClass_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+class B {}
+class C = A with B?;
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE]);
+  }
+
+  test_classAlias_withMixin_nonNullable() async {
+    assertNoErrorsInCode('''
+class A {}
+mixin B {}
+class C = A with B;
+''');
+  }
+
+  test_classAlias_withMixin_nullable() async {
+    assertErrorCodesInCode('''
+class A {}
+mixin B {}
+class C = A with B?;
+''', [CompileTimeErrorCode.NULLABLE_TYPE_IN_WITH_CLAUSE]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/override_equals_but_not_hashcode_test.dart b/pkg/analyzer/test/src/diagnostics/override_equals_but_not_hashcode_test.dart
index 898bbe1..7ecb535 100644
--- a/pkg/analyzer/test/src/diagnostics/override_equals_but_not_hashcode_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/override_equals_but_not_hashcode_test.dart
@@ -25,7 +25,7 @@
 
   @failingTest
   test_overrideEquals_andNotHashCode() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   bool operator ==(x) {}
 }''', [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
diff --git a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_field_test.dart b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_field_test.dart
index 8bb0368..514ad99 100644
--- a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_field_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class OverrideOnNonOverridingFieldTest extends DriverResolutionTest {
   test_inInterface() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int get a => 0;
   void set b(_) {}
@@ -33,7 +33,7 @@
   }
 
   test_inSuperclass() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int get a => 0;
   void set b(_) {}
@@ -50,7 +50,7 @@
   }
 
   test_invalid() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
 }
 class B extends A {
diff --git a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_getter_test.dart b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_getter_test.dart
index c9b41a6..58dfef6 100644
--- a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_getter_test.dart
@@ -38,7 +38,7 @@
   }
 
   test_invalid() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
 }
 class B extends A {
diff --git a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_method_test.dart b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_method_test.dart
index fb6038e..608295d 100644
--- a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_method_test.dart
@@ -65,7 +65,7 @@
   }
 
   test_invalid() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
 }
 class B extends A {
diff --git a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_setter_test.dart b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_setter_test.dart
index a9b4b62..0625741 100644
--- a/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/override_on_non_overriding_setter_test.dart
@@ -38,7 +38,7 @@
   }
 
   test_invalid() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
 }
 class B extends A {
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart b/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart
index 0624d6a..feb02f5 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_constraint_verifier_support.dart
@@ -17,6 +17,6 @@
     driver.configure(
         analysisOptions: analysisOptions
           ..sdkVersionConstraint = VersionConstraint.parse(version));
-    await assertErrorsInCode(source, errorCodes ?? []);
+    await assertErrorCodesInCode(source, errorCodes ?? []);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
index 1296385..1a71c80 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +12,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementTypeNotAssignableTest);
+    defineReflectiveTests(
+        SetElementTypeNotAssignableWithUiAsCodeAndConstantTest);
     defineReflectiveTests(SetElementTypeNotAssignableWithUIAsCodeTest);
   });
 }
@@ -18,7 +21,7 @@
 @reflectiveTest
 class SetElementTypeNotAssignableTest extends DriverResolutionTest {
   test_explicitTypeArgs_const() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = const <String>{42};
 ''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
@@ -31,73 +34,119 @@
   }
 
   test_explicitTypeArgs_const_actualTypeMismatch() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 const dynamic x = 42;
 var v = const <String>{x};
 ''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
 
   test_explicitTypeArgs_notConst() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <String>{42};
 ''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
 }
 
 @reflectiveTest
+class SetElementTypeNotAssignableWithUiAsCodeAndConstantTest
+    extends SetElementTypeNotAssignableWithUIAsCodeTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections,
+      EnableString.constant_update_2018
+    ];
+}
+
+@reflectiveTest
 class SetElementTypeNotAssignableWithUIAsCodeTest
     extends SetElementTypeNotAssignableTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..enabledExperiments = ['control-flow-collections', 'spread-collections'];
+    ..enabledExperiments = [
+      EnableString.control_flow_collections,
+      EnableString.spread_collections
+    ];
 
   test_const_ifElement_thenElseFalse_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <int>{if (1 < 0) a else b};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenElseFalse_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <int>{if (1 < 0) a else b};
-''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenFalse_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <int>{if (1 < 0) 'a'};
-''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]
+            : [
+                StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
+                CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT
+              ]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int>{if (1 < 0) a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 0;
 var v = const <int>{if (true) a};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_ifElement_thenTrue_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 const dynamic a = 'a';
 var v = const <int>{if (true) a};
-''', [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_const_spread_intInt() async {
-    await assertNoErrorsInCode('''
+    await assertErrorCodesInCode(
+        '''
 var v = const <int>{...[0, 1]};
-''');
+''',
+        analysisOptions.experimentStatus.constant_update_2018
+            ? []
+            : [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
   }
 
   test_nonConst_ifElement_thenElseFalse_intDynamic() async {
@@ -117,7 +166,7 @@
   }
 
   test_nonConst_ifElement_thenFalse_intString() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 var v = <int>[if (1 < 0) 'a'];
 ''', [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
index 6801637..ab27d78 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
@@ -30,7 +30,7 @@
 class Bar extends Foo {}
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.SUBTYPE_OF_SEALED_CLASS]);
   }
 
   test_implementingSealedClass() async {
@@ -46,7 +46,7 @@
 class Bar implements Foo {}
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.SUBTYPE_OF_SEALED_CLASS]);
   }
 
   test_mixinApplicationOfSealedClass() async {
@@ -63,7 +63,7 @@
 class Bar2 = Bar1 with Foo;
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.SUBTYPE_OF_SEALED_CLASS]);
   }
 
   test_mixinApplicationOfSealedMixin() async {
@@ -80,7 +80,7 @@
 class Bar2 = Bar1 with Foo;
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.SUBTYPE_OF_SEALED_CLASS]);
   }
 
   test_mixingInWithSealedMixin() async {
@@ -96,7 +96,7 @@
 class Bar extends Object with Foo {}
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.SUBTYPE_OF_SEALED_CLASS]);
   }
 
   test_mixinImplementsSealedClass() async {
@@ -112,7 +112,7 @@
 mixin Bar implements Foo {}
 ''');
     await _resolveTestFile('/pkg1/lib/lib1.dart');
-    assertTestErrors([HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    assertTestErrorsWithCodes([HintCode.SUBTYPE_OF_SEALED_CLASS]);
   }
 
   test_withinLibrary_OK() async {
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 7bf4d02..56a1409 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -86,6 +86,14 @@
 import 'null_aware_in_condition_test.dart' as null_aware_in_condition;
 import 'null_aware_in_logical_operator_test.dart'
     as null_aware_in_logical_operator;
+import 'nullable_type_in_catch_clause_test.dart'
+    as nullable_type_in_catch_clause;
+import 'nullable_type_in_extends_clause_test.dart'
+    as nullable_type_in_extends_clause;
+import 'nullable_type_in_implements_clause_test.dart'
+    as nullable_type_in_implements_clause;
+import 'nullable_type_in_on_clause_test.dart' as nullable_type_in_on_clause;
+import 'nullable_type_in_with_clause_test.dart' as nullable_type_in_with_clause;
 import 'override_equals_but_not_hashcode_test.dart'
     as override_equals_but_not_hashcode;
 import 'override_on_non_overriding_field_test.dart'
@@ -202,6 +210,11 @@
     null_aware_before_operator.main();
     null_aware_in_condition.main();
     null_aware_in_logical_operator.main();
+    nullable_type_in_catch_clause.main();
+    nullable_type_in_extends_clause.main();
+    nullable_type_in_implements_clause.main();
+    nullable_type_in_on_clause.main();
+    nullable_type_in_with_clause.main();
     override_equals_but_not_hashcode.main();
     override_on_non_overriding_field.main();
     override_on_non_overriding_getter.main();
diff --git a/pkg/analyzer/test/src/diagnostics/top_level_instance_getter_test.dart b/pkg/analyzer/test/src/diagnostics/top_level_instance_getter_test.dart
index dae29d6..8427700 100644
--- a/pkg/analyzer/test/src/diagnostics/top_level_instance_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/top_level_instance_getter_test.dart
@@ -76,7 +76,7 @@
   }
 
   test_implicitlyTyped() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   get g => 0;
 }
@@ -85,7 +85,7 @@
   }
 
   test_implicitlyTyped_call() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   get g => () => 0;
 }
@@ -95,7 +95,7 @@
   }
 
   test_implicitlyTyped_field() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var g = 0;
 }
@@ -104,7 +104,7 @@
   }
 
   test_implicitlyTyped_field_call() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var g = () => 0;
 }
@@ -114,7 +114,7 @@
   }
 
   test_implicitlyTyped_field_prefixedIdentifier() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var g = 0;
 }
@@ -126,7 +126,7 @@
   test_implicitlyTyped_fn() async {
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because f is
     // generic, so the type of a.x might affect the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var x = 0;
 }
@@ -178,7 +178,7 @@
   test_implicitlyTyped_invoke() async {
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because the
     // closure is generic, so the type of a.x might affect the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var x = 0;
 }
@@ -214,7 +214,7 @@
   test_implicitlyTyped_method() async {
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because f is
     // generic, so the type of a.x might affect the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var x = 0;
   int f<T>(int x) => 0;
@@ -253,7 +253,7 @@
   test_implicitlyTyped_new() async {
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because B is
     // generic, so the type of a.x might affect the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var x = 0;
 }
@@ -316,7 +316,7 @@
   test_implicitlyTyped_new_named() async {
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because B is
     // generic, so the type of a.x might affect the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var x = 0;
 }
@@ -384,7 +384,7 @@
 ''');
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because B is
     // generic, so the type of a.x might affect the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 import 'lib1.dart' as foo;
 class A {
   var x = 0;
@@ -395,7 +395,7 @@
   }
 
   test_implicitlyTyped_prefixedIdentifier() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   get g => 0;
 }
@@ -407,7 +407,7 @@
   test_implicitlyTyped_propertyAccessLhs() async {
     // The reference to a.x triggers TOP_LEVEL_INSTANCE_GETTER because the type
     // of a.x affects the lookup of y, which in turn affects the type of b.
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   var x = new B();
   int operator[](int value) => 0;
diff --git a/pkg/analyzer/test/src/diagnostics/top_level_instance_method_test.dart b/pkg/analyzer/test/src/diagnostics/top_level_instance_method_test.dart
index 4e6dde5..221a7f0 100644
--- a/pkg/analyzer/test/src/diagnostics/top_level_instance_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/top_level_instance_method_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class TopLevelInstanceMethodTest extends DriverResolutionTest {
   test_noParameter() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   f() => 0;
 }
@@ -34,7 +34,7 @@
   }
 
   test_parameter_generic() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   int f<T>(v) => 0;
 }
@@ -61,7 +61,7 @@
   }
 
   test_tearOff() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   f() => 0;
 }
@@ -70,7 +70,7 @@
   }
 
   test_tearOff_parameter() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 class A {
   int f(v) => 0;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/type_check_is_not_null_test.dart b/pkg/analyzer/test/src/diagnostics/type_check_is_not_null_test.dart
index a5d66af..9a473f0 100644
--- a/pkg/analyzer/test/src/diagnostics/type_check_is_not_null_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_check_is_not_null_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class TypeCheckIsNotNullTest extends DriverResolutionTest {
   test_not_Null() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 bool m(i) {
   return i is! Null;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/type_check_is_null_test.dart b/pkg/analyzer/test/src/diagnostics/type_check_is_null_test.dart
index 4f50661..42d8555 100644
--- a/pkg/analyzer/test/src/diagnostics/type_check_is_null_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_check_is_null_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class TypeCheckIsNullTest extends DriverResolutionTest {
   test_is_Null() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 bool m(i) {
   return i is Null;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
index 621b6b3..ce2c1f0 100644
--- a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
@@ -31,7 +31,7 @@
   }
 
   test_and_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   bool? x;
   if(x && true) {}
@@ -76,7 +76,7 @@
   }
 
   test_cascade_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x..isEven;
@@ -103,7 +103,7 @@
   }
 
   test_forLoop_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   List? x;
   for (var y in x) {}
@@ -121,7 +121,7 @@
   }
 
   test_if_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   bool? x;
   if (x) {}
@@ -139,7 +139,7 @@
   }
 
   test_index_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   List? x;
   x[0];
@@ -160,7 +160,7 @@
   test_invoke_dynamicFunctionType_nullable() async {
     // test is failing because nullable function invocations aren't being
     // resolved correctly
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   Function? x;
   x();
@@ -181,7 +181,7 @@
   test_invoke_nullable() async {
     // test is failing because nullable function invocations aren't being
     // resolved correctly
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   Function()? x;
   x();
@@ -226,7 +226,7 @@
   }
 
   test_member_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x.isEven;
@@ -244,7 +244,7 @@
   }
 
   test_member_parenthesized_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   (x).isEven;
@@ -298,7 +298,7 @@
   }
 
   test_method_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x.round();
@@ -334,7 +334,7 @@
   }
 
   test_minusEq_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x -= 1;
@@ -352,7 +352,7 @@
   }
 
   test_not_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   bool? x;
   if(!x) {}
@@ -379,7 +379,7 @@
   }
 
   test_operatorMinus_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x - 3;
@@ -397,7 +397,7 @@
   }
 
   test_operatorPlus_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x + 3;
@@ -415,7 +415,7 @@
   }
 
   test_operatorPostfixDec_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x--;
@@ -433,7 +433,7 @@
   }
 
   test_operatorPostfixInc_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x++;
@@ -451,7 +451,7 @@
   }
 
   test_operatorPrefixDec_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   --x;
@@ -469,7 +469,7 @@
   }
 
   test_operatorPrefixInc_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   ++x;
@@ -487,7 +487,7 @@
   }
 
   test_operatorUnaryMinus_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   -x;
@@ -505,7 +505,7 @@
   }
 
   test_or_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   bool? x;
   if(x || false) {}
@@ -523,7 +523,7 @@
   }
 
   test_plusEq_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   int? x;
   x += 1;
@@ -532,7 +532,7 @@
   }
 
   test_ternary_condition_nullable() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m() {
   bool? x;
   x ? 0 : 1;
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index 75f0359..e2ace47b 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -19,7 +19,7 @@
 @reflectiveTest
 class UndefinedGetterTest extends DriverResolutionTest {
   test_ifStatement_notPromoted() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f(int x) {
   if (x is String) {
     x.length;
@@ -39,7 +39,7 @@
   }
 
   test_promotedTypeParameter_regress35305() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 void f<X extends num, Y extends X>(Y y) {
   if (y is int) {
     y.isEven;
@@ -57,7 +57,7 @@
     ..enabledExperiments = [EnableString.control_flow_collections];
 
   test_ifElement_inList_notPromoted() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f(int x) {
   return [if (x is String) x.length];
 }
@@ -73,7 +73,7 @@
   }
 
   test_ifElement_inMap_notPromoted() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f(int x) {
   return {if (x is String) x : x.length};
 }
@@ -89,7 +89,7 @@
   }
 
   test_ifElement_inSet_notPromoted() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f(int x) {
   return {if (x is String) x.length};
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_hidden_name_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_hidden_name_test.dart
index 3391749..888721c 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_hidden_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_hidden_name_test.dart
@@ -17,14 +17,14 @@
 class UndefinedHiddenNameTest extends DriverResolutionTest {
   test_export() async {
     newFile('/test/lib/lib1.dart');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 export 'lib1.dart' hide a;
 ''', [HintCode.UNDEFINED_HIDDEN_NAME]);
   }
 
   test_import() async {
     newFile('/test/lib/lib1.dart');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' hide a;
 ''', [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_HIDDEN_NAME]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index 2df536e..7b44210 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -29,7 +29,7 @@
   }
 
   test_forStatement_outsideBody() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f() {
   for (int x in []) {}
   x;
@@ -54,7 +54,7 @@
   }
 
   test_forElement_inList_outsideElement() async {
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 f() {
   return [for (int x in []) null, x];
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
index b05ef9b..a10a3ee 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class UndefinedOperatorTest extends DriverResolutionTest {
   test_binaryExpression() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f(var a) {
   if (a is A) {
@@ -27,7 +27,7 @@
   }
 
   test_binaryExpression_inSubtype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {
   operator +(B b) {}
@@ -41,7 +41,7 @@
   }
 
   test_indexBoth() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f(var a) {
   if (a is A) {
@@ -55,7 +55,7 @@
   }
 
   test_indexBoth_inSubtype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {
   operator [](int index) {}
@@ -72,7 +72,7 @@
   }
 
   test_indexGetter() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f(var a) {
   if (a is A) {
@@ -83,7 +83,7 @@
   }
 
   test_indexGetter_inSubtype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {
   operator [](int index) {}
@@ -97,7 +97,7 @@
   }
 
   test_indexSetter() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f(var a) {
   if (a is A) {
@@ -108,7 +108,7 @@
   }
 
   test_indexSetter_inSubtype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {
   operator []=(i, v) {}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
index b6ba333..6de8429 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
@@ -17,7 +17,7 @@
 class UndefinedPrefixedNameTest extends DriverResolutionTest {
   test_getterContext() async {
     newFile('/test/lib/lib.dart');
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 import 'lib.dart' as p;
 f() => p.c;
 ''', [StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME]);
@@ -25,7 +25,7 @@
 
   test_setterContext() async {
     newFile('/test/lib/lib.dart');
-    await assertErrorsInCode('''
+    await assertErrorCodesInCode('''
 import 'lib.dart' as p;
 f() {
   p.c = 0;
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index fd9bafd..7306c0e 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class UndefinedSetterTest extends DriverResolutionTest {
   test_inSubtype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 class B extends A {
   set b(x) {}
@@ -30,7 +30,7 @@
   }
 
   test_inType() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {}
 f(var a) {
   if(a is A) {
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_shown_name_test.dart
index 9bbc57a..3243bb2 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_shown_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_shown_name_test.dart
@@ -17,14 +17,14 @@
 class UndefinedShownNameTest extends DriverResolutionTest {
   test_export() async {
     newFile('/test/lib/lib1.dart');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 export 'lib1.dart' show a;
 ''', [HintCode.UNDEFINED_SHOWN_NAME]);
   }
 
   test_import() async {
     newFile('/test/lib/lib1.dart');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' show a;
 ''', [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_SHOWN_NAME]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
index 5459327..0d89796 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
@@ -59,7 +59,7 @@
 
   test_generics() async {
     // dartbug.com/18953
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 import 'dart:async';
 Future<int> f() => new Future.value(0);
 void g(bool c) {
@@ -92,7 +92,7 @@
   }
 
   test_type_supertype() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(int i) {
   var b = i as Object;
 }
@@ -100,7 +100,7 @@
   }
 
   test_type_type() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(num i) {
   var b = i as num;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_no_such_method_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_no_such_method_test.dart
index e6f36ad..0801ae0 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_no_such_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_no_such_method_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class UnnecessaryNoSuchMethodTest extends DriverResolutionTest {
   test_blockBody() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   noSuchMethod(x) => super.noSuchMethod(x);
 }
@@ -59,7 +59,7 @@
   }
 
   test_expressionBody() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   noSuchMethod(x) => super.noSuchMethod(x);
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_false_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_false_test.dart
index 6b48d25..e3316ad 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_false_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_false_test.dart
@@ -16,13 +16,13 @@
 @reflectiveTest
 class UnnecessaryTypeCheckFalseTest extends DriverResolutionTest {
   test_null_not_Null() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 bool b = null is! Null;
 ''', [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
   }
 
   test_type_not_dynamic() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(i) {
   bool b = i is! dynamic;
 }
@@ -30,7 +30,7 @@
   }
 
   test_type_not_object() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(i) {
   bool b = i is! Object;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_true_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_true_test.dart
index 44e96ea..269d39a 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_true_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_type_check_true_test.dart
@@ -16,13 +16,13 @@
 @reflectiveTest
 class UnnecessaryTypeCheckTrueTest extends DriverResolutionTest {
   test_null_is_Null() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 bool b = null is Null;
 ''', [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
   }
 
   test_type_is_dynamic() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(i) {
   bool b = i is dynamic;
 }
@@ -30,7 +30,7 @@
   }
 
   test_type_is_object() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 m(i) {
   bool b = i is Object;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_catch_clause_test.dart b/pkg/analyzer/test/src/diagnostics/unused_catch_clause_test.dart
index 841f0df..de74c41 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_catch_clause_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_catch_clause_test.dart
@@ -19,7 +19,7 @@
   bool get enableUnusedLocalVariable => true;
 
   test_on_unusedException() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   try {
   } on String catch (exception) {
diff --git a/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart b/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart
index 71bba94..84303fa 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_catch_stack_test.dart
@@ -19,7 +19,7 @@
   bool get enableUnusedLocalVariable => true;
 
   test_on_unusedStack() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   try {
   } on String catch (exception, stackTrace) {
@@ -40,7 +40,7 @@
   }
 
   test_unusedStack() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   try {
   } catch (exception, stackTrace) {
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index 871023a..8f16748 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -85,7 +85,7 @@
   }
 
   test_class_notUsed_inClassMember() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class _A {
   static staticMethod() {
     new _A();
@@ -98,7 +98,7 @@
   }
 
   test_class_notUsed_inConstructorName() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class _A {
   _A() {}
   _A.named() {}
@@ -107,7 +107,7 @@
   }
 
   test_class_notUsed_isExpression() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class _A {}
 main(p) {
   if (p is _A) {
@@ -117,7 +117,7 @@
   }
 
   test_class_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class _A {}
 main() {
 }
@@ -125,7 +125,7 @@
   }
 
   test_class_notUsed_variableDeclaration() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class _A {}
 main() {
   _A v;
@@ -145,7 +145,7 @@
   }
 
   test_enum_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 enum _MyEnum {A, B, C}
 main() {
 }
@@ -181,7 +181,7 @@
   }
 
   test_functionLocal_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   f() {}
 }
@@ -189,7 +189,7 @@
   }
 
   test_functionLocal_notUsed_referenceFromItself() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   _f(int p) {
     _f(p - 1);
@@ -218,7 +218,7 @@
   }
 
   test_functionTop_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 _f() {}
 main() {
 }
@@ -226,7 +226,7 @@
   }
 
   test_functionTop_notUsed_referenceFromItself() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 _f(int p) {
   _f(p - 1);
 }
@@ -274,7 +274,7 @@
   }
 
   test_functionTypeAlias_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 typedef _F(a, b);
 main() {
 }
@@ -315,7 +315,7 @@
   }
 
   test_getter_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   get _g => null;
 }
@@ -323,7 +323,7 @@
   }
 
   test_getter_notUsed_referenceFromItself() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   get _g {
     return _g;
@@ -477,7 +477,7 @@
   }
 
   test_method_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   static _m() {}
 }
@@ -485,7 +485,7 @@
   }
 
   test_method_notUsed_referenceFromItself() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   static _m(int p) {
     _m(p - 1);
@@ -528,7 +528,7 @@
   }
 
   test_setter_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   set _s(x) {}
 }
@@ -536,7 +536,7 @@
   }
 
   test_setter_notUsed_referenceFromItself() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   set _s(int x) {
     if (x > 5) {
@@ -567,7 +567,7 @@
   }
 
   test_topLevelVariable_notUsed() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 int _a = 1;
 main() {
   _a = 2;
diff --git a/pkg/analyzer/test/src/diagnostics/unused_field_test.dart b/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
index 91c7082..a0dacdb 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
@@ -105,7 +105,7 @@
   }
 
   test_unusedField_notUsed_compoundAssign() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f;
   main() {
@@ -116,7 +116,7 @@
   }
 
   test_unusedField_notUsed_constructorFieldInitializers() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f;
   A() : _f = 0;
@@ -125,7 +125,7 @@
   }
 
   test_unusedField_notUsed_fieldFormalParameter() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f;
   A(this._f);
@@ -134,7 +134,7 @@
   }
 
   test_unusedField_notUsed_noReference() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f;
 }
@@ -154,7 +154,7 @@
   }
 
   test_unusedField_notUsed_postfixExpr() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f = 0;
   main() {
@@ -165,7 +165,7 @@
   }
 
   test_unusedField_notUsed_prefixExpr() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f = 0;
   main() {
@@ -176,7 +176,7 @@
   }
 
   test_unusedField_notUsed_simpleAssignment() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   int _f;
   m() {
diff --git a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
index f94815c..84ac848 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
@@ -31,7 +31,7 @@
     newFile('/test/lib/lib1.dart', content: r'''
 class A {}
 ''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart';
 import 'lib1.dart' as one;
 one.A a;
@@ -63,7 +63,7 @@
     newFile('/test/lib/lib2.dart', content: r'''
 class B {}
 ''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' as one;
 import 'lib2.dart' as one;
 one.A a;
@@ -131,7 +131,7 @@
     newFile('/test/lib/lib1.dart', content: r'''
 class A {}
 ''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart';
 import 'lib1.dart' hide A;
 A a;
@@ -200,7 +200,7 @@
 class A {}
 class B {}
 ''');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart' show A;
 import 'lib1.dart' show B;
 A a;
@@ -209,7 +209,7 @@
 
   test_unusedImport() async {
     newFile('/test/lib/lib1.dart');
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 import 'lib1.dart';
 ''', [HintCode.UNUSED_IMPORT]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/unused_label_test.dart b/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
index 7d3a4f4..3322685 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
@@ -16,7 +16,7 @@
 @reflectiveTest
 class UnusedLabelTest extends DriverResolutionTest {
   test_unused_inSwitch() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(x) {
   switch (x) {
     label: case 0:
@@ -29,7 +29,7 @@
   }
 
   test_unused_onWhile() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 f(condition()) {
   label: while (condition()) {
     break;
diff --git a/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart b/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart
index ef082c4..d4281bc 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_local_variable_test.dart
@@ -31,7 +31,7 @@
   }
 
   test_inFunction() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   var v = 1;
   v = 2;
@@ -40,7 +40,7 @@
   }
 
   test_inMethod() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 class A {
   foo() {
     var v = 1;
@@ -72,7 +72,7 @@
   }
 
   test_isRead_notUsed_compoundAssign() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   var v = 1;
   v += 2;
@@ -81,7 +81,7 @@
   }
 
   test_isRead_notUsed_postfixExpr() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   var v = 1;
   v++;
@@ -90,7 +90,7 @@
   }
 
   test_isRead_notUsed_prefixExpr() async {
-    await assertErrorsInCode(r'''
+    await assertErrorCodesInCode(r'''
 main() {
   var v = 1;
   ++v;
diff --git a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
index c798569..fd823b1 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
@@ -20,7 +20,7 @@
 class A {}
 class B {}
 ''');
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 import 'lib1.dart' show A, B;
 A a;
 ''', [HintCode.UNUSED_SHOWN_NAME]);
@@ -31,7 +31,7 @@
 class A {}
 class B {}
 ''');
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 import 'lib1.dart' as p show A, B;
 p.A a;
 ''', [HintCode.UNUSED_SHOWN_NAME]);
@@ -44,7 +44,7 @@
 class C {}
 class D {}
 ''');
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 import 'lib1.dart' show A, B;
 import 'lib1.dart' show C, D;
 A a;
@@ -59,7 +59,7 @@
 const int var3 = 3;
 const int var4 = 4;
 ''');
-    assertErrorsInCode(r'''
+    assertErrorCodesInCode(r'''
 import 'lib1.dart' show var1, var2;
 import 'lib1.dart' show var3, var4;
 int a = var1;
diff --git a/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart
index 00ffa49..e366f23 100644
--- a/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/variable_type_mismatch_test.dart
@@ -27,6 +27,7 @@
 const double y = x;
     ''');
     await resolveTestFile();
-    assertTestErrors([CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH]);
+    assertTestErrorsWithCodes(
+        [CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH]);
   }
 }
diff --git a/pkg/analyzer/test/src/manifest/manifest_validator_test.dart b/pkg/analyzer/test/src/manifest/manifest_validator_test.dart
index 8cd846cc6..1388f40 100644
--- a/pkg/analyzer/test/src/manifest/manifest_validator_test.dart
+++ b/pkg/analyzer/test/src/manifest/manifest_validator_test.dart
@@ -65,10 +65,42 @@
 ''', [ManifestWarningCode.CAMERA_PERMISSIONS_INCOMPATIBLE]);
   }
 
+  test_screenOrientation_error() {
+    assertErrors('''
+<manifest
+     xmlns:android="http://schemas.android.com/apk/res/android">
+  <application android:label="@string/app_name">
+    <activity android:name="testActivity"
+      android:screenOrientation="landscape"
+      android:exported="false">
+    </activity>
+  </application>
+</manifest>
+''', [ManifestWarningCode.SETTING_ORIENTATION_ON_ACTIVITY]);
+  }
+
+  test_resizeableactivity_error() {
+    assertErrors('''
+<manifest
+     xmlns:android="http://schemas.android.com/apk/res/android">
+   <application android:label="@string/app_name">
+  <activity android:name="testActivity"
+    android:resizeableActivity="false"
+    android:exported="false">
+  </activity>
+  </application>
+</manifest>
+''', [ManifestWarningCode.NON_RESIZABLE_ACTIVITY]);
+  }
+
   test_no_errors() {
     assertErrors('''
 <manifest
      xmlns:android="http://schemas.android.com/apk/res/android">
+  <activity android:name="testActivity"
+    android:resizeableActivity="true"
+    android:exported="false">
+  </activity>
 </manifest>
 ''', []);
   }
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 206a034..dbf23a4 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -1097,6 +1097,7 @@
       parameters: '()',
       parameterTypes: [],
       requiredParameterCount: 0,
+      returnType: 'C',
     );
     _assertDeclaration(
       _getDeclaration(classDeclaration.children, 'a'),
@@ -1106,6 +1107,7 @@
       parameters: '()',
       parameterTypes: [],
       requiredParameterCount: 0,
+      returnType: 'C',
     );
     _assertDeclaration(
       _getDeclaration(classDeclaration.children, 'b'),
@@ -1116,6 +1118,7 @@
       parameterNames: [],
       parameterTypes: [],
       requiredParameterCount: 0,
+      returnType: 'C',
     );
     _assertDeclaration(
       _getDeclaration(classDeclaration.children, 'c'),
@@ -1127,6 +1130,7 @@
       parameterNames: [],
       parameterTypes: [],
       requiredParameterCount: 0,
+      returnType: 'C',
     );
     _assertDeclaration(
       _getDeclaration(classDeclaration.children, 'd'),
@@ -1138,6 +1142,7 @@
       parameterNames: ['p1', 'p2', 'p3'],
       parameterTypes: ['Map<String, int>', 'int', 'double'],
       requiredParameterCount: 2,
+      returnType: 'C',
     );
     _assertDeclaration(
       _getDeclaration(classDeclaration.children, 'e'),
@@ -1149,6 +1154,7 @@
       parameterNames: ['f1', 'f2'],
       parameterTypes: ['', ''],
       requiredParameterCount: 2,
+      returnType: 'C',
     );
   }
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 16c94d1..7ec7d23 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -8,12 +8,12 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/type_system.dart';
+import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'resynthesize_common.dart';
@@ -28,141 +28,54 @@
 @reflectiveTest
 class ResynthesizeAst2Test extends ResynthesizeTestStrategyTwoPhase
     with ResynthesizeTestCases {
+  /// The shared SDK bundle, computed once and shared among test invocations.
+  static LinkedNodeBundle _sdkBundle;
+
   @override
   bool get isAstBasedSummary => true;
 
+  LinkedNodeBundle get sdkBundle {
+    if (_sdkBundle != null) return _sdkBundle;
+
+    var inputLibraries = <LinkInputLibrary>[];
+    for (var sdkLibrary in sdk.sdkLibraries) {
+      var source = sourceFactory.resolveUri(null, sdkLibrary.shortName);
+      var text = getFile(source.fullName).readAsStringSync();
+      var unit = parseText(text);
+
+      var inputUnits = <LinkInputUnit>[];
+      _addLibraryUnits(source, unit, inputUnits);
+      inputLibraries.add(
+        LinkInputLibrary(source, inputUnits),
+      );
+    }
+
+    var sdkLinkResult = link(
+      AnalysisOptionsImpl(),
+      sourceFactory,
+      declaredVariables,
+      [],
+      inputLibraries,
+    );
+
+    var bytes = sdkLinkResult.bundle.toBuffer();
+    return _sdkBundle = LinkedNodeBundle.fromBuffer(bytes);
+  }
+
   @override
   Future<LibraryElementImpl> checkLibrary(String text,
       {bool allowErrors = false, bool dumpSummaries = false}) async {
-    var dartCoreSource = sourceFactory.forUri('dart:core');
-    var dartAsyncSource = sourceFactory.forUri('dart:async');
-    var dartMathSource = sourceFactory.forUri('dart:math');
-
-    var dartCoreCode = getFile(dartCoreSource.fullName).readAsStringSync();
-    dartCoreCode = r'''
-library dart.core;
-
-abstract class Comparable<T> {
-  int compareTo(T other);
-}
-
-class Iterable<T> {}
-
-class Iterator<T> {}
-
-class List<T> {}
-
-class Map<K, V> {}
-
-abstract class Null {}
-
-class Object {
-  const Object();
-}
-
-abstract class String {
-  int get length;
-  String operator +(String other);
-}
-
-class Set<T> {}
-
-abstract class Symbol {}
-
-abstract class Type {}
-
-abstract class bool {}
-
-abstract class double extends num {}
-
-abstract class int extends num {
-  bool get isEven => false;
-  bool get isNegative;
-  
-  int operator &(int other);
-  int operator -();
-  int operator <<(int shiftAmount);
-  int operator >>(int shiftAmount);
-  int operator ^(int other);
-  int operator |(int other);
-  int operator ~();
-}
-
-abstract class num implements Comparable<num> {
-  bool operator <(num other);
-  bool operator <=(num other);
-  bool operator ==(Object other);
-  bool operator >(num other);
-  bool operator >=(num other);
-  
-  double operator /(num other);
-  double toDouble();
-  
-  int operator <<(int other);
-  int operator >>(int other);
-  int operator ^(int other);
-  int operator |(int other);
-  int operator ~();
-  int operator ~/(num other);
-  
-  int round();
-  int toInt();
-  num abs();
-  
-  num operator %(num other);
-  num operator *(num other);
-  num operator +(num other);
-  num operator -();
-  num operator -(num other);
-}
-''';
-
-    var dartAsyncCode = r'''
-library dart.async;
-
-class Future<T> {}
-
-class FutureOr<T> {}
-
-class Stream<T> {}
-''';
-
-    var dartMathCode = r'''
-library dart.math;
-
-const double E = 2.718281828459045;
-const double PI = 3.1415926535897932;
-const double LN10 =  2.302585092994046;
-
-T min<T extends num>(T a, T b) => null;
-T max<T extends num>(T a, T b) => null;
-''';
-
-    var dartCoreResult = _link({
-      dartCoreSource: dartCoreCode,
-      dartAsyncSource: dartAsyncCode,
-      dartMathSource: dartMathCode,
-    });
-
     var source = addTestSource(text);
-    var unit = parseText(text, experimentStatus: experimentStatus);
 
-    var libraryUnitMap = {
-      source: _unitsOfLibrary(source, unit),
-    };
-
-    for (var otherLibrarySource in otherLibrarySources) {
-      var text = getFile(otherLibrarySource.fullName).readAsStringSync();
-      var unit = parseText(text, experimentStatus: experimentStatus);
-      var unitMap = _unitsOfLibrary(otherLibrarySource, unit);
-      libraryUnitMap[otherLibrarySource] = unitMap;
-    }
+    var inputLibraries = <LinkInputLibrary>[];
+    _addNonDartLibraries(Set(), inputLibraries, source);
 
     var linkResult = link(
       AnalysisOptionsImpl(),
       sourceFactory,
-      [dartCoreResult.bundle],
-      libraryUnitMap,
+      declaredVariables,
+      [sdkBundle],
+      inputLibraries,
     );
 
     var analysisContext = _FakeAnalysisContext(sourceFactory);
@@ -177,7 +90,7 @@
       rootReference,
     );
     elementFactory.addBundle(
-      LinkedBundleContext(elementFactory, dartCoreResult.bundle),
+      LinkedBundleContext(elementFactory, sdkBundle),
     );
     elementFactory.addBundle(
       LinkedBundleContext(elementFactory, linkResult.bundle),
@@ -191,937 +104,40 @@
     analysisContext.typeProvider = typeProvider;
     analysisContext.typeSystem = Dart2TypeSystem(typeProvider);
 
+    dartCore.createLoadLibraryFunction(typeProvider);
+    dartAsync.createLoadLibraryFunction(typeProvider);
+
     return elementFactory.libraryOfUri('${source.uri}');
   }
 
   @override
   @failingTest
-  test_class_alias_notSimplyBounded_self() async {
-    await super.test_class_alias_notSimplyBounded_self();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_circularity_via_typedef() async {
-    await super.test_class_notSimplyBounded_circularity_via_typedef();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_complex_by_cycle() async {
-    await super.test_class_notSimplyBounded_complex_by_cycle();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_complex_by_reference_to_cycle() async {
-    await super.test_class_notSimplyBounded_complex_by_reference_to_cycle();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_complex_by_use_of_parameter() async {
-    await super.test_class_notSimplyBounded_complex_by_use_of_parameter();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_dependency_with_type_params() async {
-    await super.test_class_notSimplyBounded_dependency_with_type_params();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_function_typed_bound_complex_via_parameter_type() async {
-    await super
-        .test_class_notSimplyBounded_function_typed_bound_complex_via_parameter_type();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_function_typed_bound_complex_via_return_type() async {
-    await super
-        .test_class_notSimplyBounded_function_typed_bound_complex_via_return_type();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_refers_to_circular_typedef() async {
-    await super.test_class_notSimplyBounded_refers_to_circular_typedef();
-  }
-
-  @override
-  @failingTest
-  test_class_notSimplyBounded_self() async {
-    await super.test_class_notSimplyBounded_self();
-  }
-
-  @override
-  @failingTest
-  test_class_type_parameters_bound() async {
-    await super.test_class_type_parameters_bound();
-  }
-
-  @override
-  @failingTest
-  test_class_type_parameters_f_bound_complex() async {
-    await super.test_class_type_parameters_f_bound_complex();
-  }
-
-  @override
-  @failingTest
-  test_class_type_parameters_f_bound_simple() async {
-    await super.test_class_type_parameters_f_bound_simple();
-  }
-
-  @override
-  @failingTest
-  test_closure_generic() async {
-    await super.test_closure_generic();
-  }
-
-  @override
-  @failingTest
-  test_closure_in_variable_declaration_in_part() async {
-    await super.test_closure_in_variable_declaration_in_part();
-  }
-
-  @override
-  @failingTest
   test_const_constructor_inferred_args() async {
     await super.test_const_constructor_inferred_args();
   }
 
   @override
   @failingTest
-  test_const_finalField_hasConstConstructor() async {
-    // TODO(scheglov) Needs initializer, because of const constructor.
-    await super.test_const_finalField_hasConstConstructor();
-  }
-
-  @override
-  @failingTest
-  test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
-    await super
-        .test_const_parameterDefaultValue_initializingFormal_functionTyped();
-  }
-
-  @override
-  @failingTest
-  test_const_reference_topLevelFunction_generic() async {
-    await super.test_const_reference_topLevelFunction_generic();
-  }
-
-  @override
-  @failingTest
-  test_const_reference_topLevelVariable_imported() async {
-    await super.test_const_reference_topLevelVariable_imported();
-  }
-
-  @override
-  @failingTest
-  test_const_reference_topLevelVariable_imported_withPrefix() async {
-    await super.test_const_reference_topLevelVariable_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  test_const_topLevel_typedList_typedefArgument() async {
-    await super.test_const_topLevel_typedList_typedefArgument();
-  }
-
-  @override
-  @failingTest
-  test_constExpr_pushReference_field_simpleIdentifier() async {
-    await super.test_constExpr_pushReference_field_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_assertInvocation() async {
-    await super.test_constructor_initializers_assertInvocation();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_assertInvocation_message() async {
-    await super.test_constructor_initializers_assertInvocation_message();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_field() async {
-    await super.test_constructor_initializers_field();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_field_notConst() async {
-    await super.test_constructor_initializers_field_notConst();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_field_withParameter() async {
-    await super.test_constructor_initializers_field_withParameter();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_superInvocation_named() async {
-    await super.test_constructor_initializers_superInvocation_named();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_superInvocation_named_underscore() async {
-    await super
-        .test_constructor_initializers_superInvocation_named_underscore();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_superInvocation_namedExpression() async {
-    await super.test_constructor_initializers_superInvocation_namedExpression();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_superInvocation_unnamed() async {
-    await super.test_constructor_initializers_superInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_thisInvocation_named() async {
-    await super.test_constructor_initializers_thisInvocation_named();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_thisInvocation_namedExpression() async {
-    await super.test_constructor_initializers_thisInvocation_namedExpression();
-  }
-
-  @override
-  @failingTest
-  test_constructor_initializers_thisInvocation_unnamed() async {
-    await super.test_constructor_initializers_thisInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_named() async {
-    await super.test_constructor_redirected_factory_named();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_named_generic() async {
-    await super.test_constructor_redirected_factory_named_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_named_imported() async {
-    await super.test_constructor_redirected_factory_named_imported();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_named_imported_generic() async {
-    await super.test_constructor_redirected_factory_named_imported_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_named_prefixed() async {
-    await super.test_constructor_redirected_factory_named_prefixed();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_named_prefixed_generic() async {
-    await super.test_constructor_redirected_factory_named_prefixed_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_unnamed() async {
-    await super.test_constructor_redirected_factory_unnamed();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_unnamed_generic() async {
-    await super.test_constructor_redirected_factory_unnamed_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_unnamed_imported() async {
-    await super.test_constructor_redirected_factory_unnamed_imported();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_unnamed_imported_generic() async {
-    await super.test_constructor_redirected_factory_unnamed_imported_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_unnamed_prefixed() async {
-    await super.test_constructor_redirected_factory_unnamed_prefixed();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_factory_unnamed_prefixed_generic() async {
-    await super.test_constructor_redirected_factory_unnamed_prefixed_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_thisInvocation_named() async {
-    await super.test_constructor_redirected_thisInvocation_named();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_thisInvocation_named_generic() async {
-    await super.test_constructor_redirected_thisInvocation_named_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_thisInvocation_unnamed() async {
-    await super.test_constructor_redirected_thisInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  test_constructor_redirected_thisInvocation_unnamed_generic() async {
-    await super.test_constructor_redirected_thisInvocation_unnamed_generic();
-  }
-
-  @override
-  @failingTest
-  test_constructor_withCycles_const() async {
-    await super.test_constructor_withCycles_const();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_genericFunction() async {
-    await super.test_defaultValue_genericFunction();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass() async {
-    await super.test_defaultValue_refersToGenericClass();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass_constructor() async {
-    await super.test_defaultValue_refersToGenericClass_constructor();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass_constructor2() async {
-    await super.test_defaultValue_refersToGenericClass_constructor2();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass_functionG() async {
-    await super.test_defaultValue_refersToGenericClass_functionG();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass_methodG() async {
-    await super.test_defaultValue_refersToGenericClass_methodG();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass_methodG_classG() async {
-    await super.test_defaultValue_refersToGenericClass_methodG_classG();
-  }
-
-  @override
-  @failingTest
-  test_defaultValue_refersToGenericClass_methodNG() async {
-    await super.test_defaultValue_refersToGenericClass_methodNG();
-  }
-
-  @override
-  @failingTest
-  test_export_class_type_alias() async {
-    await super.test_export_class_type_alias();
-  }
-
-  @override
-  @failingTest
-  test_export_configurations_useFirst() async {
-    await super.test_export_configurations_useFirst();
-  }
-
-  @override
-  @failingTest
-  test_export_configurations_useSecond() async {
-    await super.test_export_configurations_useSecond();
-  }
-
-  @override
-  @failingTest
-  test_exportImport_configurations_useFirst() async {
-    await super.test_exportImport_configurations_useFirst();
-  }
-
-  @override
-  @failingTest
-  test_field_formal_param_inferred_type_implicit() async {
-    await super.test_field_formal_param_inferred_type_implicit();
-  }
-
-  @override
-  @failingTest
-  test_field_inferred_type_nonStatic_implicit_uninitialized() async {
-    await super.test_field_inferred_type_nonStatic_implicit_uninitialized();
-  }
-
-  @override
-  @failingTest
-  test_field_propagatedType_final_dep_inLib() async {
-    await super.test_field_propagatedType_final_dep_inLib();
-  }
-
-  @override
-  @failingTest
-  test_field_propagatedType_final_dep_inPart() async {
-    await super.test_field_propagatedType_final_dep_inPart();
-  }
-
-  @override
-  @failingTest
-  test_futureOr_inferred() async {
-    await super.test_futureOr_inferred();
-  }
-
-  @override
-  @failingTest
-  test_getter_inferred_type_nonStatic_implicit_return() async {
-    await super.test_getter_inferred_type_nonStatic_implicit_return();
-  }
-
-  @override
-  @failingTest
-  test_implicitConstructor_named_const() async {
-    await super.test_implicitConstructor_named_const();
-  }
-
-  @override
-  @failingTest
-  test_import_configurations_useFirst() async {
-    await super.test_import_configurations_useFirst();
-  }
-
-  @override
-  @failingTest
-  test_import_invalidUri_metadata() async {
-    await super.test_import_invalidUri_metadata();
-  }
-
-  @override
-  @failingTest
-  test_import_short_absolute() async {
-    // TODO(scheglov) fails on Windows
-    fail('test_import_short_absolute on Windows');
-//    await super.test_import_short_absolute();
-  }
-
-  @override
-  @failingTest
-  test_infer_generic_typedef_complex() async {
-    await super.test_infer_generic_typedef_complex();
-  }
-
-  @override
-  @failingTest
-  test_infer_generic_typedef_simple() async {
-    await super.test_infer_generic_typedef_simple();
-  }
-
-  @override
-  @failingTest
-  test_inference_issue_32394() async {
-    await super.test_inference_issue_32394();
-  }
-
-  @override
-  @failingTest
-  test_inference_map() async {
-    await super.test_inference_map();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_is_typedef() async {
-    await super.test_inferred_type_is_typedef();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_bound_type_param() async {
-    await super.test_inferred_type_refers_to_bound_type_param();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_function_typed_param_of_typedef() async {
-    await super.test_inferred_type_refers_to_function_typed_param_of_typedef();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_function_typed_parameter_type_generic_class() async {
-    await super
-        .test_inferred_type_refers_to_function_typed_parameter_type_generic_class();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_function_typed_parameter_type_other_lib() async {
-    await super
-        .test_inferred_type_refers_to_function_typed_parameter_type_other_lib();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_method_function_typed_parameter_type() async {
-    await super
-        .test_inferred_type_refers_to_method_function_typed_parameter_type();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_nested_function_typed_param() async {
-    await super.test_inferred_type_refers_to_nested_function_typed_param();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_nested_function_typed_param_named() async {
-    await super
-        .test_inferred_type_refers_to_nested_function_typed_param_named();
-  }
-
-  @override
-  @failingTest
-  test_inferred_type_refers_to_setter_function_typed_parameter_type() async {
-    await super
-        .test_inferred_type_refers_to_setter_function_typed_parameter_type();
-  }
-
-  @override
-  @failingTest
-  test_inferredType_definedInSdkLibraryPart() async {
-    await super.test_inferredType_definedInSdkLibraryPart();
-  }
-
-  @override
-  @failingTest
-  test_inferredType_implicitCreation() async {
-    await super.test_inferredType_implicitCreation();
-  }
-
-  @override
-  @failingTest
-  test_initializer_executable_with_return_type_from_closure() async {
-    await super.test_initializer_executable_with_return_type_from_closure();
-  }
-
-  @override
-  @failingTest
-  test_initializer_executable_with_return_type_from_closure_await_dynamic() async {
-    await super
-        .test_initializer_executable_with_return_type_from_closure_await_dynamic();
-  }
-
-  @override
-  @failingTest
-  test_initializer_executable_with_return_type_from_closure_await_future3_int() async {
-    await super
-        .test_initializer_executable_with_return_type_from_closure_await_future3_int();
-  }
-
-  @override
-  @failingTest
-  test_initializer_executable_with_return_type_from_closure_await_future_int() async {
-    await super
-        .test_initializer_executable_with_return_type_from_closure_await_future_int();
-  }
-
-  @override
-  @failingTest
-  test_initializer_executable_with_return_type_from_closure_await_future_noArg() async {
-    await super
-        .test_initializer_executable_with_return_type_from_closure_await_future_noArg();
-  }
-
-  @override
-  @failingTest
-  test_initializer_executable_with_return_type_from_closure_field() async {
-    await super
-        .test_initializer_executable_with_return_type_from_closure_field();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_boundRefersToEarlierTypeArgument() async {
-    await super.test_instantiateToBounds_boundRefersToEarlierTypeArgument();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_boundRefersToItself() async {
-    await super.test_instantiateToBounds_boundRefersToItself();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_boundRefersToLaterTypeArgument() async {
-    await super.test_instantiateToBounds_boundRefersToLaterTypeArgument();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_functionTypeAlias_reexported() async {
-    await super.test_instantiateToBounds_functionTypeAlias_reexported();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_functionTypeAlias_simple() async {
-    await super.test_instantiateToBounds_functionTypeAlias_simple();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_simple() async {
-    await super.test_instantiateToBounds_simple();
-  }
-
-  @override
-  @failingTest
-  test_invalid_nameConflict_imported_exported() async {
-    await super.test_invalid_nameConflict_imported_exported();
-  }
-
-  @override
-  @failingTest
-  test_invalid_nameConflict_local() async {
-    await super.test_invalid_nameConflict_local();
-  }
-
-  @override
-  @failingTest
-  test_invalidUri_part_emptyUri() async {
-    await super.test_invalidUri_part_emptyUri();
-  }
-
-  @override
-  @failingTest
-  test_invalidUris() async {
-    await super.test_invalidUris();
-  }
-
-  @override
-  @failingTest
-  test_library_documented_lines() async {
-    await super.test_library_documented_lines();
-  }
-
-  @override
-  @failingTest
-  test_library_documented_stars() async {
-    await super.test_library_documented_stars();
-  }
-
-  @override
-  @failingTest
-  test_method_inferred_type_nonStatic_implicit_param() async {
-    await super.test_method_inferred_type_nonStatic_implicit_param();
-  }
-
-  @override
-  @failingTest
-  test_method_inferred_type_nonStatic_implicit_return() async {
-    await super.test_method_inferred_type_nonStatic_implicit_return();
-  }
-
-  @override
-  @failingTest
-  test_nameConflict_importWithRelativeUri_exportWithAbsolute() async {
-    // TODO(scheglov) unexpectedly passes on Windows
-    fail('unexpectedly passes on Windows');
-//    await super.test_nameConflict_importWithRelativeUri_exportWithAbsolute();
-  }
-
-  @override
-  @failingTest
-  test_new_typedef_notSimplyBounded_self() async {
-    await super.test_new_typedef_notSimplyBounded_self();
-  }
-
-  @override
-  @failingTest
-  test_old_typedef_notSimplyBounded_self() async {
-    await super.test_old_typedef_notSimplyBounded_self();
-  }
-
-  @override
-  @failingTest
-  test_parameter_covariant() async {
-    await super.test_parameter_covariant();
-  }
-
-  @override
-  @failingTest
   test_parameter_covariant_inherited() async {
     await super.test_parameter_covariant_inherited();
   }
 
   @override
   @failingTest
-  test_parts_invalidUri_nullStringValue() async {
-    await super.test_parts_invalidUri_nullStringValue();
-  }
-
-  @override
-  @failingTest
-  test_setter_covariant() async {
-    await super.test_setter_covariant();
-  }
-
-  @override
-  @failingTest
-  test_setter_inferred_type_nonStatic_implicit_param() async {
-    await super.test_setter_inferred_type_nonStatic_implicit_param();
-  }
-
-  @override
-  @failingTest
   test_syntheticFunctionType_genericClosure() async {
+    // TODO(scheglov) Bug in TypeSystem.getLeastUpperBound().
+    // LUB(<T>(T) → int, <T>(T) → int) gives `(T) → int`, note absence of `<T>`.
     await super.test_syntheticFunctionType_genericClosure();
   }
 
-  @override
-  @failingTest
-  test_syntheticFunctionType_inGenericClass() async {
-    await super.test_syntheticFunctionType_inGenericClass();
-  }
-
-  @override
-  @failingTest
-  test_syntheticFunctionType_noArguments() async {
-    await super.test_syntheticFunctionType_noArguments();
-  }
-
-  @override
-  @failingTest
-  test_syntheticFunctionType_withArguments() async {
-    await super.test_syntheticFunctionType_withArguments();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_based_on_loadLibrary() async {
-    await super.test_type_inference_based_on_loadLibrary();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_closure_with_function_typed_parameter() async {
-    await super.test_type_inference_closure_with_function_typed_parameter();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_closure_with_function_typed_parameter_new() async {
-    await super.test_type_inference_closure_with_function_typed_parameter_new();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_depends_on_exported_variable() async {
-    await super.test_type_inference_depends_on_exported_variable();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_nested_function() async {
-    await super.test_type_inference_nested_function();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_nested_function_with_parameter_types() async {
-    await super.test_type_inference_nested_function_with_parameter_types();
-  }
-
-  @override
-  @failingTest
-  test_type_inference_of_closure_with_default_value() async {
-    await super.test_type_inference_of_closure_with_default_value();
-  }
-
-  @override
-  @failingTest
-  test_typedef_generic() async {
-    await super.test_typedef_generic();
-  }
-
-  @override
-  @failingTest
-  test_typedef_generic_asFieldType() async {
-    await super.test_typedef_generic_asFieldType();
-  }
-
-  @override
-  @failingTest
-  test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_included() async {
-    await super
-        .test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_included();
-  }
-
-  @override
-  @failingTest
-  test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_omitted() async {
-    await super
-        .test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_omitted();
-  }
-
-  @override
-  @failingTest
-  test_typedef_notSimplyBounded_dependency_via_param_type_old_style() async {
-    await super
-        .test_typedef_notSimplyBounded_dependency_via_param_type_old_style();
-  }
-
-  @override
-  @failingTest
-  test_typedef_notSimplyBounded_dependency_via_return_type_new_style() async {
-    await super
-        .test_typedef_notSimplyBounded_dependency_via_return_type_new_style();
-  }
-
-  @override
-  @failingTest
-  test_typedef_notSimplyBounded_dependency_via_return_type_old_style() async {
-    await super
-        .test_typedef_notSimplyBounded_dependency_via_return_type_old_style();
-  }
-
-  @override
-  @failingTest
-  test_typedef_type_parameters_bound() async {
-    await super.test_typedef_type_parameters_bound();
-  }
-
-  @override
-  @failingTest
-  test_typedef_type_parameters_bound_recursive() async {
-    await super.test_typedef_type_parameters_bound_recursive();
-  }
-
-  @override
-  @failingTest
-  test_typedef_type_parameters_bound_recursive2() async {
-    await super.test_typedef_type_parameters_bound_recursive2();
-  }
-
-  @override
-  @failingTest
-  test_typedef_type_parameters_f_bound_complex() async {
-    await super.test_typedef_type_parameters_f_bound_complex();
-  }
-
-  @override
-  @failingTest
-  test_typedef_type_parameters_f_bound_simple() async {
-    await super.test_typedef_type_parameters_f_bound_simple();
-  }
-
-  @override
-  @failingTest
-  test_typedef_type_parameters_f_bound_simple_new_syntax() async {
-    await super.test_typedef_type_parameters_f_bound_simple_new_syntax();
-  }
-
-  @override
-  @failingTest
-  test_unresolved_annotation_instanceCreation_argument_super() async {
-    await super.test_unresolved_annotation_instanceCreation_argument_super();
-  }
-
-  @override
-  @failingTest
-  test_unresolved_export() async {
-    await super.test_unresolved_export();
-  }
-
-  @override
-  @failingTest
-  test_unresolved_import() async {
-    await super.test_unresolved_import();
-  }
-
-  @override
-  @failingTest
-  test_unused_type_parameter() async {
-    await super.test_unused_type_parameter();
-  }
-
-  @override
-  @failingTest
-  test_variable_propagatedType_final_dep_inLib() async {
-    await super.test_variable_propagatedType_final_dep_inLib();
-  }
-
-  @override
-  @failingTest
-  test_variable_propagatedType_final_dep_inPart() async {
-    await super.test_variable_propagatedType_final_dep_inPart();
-  }
-
-  LinkResult _link(Map<Source, String> codeMap) {
-    // TODO(scheglov) support for parts
-    var libraryUnitMap = <Source, Map<Source, CompilationUnit>>{};
-    for (var source in codeMap.keys) {
-      var code = codeMap[source];
-      var unit = parseText(code, experimentStatus: experimentStatus);
-      libraryUnitMap[source] = {source: unit};
-    }
-
-    return link(
-      AnalysisOptionsImpl(),
-      sourceFactory,
-      [],
-      libraryUnitMap,
+  void _addLibraryUnits(
+    Source definingSource,
+    CompilationUnit definingUnit,
+    List<LinkInputUnit> units,
+  ) {
+    units.add(
+      LinkInputUnit(definingSource, definingUnit),
     );
-  }
-
-  Map<Source, CompilationUnit> _unitsOfLibrary(
-      Source definingSource, CompilationUnit definingUnit) {
-    var result = <Source, CompilationUnit>{
-      definingSource: definingUnit,
-    };
     for (var directive in definingUnit.directives) {
       if (directive is PartDirective) {
         var relativeUriStr = directive.uri.stringValue;
@@ -1131,19 +147,65 @@
           relativeUriStr,
         );
 
-        String text;
-        try {
-          var partFile = resourceProvider.getFile(partSource.fullName);
-          text = partFile.readAsStringSync();
-        } catch (_) {
-          text = '';
+        if (partSource != null) {
+          var text = _readSafely(partSource.fullName);
+          var unit = parseText(text, experimentStatus: experimentStatus);
+          units.add(
+            LinkInputUnit(partSource, unit),
+          );
+        } else {
+          var unit = parseText('', experimentStatus: experimentStatus);
+          units.add(
+            LinkInputUnit(partSource, unit),
+          );
         }
-
-        var partUnit = parseText(text, experimentStatus: experimentStatus);
-        result[partSource] = partUnit;
       }
     }
-    return result;
+  }
+
+  void _addNonDartLibraries(
+    Set<Source> addedLibraries,
+    List<LinkInputLibrary> libraries,
+    Source source,
+  ) {
+    if (source == null ||
+        source.uri.isScheme('dart') ||
+        !addedLibraries.add(source)) {
+      return;
+    }
+
+    var text = _readSafely(source.fullName);
+    var unit = parseText(text, experimentStatus: experimentStatus);
+
+    var units = <LinkInputUnit>[];
+    _addLibraryUnits(source, unit, units);
+    libraries.add(
+      LinkInputLibrary(source, units),
+    );
+
+    void addRelativeUriStr(StringLiteral uriNode) {
+      var uriStr = uriNode.stringValue;
+      var uriSource = sourceFactory.resolveUri(source, uriStr);
+      _addNonDartLibraries(addedLibraries, libraries, uriSource);
+    }
+
+    for (var directive in unit.directives) {
+      if (directive is NamespaceDirective) {
+        addRelativeUriStr(directive.uri);
+        for (var configuration in directive.configurations) {
+          addRelativeUriStr(configuration.uri);
+        }
+      }
+    }
+  }
+
+  String _readSafely(String path) {
+    try {
+      var file = resourceProvider.getFile(path);
+      return file.readAsStringSync();
+    } catch (_) {
+      return '';
+    }
   }
 }
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index 40b6c41..70ecb30 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -46,6 +46,12 @@
 
   @override
   @failingTest
+  test_infer_generic_typedef_complex() async {
+    await super.test_infer_generic_typedef_complex();
+  }
+
+  @override
+  @failingTest
   test_syntheticFunctionType_inGenericClass() async {
     await super.test_syntheticFunctionType_inGenericClass();
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 77b78c1..b049e24 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../util/element_type_matchers.dart';
 import 'element_text.dart';
@@ -1359,12 +1358,21 @@
 typedef F(G value);
 typedef G(F value);
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F = dynamic Function(((dynamic) → dynamic) → dynamic value);
+notSimplyBounded typedef G = dynamic Function(((dynamic) → dynamic) → dynamic value);
+notSimplyBounded class C<T extends ((dynamic) → dynamic) → dynamic> {
+}
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F = dynamic Function(((...) → dynamic) → dynamic value);
 notSimplyBounded typedef G = dynamic Function(((...) → dynamic) → dynamic value);
 notSimplyBounded class C<T extends ((...) → dynamic) → dynamic> {
 }
 ''');
+    }
   }
 
   test_class_notSimplyBounded_self() async {
@@ -3868,11 +3876,21 @@
 typedef int F(String id);
 const v = const <F>[];
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+typedef F = int Function(String id);
+const List<(String) → int> v = const <
+        F/*location: test.dart;F*/>[];
+''');
+    } else {
+      // This is wrong.
+      // `F` must be the reference to `typedef F` element, not the type.
+      checkElementText(library, r'''
 typedef F = int Function(String id);
 const List<(String) → int> v = const <
         null/*location: test.dart;F;-*/>[];
 ''');
+    }
   }
 
   test_const_topLevel_typedMap() async {
@@ -3988,7 +4006,16 @@
   static const b = null;
 }
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+class C {
+  static const dynamic a =
+        b/*location: test.dart;C;b?*/;
+  static const dynamic b = null;
+}
+''');
+    } else {
+      checkElementText(library, r'''
 class C {
   static const dynamic a =
         C/*location: test.dart;C*/.
@@ -3996,6 +4023,7 @@
   static const dynamic b = null;
 }
 ''');
+    }
   }
 
   test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
@@ -4589,6 +4617,38 @@
   test_constructor_redirected_thisInvocation_named() async {
     var library = await checkLibrary('''
 class C {
+  const C.named();
+  const C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+class C {
+  const C.named();
+  const C() = C.named : this.
+        named/*location: test.dart;C;named*/();
+}
+''');
+  }
+
+  test_constructor_redirected_thisInvocation_named_generic() async {
+    var library = await checkLibrary('''
+class C<T> {
+  const C.named();
+  const C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+class C<T> {
+  const C.named();
+  const C() = C<T>.named : this.
+        named/*location: test.dart;C;named*/();
+}
+''');
+  }
+
+  test_constructor_redirected_thisInvocation_named_notConst() async {
+    var library = await checkLibrary('''
+class C {
   C.named();
   C() : this.named();
 }
@@ -4597,8 +4657,7 @@
       checkElementText(library, r'''
 class C {
   C.named();
-  C() = C.named : this.
-        named/*location: test.dart;C;named*/();
+  C();
 }
 ''');
     } else {
@@ -4611,32 +4670,37 @@
     }
   }
 
-  test_constructor_redirected_thisInvocation_named_generic() async {
+  test_constructor_redirected_thisInvocation_unnamed() async {
     var library = await checkLibrary('''
-class C<T> {
-  C.named();
-  C() : this.named();
+class C {
+  const C();
+  const C.named() : this();
 }
 ''');
-    if (isAstBasedSummary) {
-      checkElementText(library, r'''
-class C<T> {
-  C.named();
-  C() = C<T>.named : this.
-        named/*location: test.dart;C;named*/();
+    checkElementText(library, r'''
+class C {
+  const C();
+  const C.named() = C : this();
 }
 ''');
-    } else {
-      checkElementText(library, r'''
-class C<T> {
-  C.named();
-  C() = C<T>.named;
-}
-''');
-    }
   }
 
-  test_constructor_redirected_thisInvocation_unnamed() async {
+  test_constructor_redirected_thisInvocation_unnamed_generic() async {
+    var library = await checkLibrary('''
+class C<T> {
+  const C();
+  const C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+class C<T> {
+  const C();
+  const C.named() = C<T> : this();
+}
+''');
+  }
+
+  test_constructor_redirected_thisInvocation_unnamed_notConst() async {
     var library = await checkLibrary('''
 class C {
   C();
@@ -4647,7 +4711,7 @@
       checkElementText(library, r'''
 class C {
   C();
-  C.named() = C : this();
+  C.named();
 }
 ''');
     } else {
@@ -4660,30 +4724,6 @@
     }
   }
 
-  test_constructor_redirected_thisInvocation_unnamed_generic() async {
-    var library = await checkLibrary('''
-class C<T> {
-  C();
-  C.named() : this();
-}
-''');
-    if (isAstBasedSummary) {
-      checkElementText(library, r'''
-class C<T> {
-  C();
-  C.named() = C<T> : this();
-}
-''');
-    } else {
-      checkElementText(library, r'''
-class C<T> {
-  C();
-  C.named() = C<T>;
-}
-''');
-    }
-  }
-
   test_constructor_withCycles_const() async {
     var library = await checkLibrary('''
 class C {
@@ -6002,9 +6042,7 @@
 ''');
   }
 
-  @failingTest
   test_implicitConstructor_named_const() async {
-    // TODO(paulberry, scheglov): get this to pass
     var library = await checkLibrary('''
 class C {
   final Object x;
@@ -6012,7 +6050,27 @@
 }
 const x = C.named(42);
 ''');
-    checkElementText(library, 'TODO(paulberry, scheglov)');
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+class C {
+  final Object x;
+  const C.named(Object this.x);
+}
+const C x =
+        C/*location: test.dart;C*/.
+        named/*location: test.dart;C;named*/(42);
+''');
+    } else {
+      checkElementText(library, r'''
+class C {
+  final Object x;
+  const C.named(Object this.x);
+}
+const C x = const
+        C/*location: test.dart;C*/.
+        named/*location: test.dart;C;named*/(42);
+''');
+    }
   }
 
   test_implicitTopLevelVariable_getterFirst() async {
@@ -6221,9 +6279,7 @@
 ''');
   }
 
-  @failingTest
-  void test_infer_generic_typedef_complex() async {
-    // TODO(paulberry, scheglov): get this test to pass.
+  test_infer_generic_typedef_complex() async {
     var library = await checkLibrary('''
 typedef F<T> = D<T,U> Function<U>();
 class C<V> {
@@ -6233,10 +6289,21 @@
 D<int,U> f<U>() => null;
 const x = const C(f);
 ''');
-    checkElementText(library, '''TODO(paulberry, scheglov)''');
+    checkElementText(library, '''
+typedef F<T> = D<T, U> Function<U>();
+class C<V> {
+  const C(<U>() → D<V, U> f);
+}
+class D<T, U> {
+}
+const C<int> x = const
+        C/*location: test.dart;C*/(
+        f/*location: test.dart;f*/);
+D<int, U> f<U>() {}
+''');
   }
 
-  void test_infer_generic_typedef_simple() async {
+  test_infer_generic_typedef_simple() async {
     var library = await checkLibrary('''
 typedef F = D<T> Function<T>();
 class C {
@@ -6316,7 +6383,7 @@
   }
 
   test_inference_issue_32394() async {
-    // Test the type inference involed in dartbug.com/32394
+    // Test the type inference involved in dartbug.com/32394
     var library = await checkLibrary('''
 var x = y.map((a) => a.toString());
 var y = [3];
@@ -6452,6 +6519,30 @@
 ''');
   }
 
+  test_inferred_type_initializer_cycle() async {
+    var library = await checkLibrary(r'''
+var a = b + 1;
+var b = c + 2;
+var c = a + 3;
+var d = 4;
+''');
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+dynamic a;
+dynamic b;
+dynamic c;
+int d;
+''');
+    } else {
+      checkElementText(library, r'''
+dynamic a/*error: dependencyCycle*/;
+dynamic b/*error: dependencyCycle*/;
+dynamic c/*error: dependencyCycle*/;
+int d;
+''');
+    }
+  }
+
   test_inferred_type_is_typedef() async {
     var library = await checkLibrary('typedef int F(String s);'
         ' class C extends D { var v; }'
@@ -6650,19 +6741,11 @@
 var a1 = foo.A();
 var a2 = foo.A.named();
 ''');
-    if (isAstBasedSummary) {
-      checkElementText(library, r'''
-import 'foo.dart' as foo;
-dynamic a1;
-dynamic a2;
-''');
-    } else {
-      checkElementText(library, r'''
+    checkElementText(library, r'''
 import 'foo.dart' as foo;
 A a1;
 A a2;
 ''');
-    }
   }
 
   test_inferredType_usesSyntheticFunctionType_functionTypedParam() async {
@@ -9232,11 +9315,19 @@
 typedef F = void Function(C c);
 class C<T extends C<T>> {}
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F = void Function(C<dynamic> c);
+notSimplyBounded class C<T extends C<T>> {
+}
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F = void Function(C<C<dynamic>> c);
 notSimplyBounded class C<T extends C<T>> {
 }
 ''');
+    }
   }
 
   test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_omitted() async {
@@ -9246,11 +9337,19 @@
 typedef F = void Function(C);
 class C<T extends C<T>> {}
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F = void Function(C<dynamic> );
+notSimplyBounded class C<T extends C<T>> {
+}
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F = void Function(C<C<dynamic>> );
 notSimplyBounded class C<T extends C<T>> {
 }
 ''');
+    }
   }
 
   test_typedef_notSimplyBounded_dependency_via_param_type_old_style() async {
@@ -9260,11 +9359,19 @@
 typedef void F(C c);
 class C<T extends C<T>> {}
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F = void Function(C<dynamic> c);
+notSimplyBounded class C<T extends C<T>> {
+}
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F = void Function(C<C<dynamic>> c);
 notSimplyBounded class C<T extends C<T>> {
 }
 ''');
+    }
   }
 
   test_typedef_notSimplyBounded_dependency_via_return_type_new_style() async {
@@ -9274,11 +9381,19 @@
 typedef F = C Function();
 class C<T extends C<T>> {}
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F = C<dynamic> Function();
+notSimplyBounded class C<T extends C<T>> {
+}
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F = C<C<dynamic>> Function();
 notSimplyBounded class C<T extends C<T>> {
 }
 ''');
+    }
   }
 
   test_typedef_notSimplyBounded_dependency_via_return_type_old_style() async {
@@ -9288,11 +9403,19 @@
 typedef C F();
 class C<T extends C<T>> {}
 ''');
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F = C<dynamic> Function();
+notSimplyBounded class C<T extends C<T>> {
+}
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F = C<C<dynamic>> Function();
 notSimplyBounded class C<T extends C<T>> {
 }
 ''');
+    }
   }
 
   test_typedef_parameter_parameters() async {
@@ -9400,9 +9523,15 @@
   test_typedef_type_parameters_bound_recursive2() async {
     var library = await checkLibrary('typedef void F<T extends List<F>>();');
     // Typedefs cannot reference themselves.
-    checkElementText(library, r'''
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F<T extends List<dynamic>> = void Function();
+''');
+    } else {
+      checkElementText(library, r'''
 notSimplyBounded typedef F<T extends List<() → void>> = void Function();
 ''');
+    }
   }
 
   test_typedef_type_parameters_f_bound_complex() async {
@@ -9435,9 +9564,7 @@
 ''');
   }
 
-  @failingTest
   test_unresolved_annotation_instanceCreation_argument_super() async {
-    // TODO(scheglov) fix https://github.com/dart-lang/sdk/issues/28553
     var library = await checkLibrary('''
 class A {
   const A(_);
@@ -9448,11 +9575,11 @@
 ''', allowErrors: true);
     checkElementText(library, r'''
 class A {
-  A(_);
+  const A(dynamic _);
 }
-
+@
+        A/*location: test.dart;A*/(super)
 class C {
-  synthetic C();
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 5aef022..11182d9 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -11,12 +11,14 @@
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/analysis_options/error/option_codes.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/registry.dart';
+import 'package:analyzer/src/manifest/manifest_warning_code.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
@@ -234,6 +236,11 @@
         removeCode(StrongModeCode.TOP_LEVEL_INSTANCE_METHOD);
       } else if (errorType == TodoCode) {
         declaredNames.remove('TODO_REGEX');
+      } else if (errorType == ParserErrorCode) {
+        declaredNames.remove('CONST_AFTER_FACTORY');
+      } else if (errorType == ManifestWarningCode) {
+        declaredNames.remove('NON_RESIZABLE_ACTIVITY');
+        declaredNames.remove('SETTING_ORIENTATION_ON_ACTIVITY');
       }
 
       // Assert that all remaining declared names are in errorCodeValues
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 49432eb..f247d09 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -3649,6 +3649,70 @@
 ''');
   }
 
+  test_strictInference_collectionLiterals() async {
+    addFile(r'''
+main() {
+  var emptyList = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[];
+  var emptyMap = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{};
+
+  var upwardsInfersDynamicList = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[42 as dynamic];
+  var upwardsInfersDynamicSet = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{42 as dynamic};
+
+
+  dynamic d;
+  var upwardsInfersDynamicMap1 = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{d: 2};
+  var upwardsInfersDynamicMap2 = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{4: d};
+  var upwardsInfersDynamicMap3 = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{d: d};
+}
+    ''');
+    await check(strictInference: true);
+  }
+
+  test_strictInference_instanceCreation() async {
+    addFile(r'''
+class C<T> {
+  C([T t]);
+  C.of(T t);
+  factory C.from(Object e) => C();
+}
+
+main() {
+  // These should be allowed:
+  C<int> downwardsInferenceIsOK = C();
+  C<dynamic> downwardsInferenceDynamicIsOK = C();
+  var inferredFromConstructorParameterIsOK = C(42);
+  var explicitDynamicIsOK = C<dynamic>(42);
+
+  var rawConstructorCall = /*info:INFERENCE_FAILURE_ON_INSTANCE_CREATION*/C();
+  var upwardsInfersDynamic = /*info:INFERENCE_FAILURE_ON_INSTANCE_CREATION*/C(42 as dynamic);
+  var namedConstructor = /*info:INFERENCE_FAILURE_ON_INSTANCE_CREATION*/C.of(42 as dynamic);
+  var factoryConstructor = /*info:INFERENCE_FAILURE_ON_INSTANCE_CREATION*/C.from(42);
+}
+    ''');
+    await check(strictInference: true);
+  }
+
+  test_strictInference_instanceCreation_optionalTypeArgs() async {
+    addMetaPackage();
+    addFile(r'''
+import 'package:meta/meta.dart';
+@optionalTypeArgs
+class C<T> {
+  C([T t]);
+  C.of(T t);
+  factory C.from(Object e) => C();
+}
+
+main() {
+  var rawConstructorCall = C();
+  var upwardsInfersDynamic = C(42 as dynamic);
+  var namedConstructor = C.of(42 as dynamic);
+  var factoryConstructor = C.from(42);
+}
+    ''');
+    await check(strictInference: true);
+  }
+
   test_strictRawTypes_classes() async {
     addFile(r'''
 class C<T> {
@@ -3679,20 +3743,10 @@
 
 main() {
   {
-    // These should be allowed:
-    C<int> downwardsInferenceIsOK = C();
-    C<dynamic> downwardsInferenceDynamicIsOK = C();
-    var inferredFromConstructorParameterIsOK = C(42);
-    var explicitDynamicIsOK = C<dynamic>(42);
-
     ClassWithNumBound classWithNumBoundOK;
     ClassWithObjectBound classWithObjectBoundOK;
     /*info:STRICT_RAW_TYPE*/ClassWithDynamicBound classWithDynamicBound;
-
-    var rawConstructorCall = /*info:STRICT_RAW_TYPE*/C();
     /*info:STRICT_RAW_TYPE*/C rawConstructorCallFromType = C();
-
-    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/C(42 as dynamic);
   }
 
   {
@@ -3702,11 +3756,8 @@
     var upwardsInferNonDynamicIsOK = [42];
     var explicitDynamicIsOK = <dynamic>[42];
 
-    var rawList = /*info:STRICT_RAW_TYPE*/[];
     var rawListOfLists = </*info:STRICT_RAW_TYPE*/List>[];
     /*info:STRICT_RAW_TYPE*/List rawListFromType = [];
-
-    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/[42 as dynamic];
   }
 
   {
@@ -3716,11 +3767,8 @@
     var upwardsInferNonDynamicIsOK = [42];
     var explicitDynamicIsOK = <dynamic>[42];
 
-    var rawList = /*info:STRICT_RAW_TYPE*/[];
     var rawListOfLists = </*info:STRICT_RAW_TYPE*/List>[];
     /*info:STRICT_RAW_TYPE*/List rawListFromType = [];
-
-    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/[42 as dynamic];
   }
 
   {
@@ -3732,8 +3780,6 @@
 
     var rawSetOfSets = </*info:STRICT_RAW_TYPE*/Set>{};
     /*info:STRICT_RAW_TYPE*/Set rawSetFromType = {};
-
-    var upwardsInfersDynamic = /*info:STRICT_RAW_TYPE*/{42 as dynamic};
   }
 
   {
@@ -3748,11 +3794,6 @@
 
     var rawMapOfMaps = </*info:STRICT_RAW_TYPE*/Map>{};
     /*info:STRICT_RAW_TYPE*/Map rawMapFromType = {};
-
-    dynamic d;
-    var upwardsInfersDynamic1 = /*info:STRICT_RAW_TYPE*/{d: 2};
-    var upwardsInfersDynamic2 = /*info:STRICT_RAW_TYPE*/{4: d};
-    var upwardsInfersDynamic3 = /*info:STRICT_RAW_TYPE*/{d: d};
   }
 
   {
@@ -3815,15 +3856,6 @@
     await check(strictRawTypes: true);
   }
 
-  test_strictRawTypes_emptyMap() async {
-    addFile('''
-main() {
-  var rawMap = /*info:STRICT_RAW_TYPE*/{};
-}
-''');
-    await check(strictRawTypes: true);
-  }
-
   test_strictRawTypes_typedefs() async {
     addFile(r'''
 typedef T F1<T>(T _);
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index 7ea6be3..03726eb 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -281,6 +280,7 @@
   Future<CompilationUnit> check(
       {bool implicitCasts: true,
       bool implicitDynamic: true,
+      bool strictInference: false,
       bool strictRawTypes: false}) async {
     _checkCalled = true;
 
@@ -291,6 +291,7 @@
     analysisOptions.strongModeHints = true;
     analysisOptions.implicitCasts = implicitCasts;
     analysisOptions.implicitDynamic = implicitDynamic;
+    analysisOptions.strictInference = strictInference;
     analysisOptions.strictRawTypes = strictRawTypes;
     analysisOptions.enabledExperiments = enabledExperiments;
 
@@ -331,9 +332,12 @@
           code == TodoCode.TODO) {
         return false;
       }
-      if (strictRawTypes) {
-        // When testing strict-raw-types, ignore anything else.
+      if (strictInference || strictRawTypes) {
+        // When testing strict-inference or strict-raw-types, ignore anything
+        // else.
         return code.errorSeverity.ordinal > ErrorSeverity.INFO.ordinal ||
+            code == HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL ||
+            code == HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION ||
             code == HintCode.STRICT_RAW_TYPE;
       }
       return true;
@@ -344,6 +348,7 @@
     LibraryElement mainLibrary =
         resolutionMap.elementDeclaredByCompilationUnit(mainUnit).library;
     Set<LibraryElement> allLibraries = _reachableLibraries(mainLibrary);
+
     for (LibraryElement library in allLibraries) {
       for (CompilationUnitElement unit in library.units) {
         var source = unit.source;
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index ca4002a..b2e0dfb 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -312,18 +312,21 @@
         }
       }
 
+      ErrorSeverity severity;
+      if (options.buildSummaryOnly) {
+        severity = ErrorSeverity.NONE;
+      } else {
+        // Process errors.
+        await _printErrors(outputPath: options.buildAnalysisOutput);
+        severity = await _computeMaxSeverity();
+      }
+
       if (dependencyTracker != null) {
         io.File file = new io.File(dependencyTracker.outputPath);
         file.writeAsStringSync(dependencyTracker.dependencies.join('\n'));
       }
 
-      if (options.buildSummaryOnly) {
-        return ErrorSeverity.NONE;
-      } else {
-        // Process errors.
-        await _printErrors(outputPath: options.buildAnalysisOutput);
-        return await _computeMaxSeverity();
-      }
+      return severity;
     });
   }
 
@@ -446,7 +449,9 @@
 
     var sourceFactory = new SourceFactory(<UriResolver>[
       new DartUriResolver(sdk),
-      new InSummaryUriResolver(resourceProvider, summaryDataStore),
+      new TrackingInSummaryUriResolver(
+          new InSummaryUriResolver(resourceProvider, summaryDataStore),
+          dependencyTracker),
       new ExplicitSourceResolver(uriToFileMap)
     ]);
 
@@ -739,3 +744,26 @@
     return cache.get(inputs, path);
   }
 }
+
+/**
+ * Wrapper for [InSummaryUriResolver] that tracks accesses to summaries.
+ */
+class TrackingInSummaryUriResolver extends UriResolver {
+  // May be null.
+  final DependencyTracker dependencyTracker;
+  final InSummaryUriResolver inSummaryUriResolver;
+
+  TrackingInSummaryUriResolver(
+      this.inSummaryUriResolver, this.dependencyTracker);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    var source = inSummaryUriResolver.resolveAbsolute(uri, actualUri);
+    if (dependencyTracker != null &&
+        source != null &&
+        source is InSummarySource) {
+      dependencyTracker.record(source.summaryPath);
+    }
+    return source;
+  }
+}
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 7e910dc..bd54543 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/generated/utilities_general.dart'
     show PerformanceTag;
 import 'package:analyzer/src/plugin/resolver_provider.dart';
+import 'package:analyzer/src/manifest/manifest_validator.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/path_filter.dart';
@@ -378,6 +379,25 @@
           } catch (exception) {
             // If the file cannot be analyzed, ignore it.
           }
+        } else if (shortName == AnalysisEngine.ANDROID_MANIFEST_FILE) {
+          try {
+            File file = resourceProvider.getFile(path);
+            String content = file.readAsStringSync();
+            ManifestValidator validator =
+                new ManifestValidator(file.createSource());
+            LineInfo lineInfo = new LineInfo.fromContent(content);
+            List<AnalysisError> errors = validator.validate(
+                content, analysisDriver.analysisOptions.chromeOsManifestChecks);
+            formatter
+                .formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
+            for (AnalysisError error in errors) {
+              ErrorSeverity severity = determineProcessedSeverity(
+                  error, options, analysisDriver.analysisOptions);
+              allResult = allResult.max(severity);
+            }
+          } catch (exception) {
+            // If the file cannot be analyzed, ignore it.
+          }
         } else {
           dartFiles.add(path);
           var file = analysisDriver.fsState.getFileForPath(path);
@@ -544,7 +564,8 @@
         for (io.FileSystemEntity entry
             in directory.listSync(recursive: true, followLinks: false)) {
           String relative = path.relative(entry.path, from: directory.path);
-          if (AnalysisEngine.isDartFileName(entry.path) &&
+          if ((AnalysisEngine.isDartFileName(entry.path) ||
+                  AnalysisEngine.isManifestFileName(entry.path)) &&
               entry is io.File &&
               !pathFilter.ignored(entry.path) &&
               !_isInHiddenDir(relative)) {
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index aa44888..385f323 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -806,6 +806,32 @@
       expect(exitCode, 0);
     });
   }
+
+  test_manifestFileChecks() async {
+    await withTempDirAsync((tempDir) async {
+      String filePath =
+          path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+      new File(filePath).writeAsStringSync('''
+analyzer:
+  optional-checks:
+    chrome-os-manifest-checks: true
+''');
+      String manifestPath =
+          path.join(tempDir, AnalysisEngine.ANDROID_MANIFEST_FILE);
+      new File(manifestPath).writeAsStringSync('''
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <uses-feature android:name="android.software.home_screen" />
+</manifest>
+''');
+      await drive(manifestPath, options: filePath);
+      expect(
+          bulletToDash(outSink),
+          contains(
+              "warning - This hardware feature is not supported on Chrome OS"));
+      expect(exitCode, 0);
+    });
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/build_integration/lib/file_system/multi_root.dart b/pkg/build_integration/lib/file_system/multi_root.dart
index ed1bb8c..b5edb1b 100644
--- a/pkg/build_integration/lib/file_system/multi_root.dart
+++ b/pkg/build_integration/lib/file_system/multi_root.dart
@@ -52,7 +52,11 @@
       _delegate ??= await _resolveEntity();
 
   Future<FileSystemEntity> _resolveEntity() async {
-    if (uri.scheme == multiRootFileSystem.markerScheme && uri.isAbsolute) {
+    if (uri.scheme == multiRootFileSystem.markerScheme) {
+      if (!uri.isAbsolute) {
+        throw new FileSystemException(
+            uri, "This MultiRootFileSystem only handles absolutes URIs: $uri");
+      }
       var original = multiRootFileSystem.original;
       assert(uri.path.startsWith('/'));
       var path = uri.path.substring(1);
@@ -60,6 +64,7 @@
         var candidate = original.entityForUri(root.resolve(path));
         if (await candidate.exists()) return candidate;
       }
+      return MissingFileSystemEntity(uri);
     }
     return multiRootFileSystem.original.entityForUri(uri);
   }
@@ -76,6 +81,24 @@
   Future<String> readAsString() async => (await delegate).readAsString();
 }
 
+class MissingFileSystemEntity implements FileSystemEntity {
+  @override
+  final Uri uri;
+
+  MissingFileSystemEntity(this.uri);
+
+  @override
+  Future<bool> exists() => Future.value(false);
+
+  @override
+  Future<List<int>> readAsBytes() =>
+      Future.error(FileSystemException(uri, 'File not found'));
+
+  @override
+  Future<String> readAsString() =>
+      Future.error(FileSystemException(uri, 'File not found'));
+}
+
 Uri _normalize(root) {
   Uri uri = root;
   return uri.path.endsWith('/') ? uri : uri.replace(path: '${uri.path}/');
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index b746b5c..722a284 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -10,3 +10,6 @@
 
 dependencies:
   front_end: ^0.1.0
+
+dev_dependencies:
+  test: any
diff --git a/pkg/build_integration/test/file_system/multi_root_test.dart b/pkg/build_integration/test/file_system/multi_root_test.dart
index e86fc3f..e92249a 100644
--- a/pkg/build_integration/test/file_system/multi_root_test.dart
+++ b/pkg/build_integration/test/file_system/multi_root_test.dart
@@ -8,6 +8,7 @@
 
 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/api_prototype/file_system.dart';
 
 import 'package:test/test.dart';
 
@@ -122,4 +123,17 @@
     expect(await effectiveUriOf('multi-root:///../../A/B/a/8.dart'),
         'multi-root:///A/B/a/8.dart');
   });
+
+  test('multi-root handles all multi-root scheme uris, even if missing',
+      () async {
+    expect(await effectiveUriOf('multi-root:///doesnt/exist.dart'),
+        'multi-root:///doesnt/exist.dart');
+    expect(await exists('multi-root:///doesnt/exist.dart'), isFalse);
+    expect(
+        read('multi-root:///doesnt/exist.dart'),
+        throwsA(const TypeMatcher<FileSystemException>()
+            .having((e) => e.message, 'message', 'File not found')
+            .having((e) => e.uri, 'uri',
+                equals(Uri.parse('multi-root:///doesnt/exist.dart')))));
+  });
 }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 82b1fe8..576cfc4 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -41,6 +41,8 @@
   static const String experimentCallInstrumentation =
       '--experiment-call-instrumentation';
 
+  static const String experimentNewRti = '--experiment-new-rti';
+
   static const String enableLanguageExperiments = '--enable-experiment';
 
   static const String fastStartup = '--fast-startup';
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 85abe2a..c829eaa 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -431,6 +431,7 @@
     new OptionHandler(Flags.experimentStartupFunctions, passThrough),
     new OptionHandler(Flags.experimentToBoolean, passThrough),
     new OptionHandler(Flags.experimentCallInstrumentation, passThrough),
+    new OptionHandler(Flags.experimentNewRti, passThrough),
 
     // The following three options must come last.
     new OptionHandler('-D.+=.*', addInEnvironment),
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 7cb0278..f91b15b 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -314,6 +314,9 @@
   /// called.
   bool experimentCallInstrumentation = false;
 
+  /// Experimental use of the new (Q2 2019) RTI system.
+  bool experimentNewRti = false;
+
   /// The path to the file that contains the profiled allocations.
   ///
   /// The file must contain the Map that was produced by using
@@ -381,6 +384,7 @@
       ..experimentToBoolean = _hasOption(options, Flags.experimentToBoolean)
       ..experimentCallInstrumentation =
           _hasOption(options, Flags.experimentCallInstrumentation)
+      ..experimentNewRti = _hasOption(options, Flags.experimentNewRti)
       ..generateCodeWithCompileTimeErrors =
           _hasOption(options, Flags.generateCodeWithCompileTimeErrors)
       ..generateSourceMap = !_hasOption(options, Flags.noSourceMaps)
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index d8f8ff5..7070b01 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1525,15 +1525,18 @@
   @override
   void visitConstantExpression(ir.ConstantExpression node) {
     ConstantValue value = _elementMap.getConstantValue(node);
+    SourceInformation sourceInformation =
+        _sourceInformationBuilder.buildGet(node);
     if (!closedWorld.outputUnitData
         .hasOnlyNonDeferredImportPathsToConstant(targetElement, value)) {
       stack.add(graph.addDeferredConstant(
           value,
           closedWorld.outputUnitData.outputUnitForConstant(value),
-          _sourceInformationBuilder.buildGet(node),
+          sourceInformation,
           closedWorld));
     } else {
-      stack.add(graph.addConstant(value, closedWorld));
+      stack.add(graph.addConstant(value, closedWorld,
+          sourceInformation: sourceInformation));
     }
   }
 
@@ -3114,7 +3117,10 @@
             sourceInformation));
       }
     } else {
-      MemberEntity member = _elementMap.getMember(staticTarget);
+      // TODO(johnniwinther): This is a constant tear off, so we should have
+      // created a constant value instead. Remove this case when we use CFE
+      // constants.
+      FunctionEntity member = _elementMap.getMember(staticTarget);
       push(new HStatic(member, _typeInferenceMap.getInferredTypeOf(member),
           sourceInformation));
     }
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index fe5bbfd..c6e5a6d 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -3077,8 +3077,12 @@
   accept(HVisitor visitor) => visitor.visitThrow(this);
 }
 
+// TODO(johnniwinther): Change this to a "HStaticLoad" of a field when we use
+// CFE constants. It has been used for static tear-offs even though these should
+// have been constants.
 class HStatic extends HInstruction {
   final MemberEntity element;
+
   HStatic(this.element, AbstractValue type, SourceInformation sourceInformation)
       : super(<HInstruction>[], type) {
     assert(element != null);
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index fbe7114..1075043 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -56,6 +56,18 @@
             ZoneSpecification(print: (self, parent, zone, message) {
       output.writeln(message.toString());
     }));
+
+    if (lastResult.crashed && context != null) {
+      // TODO(vsm): See https://github.com/dart-lang/sdk/issues/36644.
+      // If the CFE is crashing with previous state, then clear compilation
+      // state and try again.
+      output.clear();
+      lastResult = await runZoned(() => compile(args, previousResult: null),
+          zoneSpecification:
+              ZoneSpecification(print: (self, parent, zone, message) {
+        output.writeln(message.toString());
+      }));
+    }
     return WorkResponse()
       ..exitCode = lastResult.success ? 0 : 1
       ..output = output.toString();
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 7a76be5..8591d9c 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -2449,12 +2449,12 @@
 
       if (param.isOptional) {
         JS.Expression defaultValue;
-        if (paramNode != null) {
+        if (findAnnotation(param, isUndefinedAnnotation) != null) {
+          defaultValue = null;
+        } else if (paramNode != null) {
           var paramDefault = (paramNode as DefaultFormalParameter).defaultValue;
           if (paramDefault == null) {
             defaultValue = JS.LiteralNull();
-          } else if (_isJSUndefined(paramDefault)) {
-            defaultValue = null;
           } else {
             defaultValue = _visitExpression(paramDefault);
           }
@@ -2513,16 +2513,6 @@
         (_classProperties?.covariantParameters?.contains(p) ?? false);
   }
 
-  bool _isJSUndefined(Expression expr) {
-    expr = expr is AsExpression ? expr.expression : expr;
-    if (expr is Identifier) {
-      var element = expr.staticElement;
-      return isSdkInternalRuntime(element.library) &&
-          element.name == 'undefined';
-    }
-    return false;
-  }
-
   JS.Fun _emitNativeFunctionBody(MethodDeclaration node) {
     String name = getAnnotationName(node.declaredElement, isJSAnnotation) ??
         node.name.name;
@@ -4270,10 +4260,6 @@
       List<VariableDeclaration> fields) {
     var lazyFields = <VariableDeclaration>[];
     for (var field in fields) {
-      // Skip our magic undefined constant.
-      var element = field.declaredElement as TopLevelVariableElement;
-      if (element.name == 'undefined') continue;
-
       var init = field.initializer;
       if (init == null ||
           init is Literal ||
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_interop.dart b/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
index 5d51b33..b1a29ae 100644
--- a/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/js_interop.dart
@@ -65,6 +65,9 @@
 bool isNullCheckAnnotation(DartObjectImpl value) =>
     isBuiltinAnnotation(value, '_js_helper', '_NullCheck');
 
+bool isUndefinedAnnotation(DartObjectImpl value) =>
+    isBuiltinAnnotation(value, '_js_helper', '_Undefined');
+
 /// Returns the name value of the `JSExportName` annotation (when compiling
 /// the SDK), or `null` if there's none. This is used to control the name
 /// under which functions are compiled and exported.
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index c72b51a..d9270a2 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -234,33 +234,34 @@
   /// Emits a private name JS Symbol for [name] scoped to the Dart [library].
   ///
   /// If the same name is used in multiple libraries in the same module,
-  /// distinct symbols will be used, so the names cannot be referenced outside
-  /// of their library.
+  /// distinct symbols will be used, so each library will have distinct private
+  /// member names, that won't collide at runtime, as required by the Dart
+  /// language spec.
   @protected
   JS.TemporaryId emitPrivateNameSymbol(Library library, String name) {
-    // TODO(jmesserly): fix this to support referring to private symbols from
-    // libraries that aren't in the current module.
-    //
-    // This is needed for several uses cases:
-    // - const instances of classes (which directly initialize fields via an
-    //   object literal).
-    // - noSuchMethod stubs created when an interface is implemented that had
-    //   private members from another library.
-    // - stateful hot reload, where we need the ability to patch private
-    //   class members.
-    //
-    // See https://github.com/dart-lang/sdk/issues/36252
-    return _privateNames.putIfAbsent(library, () => HashMap()).putIfAbsent(name,
-        () {
-      var idName = name;
-      if (idName.endsWith('=')) {
-        idName = idName.replaceAll('=', '_');
-      }
+    /// Initializes the JS `Symbol` for the private member [name] in [library].
+    ///
+    /// If the library is in the current JS module ([_libraries] contains it),
+    /// the private name will be created and exported. The exported symbol is
+    /// used for a few things:
+    ///
+    /// - private fields of constant objects
+    /// - stateful hot reload (not yet implemented)
+    /// - correct library scope in REPL (not yet implemented)
+    ///
+    /// If the library is imported, then the existing private name will be
+    /// retrieved from it. In both cases, we use the same `dart.privateName`
+    /// runtime call.
+    JS.TemporaryId initPrivateNameSymbol() {
+      var idName = name.endsWith('=') ? name.replaceAll('=', '_') : name;
       var id = JS.TemporaryId(idName);
-      moduleItems.add(
-          js.statement('const # = Symbol(#);', [id, js.string(name, "'")]));
+      moduleItems.add(js.statement('const # = #.privateName(#, #)',
+          [id, runtimeModule, emitLibraryName(library), js.string(name)]));
       return id;
-    });
+    }
+
+    var privateNames = _privateNames.putIfAbsent(library, () => HashMap());
+    return privateNames.putIfAbsent(name, initPrivateNameSymbol);
   }
 
   /// Emits an expression to set the property [nameExpr] on the class [className],
@@ -409,6 +410,23 @@
     }
 
     items.add(JS.ExportDeclaration(JS.ExportClause(exports)));
+
+    if (isBuildingSdk) {
+      // Initialize the private name function.
+      // To bootstrap the SDK, this needs to be emitted before other code.
+      var symbol = JS.TemporaryId('_privateNames');
+      items.add(js.statement('const # = Symbol("_privateNames")', symbol));
+      items.add(js.statement(r'''
+        #.privateName = function(library, name) {
+          let names = library[#];
+          if (names == null) names = library[#] = new Map();
+          let symbol = names.get(name);
+          if (symbol == null) names.set(name, symbol = Symbol(name));
+          return symbol;
+        }
+      ''', [runtimeModule, symbol, symbol]));
+    }
+
     return items;
   }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 596b6e6..e9f2a3a 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -96,7 +96,23 @@
   SharedCompilerOptions.addArguments(argParser);
 
   var declaredVariables = parseAndRemoveDeclaredVariables(args);
-  var argResults = argParser.parse(filterUnknownArguments(args, argParser));
+  ArgResults argResults;
+  try {
+    argResults = argParser.parse(filterUnknownArguments(args, argParser));
+  } on FormatException catch (error) {
+    print(error);
+    print(_usageMessage(argParser));
+    return CompilerResult(64);
+  }
+
+  var output = argResults['out'] as String;
+  if (output == null) {
+    print('Please specify the output file location. For example:\n'
+        '    -o PATH/TO/OUTPUT_FILE.js'
+        '');
+    print(_usageMessage(argParser));
+    return CompilerResult(64);
+  }
 
   if (argResults['help'] as bool || args.isEmpty) {
     print(_usageMessage(argParser));
@@ -230,7 +246,6 @@
 
   List<Uri> inputSummaries = compilerState.options.inputSummaries;
 
-  var output = argResults['out'] as String;
   // TODO(jmesserly): is there a cleaner way to do this?
   //
   // Ideally we'd manage our own batch compilation caching rather than rely on
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 55f5c10..1c88754 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -8,7 +8,7 @@
 import 'package:front_end/src/api_unstable/ddc.dart' show TypeSchemaEnvironment;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart';
+import 'package:kernel/kernel.dart' hide MapEntry;
 import 'package:kernel/library_index.dart';
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/type_environment.dart';
@@ -1808,7 +1808,7 @@
 
   /// Emits a Dart factory constructor to a JS static method.
   JS.Method _emitFactoryConstructor(Procedure node) {
-    if (isUnsupportedFactoryConstructor(node)) return null;
+    if (node.isExternal || isUnsupportedFactoryConstructor(node)) return null;
 
     var function = node.function;
 
@@ -1983,9 +1983,6 @@
       var lazyFields = <Field>[];
       var savedUri = _currentUri;
       for (var field in fields) {
-        // Skip our magic undefined constant.
-        if (field.name.name == 'undefined') continue;
-
         var init = field.initializer;
         if (init == null ||
             init is BasicLiteral ||
@@ -2954,23 +2951,15 @@
   }
 
   JS.Expression _defaultParamValue(VariableDeclaration p) {
-    if (p.initializer != null) {
-      var value = p.initializer;
-      return _isJSUndefined(value) ? null : _visitExpression(value);
+    if (p.annotations.any(isUndefinedAnnotation)) {
+      return null;
+    } else if (p.initializer != null) {
+      return _visitExpression(p.initializer);
     } else {
       return JS.LiteralNull();
     }
   }
 
-  bool _isJSUndefined(Expression expr) {
-    expr = expr is AsExpression ? expr.operand : expr;
-    if (expr is StaticGet) {
-      var t = expr.target;
-      return isSdkInternalRuntime(getLibrary(t)) && t.name.name == 'undefined';
-    }
-    return false;
-  }
-
   void _emitCovarianceBoundsCheck(
       List<TypeParameter> typeFormals, List<JS.Statement> body) {
     for (var t in typeFormals) {
@@ -3786,15 +3775,11 @@
   }
 
   @override
-  visitStaticGet(StaticGet node) {
-    var target = node.target;
+  visitStaticGet(StaticGet node) => _emitStaticGet(node.target);
 
+  JS.Expression _emitStaticGet(Member target) {
     // TODO(vsm): Re-inline constants.  See:
     // https://github.com/dart-lang/sdk/issues/36285
-
-    // TODO(markzipan): reifyTearOff check can be removed when we enable
-    // front-end constant evaluation because static tear-offs will be
-    // treated as constants and handled by visitTearOffConstant.
     var result = _emitStaticTarget(target);
     if (_reifyTearoff(target)) {
       // TODO(jmesserly): we could tag static/top-level function types once
@@ -5092,13 +5077,8 @@
         isBuiltinAnnotation(a, '_js_helper', 'ReifyFunctionTypes');
     while (parent != null) {
       var a = findAnnotation(parent, reifyFunctionTypes);
-      if (a is ConstructorInvocation) {
-        var args = a.arguments.positional;
-        if (args.length == 1) {
-          var arg = args[0];
-          if (arg is BoolLiteral) return arg.value;
-        }
-      }
+      var value = _constants.getFieldValueFromAnnotation(a, 'value');
+      if (value is bool) return value;
       parent = parent.parent;
     }
     return true;
@@ -5128,7 +5108,8 @@
   ///
   /// Calls [findAnnotation] followed by [getNameFromAnnotation].
   String getAnnotationName(NamedNode node, bool test(Expression value)) {
-    return _constants.getNameFromAnnotation(findAnnotation(node, test));
+    return _constants.getFieldValueFromAnnotation(
+        findAnnotation(node, test), 'name');
   }
 
   JS.Expression visitConstant(Constant node) => node.accept(this);
@@ -5139,7 +5120,23 @@
   @override
   visitIntConstant(IntConstant node) => js.number(node.value);
   @override
-  visitDoubleConstant(DoubleConstant node) => js.number(node.value);
+  visitDoubleConstant(DoubleConstant node) {
+    var value = node.value;
+
+    // Emit the constant as an integer, if possible.
+    if (value.isFinite) {
+      var intValue = value.toInt();
+      const int _MIN_INT32 = -0x80000000;
+      const int _MAX_INT32 = 0x7FFFFFFF;
+      if (intValue.toDouble() == value &&
+          intValue >= _MIN_INT32 &&
+          intValue <= _MAX_INT32) {
+        return js.number(intValue);
+      }
+    }
+    return js.number(value);
+  }
+
   @override
   visitStringConstant(StringConstant node) => js.escapedString(node.value, '"');
 
@@ -5174,13 +5171,11 @@
 
   @override
   visitInstanceConstant(node) {
-    entryToProperty(entry) {
-      var field = entry.key.asField.name.name;
+    entryToProperty(MapEntry<Reference, Constant> entry) {
       var constant = entry.value.accept(this);
       var member = entry.key.asField;
-      var result =
-          JS.Property(_emitMemberName(field, member: member), constant);
-      return result;
+      return JS.Property(
+          _emitMemberName(member.name.name, member: member), constant);
     }
 
     var type = visitInterfaceType(node.getType(types) as InterfaceType);
@@ -5192,14 +5187,7 @@
   }
 
   @override
-  visitTearOffConstant(node) {
-    var target = node.procedure;
-    var result = _emitStaticTarget(target);
-    // TODO(jmesserly): we could tag static/top-level function types once
-    // in the module initialization, rather than at the point where they
-    // escape.
-    return _emitFunctionTagged(result, target.function.functionType);
-  }
+  visitTearOffConstant(node) => _emitStaticGet(node.procedure);
 
   @override
   visitTypeLiteralConstant(node) => _emitTypeLiteral(node.type);
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 7f550cb..55885a5 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -41,10 +41,10 @@
     return result is UnevaluatedConstant ? null : result;
   }
 
-  /// If [node] is an annotation with a field named `name`, returns that field's
+  /// If [node] is an annotation with a field named [name], returns that field's
   /// value.
   ///
-  /// This assumes the `name` field is populated from a named argument `name:`
+  /// This assumes the field is populated from a named argument with that name,
   /// or from the first positional argument.
   ///
   /// For example:
@@ -59,36 +59,56 @@
   ///     main() { ... }
   ///
   /// Given the node for `@MyAnnotation('FooBar')` this will return `'FooBar'`.
-  String getNameFromAnnotation(ConstructorInvocation node) {
-    if (node == null) return null;
+  Object getFieldValueFromAnnotation(Expression node, String name) {
+    node = unwrapUnevaluatedConstant(node);
+    if (node is ConstantExpression) {
+      var constant = node.constant;
+      if (constant is InstanceConstant) {
+        var value = constant.fieldValues.entries
+            .firstWhere((e) => e.key.asField.name.name == name,
+                orElse: () => null)
+            ?.value;
+        if (value is PrimitiveConstant) return value.value;
+        if (value is UnevaluatedConstant) {
+          return _evaluateAnnotationArgument(value.expression);
+        }
+        return null;
+      }
+    }
 
     // TODO(jmesserly): this does not use the normal evaluation engine, because
     // it won't work if we don't have the const constructor body available.
     //
     // We may need to address this in the kernel outline files.
-    Expression first;
-    var named = node.arguments.named;
-    if (named.isNotEmpty) {
-      first =
-          named.firstWhere((n) => n.name == 'name', orElse: () => null)?.value;
-    }
-    var positional = node.arguments.positional;
-    if (positional.isNotEmpty) first ??= positional[0];
-    if (first != null) {
-      first = _followConstFields(first);
-      if (first is StringLiteral) return first.value;
+    if (node is ConstructorInvocation) {
+      Expression first;
+      var named = node.arguments.named;
+      if (named.isNotEmpty) {
+        first =
+            named.firstWhere((n) => n.name == name, orElse: () => null)?.value;
+      }
+      var positional = node.arguments.positional;
+      if (positional.isNotEmpty) first ??= positional[0];
+      if (first != null) {
+        return _evaluateAnnotationArgument(first);
+      }
     }
     return null;
   }
 
-  Expression _followConstFields(Expression expr) {
-    if (expr is StaticGet) {
-      var target = expr.target;
+  Object _evaluateAnnotationArgument(Expression node) {
+    node = unwrapUnevaluatedConstant(node);
+    if (node is ConstantExpression) {
+      var constant = node.constant;
+      if (constant is PrimitiveConstant) return constant.value;
+    }
+    if (node is StaticGet) {
+      var target = node.target;
       if (target is Field) {
-        return _followConstFields(target.initializer);
+        return _evaluateAnnotationArgument(target.initializer);
       }
     }
-    return expr;
+    return node is BasicLiteral ? node.value : null;
   }
 }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index 95145f6..6083925 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -17,13 +17,7 @@
 }
 
 bool _annotationIsFromJSLibrary(String expectedName, Expression value) {
-  Class c;
-  if (value is ConstructorInvocation) {
-    c = value.target.enclosingClass;
-  } else if (value is StaticGet) {
-    var type = value.target.getterType;
-    if (type is InterfaceType) c = type.classNode;
-  }
+  var c = getAnnotationClass(value);
   return c != null &&
       c.name == expectedName &&
       _isJSLibrary(c.enclosingLibrary);
@@ -48,22 +42,10 @@
 bool _isJSAnonymousAnnotation(Expression value) =>
     _annotationIsFromJSLibrary('_Anonymous', value);
 
-bool _isBuiltinAnnotation(
-    Expression value, String libraryName, String annotationName) {
-  if (value is ConstructorInvocation) {
-    var c = value.target.enclosingClass;
-    if (c.name == annotationName) {
-      var uri = c.enclosingLibrary.importUri;
-      return uri.scheme == 'dart' && uri.pathSegments[0] == libraryName;
-    }
-  }
-  return false;
-}
-
 /// Whether [value] is a `@JSExportName` (internal annotation used in SDK
 /// instead of `@JS` from `package:js`).
 bool isJSExportNameAnnotation(Expression value) =>
-    _isBuiltinAnnotation(value, '_foreign_helper', 'JSExportName');
+    isBuiltinAnnotation(value, '_foreign_helper', 'JSExportName');
 
 /// Whether [i] is a `spread` invocation (to be used on function arguments
 /// to have them compiled as `...` spread args in ES6 outputs).
@@ -71,19 +53,24 @@
     target.name.name == 'spread' && _isJSLibrary(target.enclosingLibrary);
 
 bool isJSName(Expression value) =>
-    _isBuiltinAnnotation(value, '_js_helper', 'JSName');
+    isBuiltinAnnotation(value, '_js_helper', 'JSName');
 
 bool isJsPeerInterface(Expression value) =>
-    _isBuiltinAnnotation(value, '_js_helper', 'JsPeerInterface');
+    isBuiltinAnnotation(value, '_js_helper', 'JsPeerInterface');
 
 bool isNativeAnnotation(Expression value) =>
-    _isBuiltinAnnotation(value, '_js_helper', 'Native');
+    isBuiltinAnnotation(value, '_js_helper', 'Native');
 
 bool isJSAnonymousType(Class namedClass) {
-  return hasJSInteropAnnotation(namedClass) &&
+  var hasJSInterop = hasJSInteropAnnotation(namedClass);
+  var isAnonymous =
       findAnnotation(namedClass, _isJSAnonymousAnnotation) != null;
+  return hasJSInterop && isAnonymous;
 }
 
+bool isUndefinedAnnotation(Expression value) =>
+    isBuiltinAnnotation(value, '_js_helper', '_Undefined');
+
 /// Returns true iff the class has an `@JS(...)` annotation from `package:js`.
 ///
 /// Note: usually [_usesJSInterop] should be used instead of this.
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 498bf51..bca5ea6 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -79,18 +79,54 @@
   return annotations.firstWhere(test, orElse: () => null);
 }
 
+/// Returns true if [value] represents an annotation for class [className] in
+/// "dart:" library [libraryName].
 bool isBuiltinAnnotation(
-    Expression value, String libraryName, String expectedName) {
-  if (value is ConstructorInvocation) {
-    var c = value.target.enclosingClass;
-    if (c.name == expectedName) {
-      var uri = c.enclosingLibrary.importUri;
-      return uri.scheme == 'dart' && uri.path == libraryName;
-    }
+    Expression value, String libraryName, String className) {
+  var c = getAnnotationClass(value);
+  if (c != null && c.name == className) {
+    var uri = c.enclosingLibrary.importUri;
+    return uri.scheme == 'dart' && uri.path == libraryName;
   }
   return false;
 }
 
+/// Gets the class of the instance referred to by metadata annotation [node].
+///
+/// For example:
+///
+/// - `@JS()` would return the "JS" class in "package:js".
+/// - `@anonymous` would return the "_Anonymous" class in "package:js".
+///
+/// This function works regardless of whether the CFE is evaluating constants,
+/// or whether the constant is a field reference (such as "anonymous" above).
+Class getAnnotationClass(Expression node) {
+  node = unwrapUnevaluatedConstant(node);
+  if (node is ConstantExpression) {
+    var constant = node.constant;
+    if (constant is InstanceConstant) return constant.classNode;
+  } else if (node is ConstructorInvocation) {
+    return node.target.enclosingClass;
+  } else if (node is StaticGet) {
+    var type = node.target.getterType;
+    if (type is InterfaceType) return type.classNode;
+  }
+  return null;
+}
+
+Expression unwrapUnevaluatedConstant(Expression node) {
+  // TODO(jmesserly): see if we can configure CFE to preseve the original
+  // expression, rather than wrapping in an UnevaluatedConstant and then
+  // a ConstantExpression.
+  if (node is ConstantExpression) {
+    var constant = node.constant;
+    if (constant is UnevaluatedConstant) {
+      return constant.expression;
+    }
+  }
+  return node;
+}
+
 /// Returns true if [name] is an operator method that is available on primitive
 /// types (`int`, `double`, `num`, `String`, `bool`).
 ///
@@ -196,12 +232,10 @@
           var expr = statement.expression;
           if (expr is Throw) {
             var error = expr.expression;
-            if (error is ConstructorInvocation &&
-                error.target.enclosingClass.name == 'UnsupportedError') {
-              // HTML adds a lot of private constructors that are unreachable.
-              // Skip these.
-              return true;
-            }
+
+            // HTML adds a lot of private constructors that are unreachable.
+            // Skip these.
+            return isBuiltinAnnotation(error, 'core', 'UnsupportedError');
           }
         }
       }
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index 1daac64..99a2140 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -6,6 +6,7 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'constants.dart';
+import 'kernel_helpers.dart';
 
 /// Contains information about native JS types (those types provided by the
 /// implementation) that are also provided by the Dart SDK.
@@ -125,25 +126,33 @@
   /// referring to the JavaScript built-in `Array` type.
   List<String> getNativePeers(Class c) {
     if (c == coreTypes.objectClass) return ['Object'];
-    var names = constants.getNameFromAnnotation(_getNativeAnnotation(c));
-    if (names == null) return const [];
 
-    // Omit the special name "!nonleaf" and any future hacks starting with "!"
-    return names.split(',').where((peer) => !peer.startsWith("!")).toList();
+    for (var annotation in c.annotations) {
+      var names = _getNativeAnnotationName(annotation);
+      if (names != null) {
+        // Omit the special name "!nonleaf" and any future dart2js hacks
+        // starting with "!"
+        return names.split(',').where((peer) => !peer.startsWith("!")).toList();
+      }
+    }
+    return const [];
+  }
+
+  /// If this [annotation] is `@Native` or `@JsPeerInterface`, returns the "name"
+  /// field (which is also the constructor parameter).
+  String _getNativeAnnotationName(Expression annotation) {
+    if (!_isNativeAnnotation(annotation)) return null;
+    return constants.getFieldValueFromAnnotation(annotation, 'name');
   }
 }
 
-bool _isNative(Class c) => _getNativeAnnotation(c) != null;
+/// Whether class [c] has any `@Native` or `@JsPeerInterface` annotations.
+bool _isNative(Class c) => c.annotations.any(_isNativeAnnotation);
 
-ConstructorInvocation _getNativeAnnotation(Class c) {
-  for (var annotation in c.annotations) {
-    if (annotation is ConstructorInvocation) {
-      var c = annotation.target.enclosingClass;
-      if ((c.name == 'Native' || c.name == 'JsPeerInterface') &&
-          c.enclosingLibrary.importUri.scheme == 'dart') {
-        return annotation;
-      }
-    }
-  }
-  return null;
+/// Whether this [annotation] is `@Native` or `@JsPeerInterface`.
+bool _isNativeAnnotation(Expression annotation) {
+  var c = getAnnotationClass(annotation);
+  return c != null &&
+      (c.name == 'Native' || c.name == 'JsPeerInterface') &&
+      c.enclosingLibrary.importUri.scheme == 'dart';
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index 1ecdfc0..185d3f0 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -242,24 +242,36 @@
   visitInstantiation(Instantiation node) => false;
 
   bool isNotNullAnnotation(Expression value) =>
-      _isInternalAnnotationField(value, 'notNull');
+      _isInternalAnnotationField(value, 'notNull', '_NotNull');
 
   bool isNullCheckAnnotation(Expression value) =>
-      _isInternalAnnotationField(value, 'nullCheck');
+      _isInternalAnnotationField(value, 'nullCheck', '_NullCheck');
 
-  bool _isInternalAnnotationField(Expression value, String name) {
-    if (value is StaticGet) {
-      var t = value.target;
-      if (t is Field && t.name.name == name) {
-        var uri = t.enclosingLibrary.importUri;
-        return uri.scheme == 'dart' && uri.pathSegments[0] == '_js_helper' ||
-            allowPackageMetaAnnotations &&
-                uri.scheme == 'package' &&
-                uri.pathSegments[0] == 'meta';
-      }
+  bool _isInternalAnnotationField(
+      Expression node, String fieldName, String className) {
+    node = unwrapUnevaluatedConstant(node);
+    if (node is ConstantExpression) {
+      var constant = node.constant;
+      return constant is InstanceConstant &&
+          constant.classNode.name == className &&
+          _isInternalSdkAnnotation(constant.classNode.enclosingLibrary);
+    }
+    if (node is StaticGet) {
+      var t = node.target;
+      return t is Field &&
+          t.name.name == fieldName &&
+          _isInternalSdkAnnotation(t.enclosingLibrary);
     }
     return false;
   }
+
+  bool _isInternalSdkAnnotation(Library library) {
+    var uri = library.importUri;
+    return uri.scheme == 'dart' && uri.pathSegments[0] == '_js_helper' ||
+        allowPackageMetaAnnotations &&
+            uri.scheme == 'package' &&
+            uri.pathSegments[0] == 'meta';
+  }
 }
 
 /// A visitor that determines which local variables cannot be null using
diff --git a/pkg/dev_compiler/test/worker/worker_test.dart b/pkg/dev_compiler/test/worker/worker_test.dart
index dd4b5cc..07c9dc9 100644
--- a/pkg/dev_compiler/test/worker/worker_test.dart
+++ b/pkg/dev_compiler/test/worker/worker_test.dart
@@ -10,28 +10,41 @@
 // TODO(jakemac): Remove once this is a part of the testing library.
 import 'package:bazel_worker/src/async_message_grouper.dart';
 import 'package:bazel_worker/testing.dart';
-import 'package:path/path.dart' show join, joinAll;
+import 'package:path/path.dart' show dirname, join, joinAll;
 import 'package:test/test.dart';
 
-File file(String path) => File(joinAll(path.split('/'))).absolute;
+Directory tmp = Directory.systemTemp.createTempSync('ddc_worker_test');
+File file(String path) => File(join(tmp.path, joinAll(path.split('/'))));
 
-main() {
-  var dartdevc = join('bin', 'dartdevc.dart');
-  group('Hello World', () {
-    final argsFile = file('test/worker/hello_world.args');
-    final inputDartFile = file('test/worker/hello_world.dart');
-    final outputJsFile = file('test/worker/out/hello_world.js');
-    final dartSdkSummary = file('gen/sdk/ddc_sdk.sum');
-    final executableArgs = [dartdevc];
-    final compilerArgs = [
-      '--no-source-map',
-      '--no-summarize',
-      '--dart-sdk-summary',
-      dartSdkSummary.path,
-      '-o',
-      outputJsFile.path,
-      inputDartFile.path,
-    ];
+void main() {
+  runTests(false);
+  runTests(true);
+}
+
+void runTests(bool isKernel) {
+  String mode = isKernel ? 'DDK' : 'DDC';
+  List<String> baseArgs = isKernel ? ['-k'] : [];
+  String ext = isKernel ? 'dill' : 'sum';
+  final binDir = dirname(Platform.resolvedExecutable);
+  // Note, the bots use the dart binary in the top-level build directory.
+  // On windows, this is a .bat file.
+  final dartdevc = 'dartdevc${Platform.isWindows ? ".bat" : ""}';
+  final executable = binDir.endsWith('bin')
+      ? join(binDir, dartdevc)
+      : join(binDir, 'dart-sdk', 'bin', dartdevc);
+  final executableArgs = <String>[];
+  group('$mode: Hello World', () {
+    final argsFile = file('hello_world.args');
+    final inputDartFile = file('hello_world.dart');
+    final outputJsFile = file('out/hello_world.js');
+    final compilerArgs = baseArgs +
+        [
+          '--no-source-map',
+          '--no-summarize',
+          '-o',
+          outputJsFile.path,
+          inputDartFile.path,
+        ];
 
     setUp(() {
       inputDartFile.createSync();
@@ -48,7 +61,7 @@
 
     test('can compile in worker mode', () async {
       var args = executableArgs.toList()..add('--persistent_worker');
-      var process = await Process.start(Platform.executable, args);
+      var process = await Process.start(executable, args);
       var messageGrouper = AsyncMessageGrouper(process.stdout);
 
       var request = WorkRequest();
@@ -71,6 +84,17 @@
       expect(response.output, isEmpty);
       expect(outputJsFile.readAsStringSync(), contains('goodbye world'));
 
+      // Try to compile an error.
+      inputDartFile.writeAsStringSync('main() { int x = "hello"; }');
+      process.stdin.add(protoToDelimitedBuffer(request));
+
+      response = await _readResponse(messageGrouper);
+      expect(response.exitCode, 1, reason: response.output);
+      expect(
+          response.output,
+          contains(
+              'A value of type \'String\' can\'t be assigned to a variable of type \'int\'.'));
+
       process.kill();
 
       // TODO(jakemac): This shouldn't be necessary, but it is for the process
@@ -80,7 +104,7 @@
 
     test('can compile in basic mode', () {
       var args = executableArgs.toList()..addAll(compilerArgs);
-      var result = Process.runSync(Platform.executable, args);
+      var result = Process.runSync(executable, args);
 
       expect(result.exitCode, EXIT_CODE_OK);
       expect(result.stdout, isEmpty);
@@ -92,7 +116,7 @@
       var args = List<String>.from(executableArgs)
         ..add('--does-not-exist')
         ..addAll(compilerArgs);
-      var result = Process.runSync(Platform.executable, args);
+      var result = Process.runSync(executable, args);
 
       expect(result.exitCode, 64);
       expect(result.stdout,
@@ -106,7 +130,7 @@
         ..add('--does-not-exist')
         ..add('--ignore-unrecognized-flags')
         ..addAll(compilerArgs);
-      var result = Process.runSync(Platform.executable, args);
+      var result = Process.runSync(executable, args);
 
       expect(result.exitCode, EXIT_CODE_OK);
       expect(result.stdout, isEmpty);
@@ -118,7 +142,7 @@
       argsFile.createSync();
       argsFile.writeAsStringSync(compilerArgs.join('\n'));
       var args = executableArgs.toList()..add('@${argsFile.path}');
-      var process = await Process.start(Platform.executable, args);
+      var process = await Process.start(executable, args);
       stderr.addStream(process.stderr);
       var futureProcessOutput = process.stdout.map(utf8.decode).toList();
 
@@ -128,16 +152,16 @@
     });
   });
 
-  group('Hello World with Summaries', () {
-    final greetingDart = file('test/worker/greeting.dart');
-    final helloDart = file('test/worker/hello.dart');
+  group('$mode: Hello World with Summaries', () {
+    final greetingDart = file('greeting.dart');
+    final helloDart = file('hello.dart');
 
-    final greetingJS = file('test/worker/greeting.js');
-    final greetingSummary = file('test/worker/greeting.api.ds');
-    final helloJS = file('test/worker/hello_world.js');
+    final greetingJS = file('greeting.js');
+    final greetingSummary = file('greeting.$ext');
+    final helloJS = file('hello_world.js');
 
-    final greeting2JS = file('test/worker/greeting2.js');
-    final greeting2Summary = file('test/worker/greeting2.api.ds');
+    final greeting2JS = file('greeting2.js');
+    final greeting2Summary = file('greeting2.$ext');
 
     setUp(() {
       greetingDart.writeAsStringSync('String greeting = "hello";');
@@ -156,36 +180,35 @@
     });
 
     test('can compile in basic mode', () {
-      final dartSdkSummary = file('gen/sdk/ddc_sdk.sum');
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--summary-extension=api.ds',
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        greetingJS.path,
-        greetingDart.path,
-      ]);
-      expect(result.exitCode, EXIT_CODE_OK);
+      var result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-source-map',
+                '-o',
+                greetingJS.path,
+                greetingDart.path,
+              ]);
       expect(result.stdout, isEmpty);
       expect(result.stderr, isEmpty);
+      expect(result.exitCode, EXIT_CODE_OK);
       expect(greetingJS.existsSync(), isTrue);
       expect(greetingSummary.existsSync(), isTrue);
 
-      result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--no-source-map',
-        '--no-summarize',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '--summary-extension=api.ds',
-        '-s',
-        greetingSummary.path,
-        '-o',
-        helloJS.path,
-        helloDart.path,
-      ]);
+      result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-source-map',
+                '--no-summarize',
+                '-s',
+                greetingSummary.path,
+                '-o',
+                helloJS.path,
+                helloDart.path,
+              ]);
       expect(result.exitCode, EXIT_CODE_OK);
       expect(result.stdout, isEmpty);
       expect(result.stderr, isEmpty);
@@ -193,54 +216,53 @@
     });
 
     test('reports error on overlapping summaries', () {
-      final dartSdkSummary = file('gen/sdk/ddc_sdk.sum');
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--summary-extension=api.ds',
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        greetingJS.path,
-        greetingDart.path,
-      ]);
+      var result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-source-map',
+                '-o',
+                greetingJS.path,
+                greetingDart.path,
+              ]);
       expect(result.exitCode, EXIT_CODE_OK);
       expect(result.stdout, isEmpty);
       expect(result.stderr, isEmpty);
       expect(greetingJS.existsSync(), isTrue);
       expect(greetingSummary.existsSync(), isTrue);
 
-      result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--summary-extension=api.ds',
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        greeting2JS.path,
-        greetingDart.path,
-      ]);
+      result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-source-map',
+                '-o',
+                greeting2JS.path,
+                greetingDart.path,
+              ]);
       expect(result.exitCode, EXIT_CODE_OK);
       expect(result.stdout, isEmpty);
       expect(result.stderr, isEmpty);
       expect(greeting2JS.existsSync(), isTrue);
       expect(greeting2Summary.existsSync(), isTrue);
 
-      result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--no-source-map',
-        '--no-summarize',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '--summary-extension=api.ds',
-        '-s',
-        greetingSummary.path,
-        '-s',
-        greeting2Summary.path,
-        '-o',
-        helloJS.path,
-        helloDart.path,
-      ]);
+      result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-source-map',
+                '--no-summarize',
+                '-s',
+                greetingSummary.path,
+                '-s',
+                greeting2Summary.path,
+                '-o',
+                helloJS.path,
+                helloDart.path,
+              ]);
       // TODO(vsm): Re-enable when we turn this check back on.
       expect(result.exitCode, 0);
       // expect(result.exitCode, 65);
@@ -250,10 +272,9 @@
     });
   });
 
-  group('Error handling', () {
-    final dartSdkSummary = file('gen/sdk/ddc_sdk.sum');
-    final badFileDart = file('test/worker/bad.dart');
-    final badFileJs = file('test/worker/bad.js');
+  group('$mode: Error handling', () {
+    final badFileDart = file('bad.dart');
+    final badFileJs = file('bad.js');
 
     tearDown(() {
       if (badFileDart.existsSync()) badFileDart.deleteSync();
@@ -261,40 +282,41 @@
     });
 
     test('incorrect usage', () {
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        'oops',
-      ]);
+      var result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                'oops',
+              ]);
       expect(result.exitCode, 64);
       expect(
-          result.stdout, contains('Please include the output file location.'));
+          result.stdout, contains('Please specify the output file location.'));
       expect(result.stdout, isNot(contains('#0')));
     });
 
     test('compile errors', () {
       badFileDart.writeAsStringSync('main() => "hello world"');
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        badFileJs.path,
-        badFileDart.path,
-      ]);
+      var result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-source-map',
+                '-o',
+                badFileJs.path,
+                badFileDart.path,
+              ]);
       expect(result.exitCode, 1);
-      expect(result.stdout, contains("[error] Expected to find ';'"));
+      expect(result.stdout, contains(RegExp(r"Expected (to find )?\';\'")));
     });
   });
 
-  group('Parts', () {
-    final dartSdkSummary = file('gen/sdk/ddc_sdk.sum');
-    final partFile = file('test/worker/greeting.dart');
-    final libraryFile = file('test/worker/hello.dart');
+  group('$mode: Parts', () {
+    final partFile = file('greeting.dart');
+    final libraryFile = file('hello.dart');
 
-    final outJS = file('test/worker/output.js');
+    final outJS = file('output.js');
 
     setUp(() {
       partFile.writeAsStringSync('part of hello;\n'
@@ -311,17 +333,18 @@
     });
 
     test('works if part and library supplied', () {
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--no-summarize',
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        outJS.path,
-        partFile.path,
-        libraryFile.path,
-      ]);
+      var result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-summarize',
+                '--no-source-map',
+                '-o',
+                outJS.path,
+                partFile.path,
+                libraryFile.path,
+              ]);
       expect(result.stdout, isEmpty);
       expect(result.stderr, isEmpty);
       expect(result.exitCode, 0);
@@ -329,38 +352,43 @@
     });
 
     test('works if part is not supplied', () {
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--no-summarize',
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        outJS.path,
-        libraryFile.path,
-      ]);
+      var result = Process.runSync(
+          executable,
+          executableArgs +
+              baseArgs +
+              [
+                '--no-summarize',
+                '--no-source-map',
+                '-o',
+                outJS.path,
+                libraryFile.path,
+              ]);
       expect(result.stdout, isEmpty);
       expect(result.stderr, isEmpty);
       expect(result.exitCode, 0);
       expect(outJS.existsSync(), isTrue);
     });
 
-    test('part without library is silently ignored', () {
-      var result = Process.runSync(Platform.executable, [
-        dartdevc,
-        '--no-summarize',
-        '--no-source-map',
-        '--dart-sdk-summary',
-        dartSdkSummary.path,
-        '-o',
-        outJS.path,
-        partFile.path,
-      ]);
-      expect(result.stdout, isEmpty);
-      expect(result.stderr, isEmpty);
-      expect(result.exitCode, 0);
-      expect(outJS.existsSync(), isTrue);
-    });
+    if (!isKernel) {
+      // TODO(vsm): Consider dropping this test.  Kernel behavior is better.
+      test('part without library is silently ignored', () {
+        var result = Process.runSync(
+            executable,
+            executableArgs +
+                baseArgs +
+                [
+                  '--no-summarize',
+                  '--no-source-map',
+                  '-o',
+                  outJS.path,
+                  partFile.path,
+                ]);
+        expect(result.stdout, isEmpty);
+        expect(result.stderr, isEmpty);
+        expect(result.exitCode, 0);
+        expect(outJS.existsSync(), isTrue);
+      });
+    }
   });
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index 368d5e7..192b5f6 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -17,7 +17,8 @@
         nullCheck,
         Primitives,
         PrivateSymbol,
-        quoteStringForRegExp;
+        quoteStringForRegExp,
+        undefined;
 import 'dart:_runtime' as dart;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_native_typed_data' show NativeUint8List;
@@ -396,7 +397,7 @@
 @patch
 class List<E> {
   @patch
-  factory List([int _length = dart.undefined]) {
+  factory List([@undefined int _length]) {
     dynamic list;
     if (JS('bool', '# === void 0', _length)) {
       list = JS('', '[]');
diff --git a/pkg/dev_compiler/tool/input_sdk/private/annotations.dart b/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
index 1693256..bc437da 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/annotations.dart
@@ -43,6 +43,14 @@
   const _NullCheck();
 }
 
+/// Annotation indicating the parameter should default to the JavaScript
+/// undefined constant.
+const undefined = _Undefined();
+
+class _Undefined {
+  const _Undefined();
+}
+
 /// Tells the development compiler to check a variable for null at its
 /// declaration point, and then to assume that the variable is non-null
 /// from that point forward.
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 6f67aa9..7ab4a81 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
@@ -97,7 +97,7 @@
 // Warning: dload, dput, and dsend assume they are never called on methods
 // implemented by the Object base class as those methods can always be
 // statically resolved.
-dload(obj, field, [mirrors = undefined]) {
+dload(obj, field, [@undefined mirrors]) {
   if (JS('!', 'typeof # == "function" && # == "call"', obj, field)) {
     return obj;
   }
@@ -136,7 +136,7 @@
 dputRepl(obj, field, value) =>
     dput(obj, replNameLookup(obj, field), value, false);
 
-dput(obj, field, value, [mirrors = undefined]) {
+dput(obj, field, value, [@undefined mirrors]) {
   var f = _canonicalMember(obj, field);
   trackCall(obj);
   if (f != null) {
@@ -308,10 +308,10 @@
   return callNSM();
 })()''');
 
-dcall(f, args, [named = undefined]) =>
+dcall(f, args, [@undefined named]) =>
     _checkAndCall(f, null, JS('', 'void 0'), null, args, named, 'call');
 
-dgcall(f, typeArgs, args, [named = undefined]) =>
+dgcall(f, typeArgs, args, [@undefined named]) =>
     _checkAndCall(f, null, JS('', 'void 0'), typeArgs, args, named, 'call');
 
 /// Helper for REPL dynamic invocation variants that make a best effort to
@@ -377,16 +377,16 @@
   return _checkAndCall(f, ftype, obj, typeArgs, args, named, displayName);
 }
 
-dsend(obj, method, args, [named = undefined]) =>
+dsend(obj, method, args, [@undefined named]) =>
     callMethod(obj, method, null, args, named, method);
 
-dgsend(obj, typeArgs, method, args, [named = undefined]) =>
+dgsend(obj, typeArgs, method, args, [@undefined named]) =>
     callMethod(obj, method, typeArgs, args, named, method);
 
-dsendRepl(obj, method, args, [named = undefined]) =>
+dsendRepl(obj, method, args, [@undefined named]) =>
     callMethod(obj, replNameLookup(obj, method), null, args, named, method);
 
-dgsendRepl(obj, typeArgs, method, args, [named = undefined]) =>
+dgsendRepl(obj, typeArgs, method, args, [@undefined named]) =>
     callMethod(obj, replNameLookup(obj, method), typeArgs, args, named, method);
 
 dindex(obj, index) => callMethod(obj, '_get', null, [index], null, '[]');
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 665aae3..e943f3e 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
@@ -24,7 +24,8 @@
         PrivateSymbol,
         ReifyFunctionTypes,
         NoReifyGeneric,
-        notNull;
+        notNull,
+        undefined;
 
 export 'dart:_debugger' show getDynamicStats, clearDynamicStats, trackCall;
 
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 13d6f88..a5d6dd0 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
@@ -682,7 +682,7 @@
 }
 
 /// Create a function type.
-FunctionType fnType(returnType, List args, [extra = undefined]) =>
+FunctionType fnType(returnType, List args, [@undefined extra]) =>
     FunctionType.create(returnType, args, extra);
 
 /// Creates a generic function type.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
index 435d89e..8f9431d 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/utils.dart
@@ -8,11 +8,6 @@
 /// by the Dart runtime.
 // TODO(ochafik): Rewrite some of these in Dart when possible.
 
-/// The JavaScript undefined constant.
-///
-/// This is initialized by DDC to JS `void 0`.
-const undefined = null;
-
 final Function(Object, Object, Object) defineProperty =
     JS('', 'Object.defineProperty');
 
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index ac0217a..1d75bc5 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -134,6 +134,11 @@
   /// unevaluated and can be evaluated by a constant evaluator later.
   Map<String, String> environmentDefines = null;
 
+  /// Report an error if a constant could not be evaluated (either because it
+  /// is an environment constant and no environment was specified, or because
+  /// it refers to a constructor or variable initializer that is not available).
+  bool errorOnUnevaluatedConstant = false;
+
   /// The target platform that will consume the compiled code.
   ///
   /// Used to provide platform-specific details to the compiler like:
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index 84dc067..d0615fd 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -27,7 +27,7 @@
 
 const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
   ExperimentalFlag.constantUpdate2018: false,
-  ExperimentalFlag.controlFlowCollections: false,
+  ExperimentalFlag.controlFlowCollections: true,
   ExperimentalFlag.setLiterals: true,
-  ExperimentalFlag.spreadCollections: false,
+  ExperimentalFlag.spreadCollections: true,
 };
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 79d7201..9cfba14 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -184,6 +184,8 @@
 
   final Map<String, String> environmentDefines;
 
+  bool get errorOnUnevaluatedConstant => _raw.errorOnUnevaluatedConstant;
+
   /// Initializes a [ProcessedOptions] object wrapping the given [rawOptions].
   ProcessedOptions({CompilerOptions options, List<Uri> inputs, this.output})
       : this._raw = options ?? new CompilerOptions(),
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 de4fb58..668da04 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -639,6 +639,30 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(Token token)>
+    templateCantUseControlFlowOrSpreadAsConstant =
+    const Template<Message Function(Token token)>(
+        messageTemplate:
+            r"""'#lexeme' is not supported in constant expressions.""",
+        withArguments: _withArgumentsCantUseControlFlowOrSpreadAsConstant);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Token token)>
+    codeCantUseControlFlowOrSpreadAsConstant =
+    const Code<Message Function(Token token)>(
+        "CantUseControlFlowOrSpreadAsConstant",
+        templateCantUseControlFlowOrSpreadAsConstant,
+        analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantUseControlFlowOrSpreadAsConstant(Token token) {
+  String lexeme = token.lexeme;
+  return new Message(codeCantUseControlFlowOrSpreadAsConstant,
+      message: """'${lexeme}' is not supported in constant expressions.""",
+      arguments: {'token': token});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         Token
@@ -896,17 +920,6 @@
     message: r"""This is the type variable.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeConstAfterFactory = messageConstAfterFactory;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstAfterFactory = const MessageCode(
-    "ConstAfterFactory",
-    index: 56,
-    message:
-        r"""The modifier 'const' should be before the modifier 'factory'.""",
-    tip: r"""Try re-ordering the modifiers.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstAndCovariant = messageConstAndCovariant;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1635,6 +1648,14 @@
     message: r"""Null value during constant evaluation.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalUnevaluated = messageConstEvalUnevaluated;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalUnevaluated = const MessageCode(
+    "ConstEvalUnevaluated",
+    message: r"""Could not evaluate constant expression.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String string,
@@ -3225,7 +3246,7 @@
             string)> templateExperimentNotEnabled = const Template<
         Message Function(String string)>(
     messageTemplate:
-        r"""This requires the --#string experiment to be enabled.""",
+        r"""This requires the '#string' experiment to be enabled.""",
     tipTemplate:
         r"""Try enabling this experiment by adding it to the command line when compiling and running.""",
     withArguments: _withArgumentsExperimentNotEnabled);
@@ -3240,7 +3261,7 @@
 Message _withArgumentsExperimentNotEnabled(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExperimentNotEnabled,
-      message: """This requires the --${string} experiment to be enabled.""",
+      message: """This requires the '${string}' experiment to be enabled.""",
       tip:
           """Try enabling this experiment by adding it to the command line when compiling and running.""",
       arguments: {'string': string});
@@ -6904,6 +6925,36 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String string,
+        String
+            string2)> templateModifierOutOfOrder = const Template<
+        Message Function(String string, String string2)>(
+    messageTemplate:
+        r"""The modifier '#string' should be before the modifier '#string2'.""",
+    tipTemplate: r"""Try re-ordering the modifiers.""",
+    withArguments: _withArgumentsModifierOutOfOrder);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+    codeModifierOutOfOrder =
+    const Code<Message Function(String string, String string2)>(
+        "ModifierOutOfOrder", templateModifierOutOfOrder,
+        index: 56);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsModifierOutOfOrder(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
+  return new Message(codeModifierOutOfOrder,
+      message:
+          """The modifier '${string}' should be before the modifier '${string2}'.""",
+      tip: """Try re-ordering the modifiers.""",
+      arguments: {'string': string, 'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMoreThanOneSuperOrThisInitializer =
     messageMoreThanOneSuperOrThisInitializer;
 
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 e360c2e..0430c9d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2316,6 +2316,18 @@
       push(invalidCollectionElement);
       return;
     }
+
+    if (constantContext != ConstantContext.none &&
+        !library.loader.target.enableConstantUpdate2018) {
+      handleRecoverableError(
+          fasta.templateCantUseControlFlowOrSpreadAsConstant
+              .withArguments(forToken),
+          forToken,
+          forToken);
+      push(invalidCollectionElement);
+      return;
+    }
+
     transformCollections = true;
     List<VariableDeclaration> variables =
         buildVariableDeclarations(variableOrExpression);
@@ -3718,6 +3730,18 @@
       push(invalidCollectionElement);
       return;
     }
+
+    if (constantContext != ConstantContext.none &&
+        !library.loader.target.enableConstantUpdate2018) {
+      handleRecoverableError(
+          fasta.templateCantUseControlFlowOrSpreadAsConstant
+              .withArguments(ifToken),
+          ifToken,
+          ifToken);
+      push(invalidCollectionElement);
+      return;
+    }
+
     transformCollections = true;
     if (entry is MapEntry) {
       push(forest.ifMapEntry(toValue(condition), entry, null, ifToken));
@@ -3744,6 +3768,18 @@
       push(invalidCollectionElement);
       return;
     }
+
+    if (constantContext != ConstantContext.none &&
+        !library.loader.target.enableConstantUpdate2018) {
+      handleRecoverableError(
+          fasta.templateCantUseControlFlowOrSpreadAsConstant
+              .withArguments(ifToken),
+          ifToken,
+          ifToken);
+      push(invalidCollectionElement);
+      return;
+    }
+
     transformCollections = true;
     if (thenEntry is MapEntry) {
       if (elseEntry is MapEntry) {
@@ -3804,6 +3840,18 @@
       push(invalidCollectionElement);
       return;
     }
+
+    if (constantContext != ConstantContext.none &&
+        !library.loader.target.enableConstantUpdate2018) {
+      handleRecoverableError(
+          fasta.templateCantUseControlFlowOrSpreadAsConstant
+              .withArguments(spreadToken),
+          spreadToken,
+          spreadToken);
+      push(invalidCollectionElement);
+      return;
+    }
+
     transformCollections = true;
     push(forest.spreadElement(toValue(expression), spreadToken));
   }
@@ -4115,6 +4163,18 @@
       push(invalidCollectionElement);
       return;
     }
+
+    if (constantContext != ConstantContext.none &&
+        !library.loader.target.enableConstantUpdate2018) {
+      handleRecoverableError(
+          fasta.templateCantUseControlFlowOrSpreadAsConstant
+              .withArguments(forToken),
+          forToken,
+          forToken);
+      push(invalidCollectionElement);
+      return;
+    }
+
     transformCollections = true;
     VariableDeclaration variable = buildForInVariable(lvalue);
     Expression problem = checkForInVariable(lvalue, variable, forToken);
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index e6c5630..b35550c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -45,6 +45,7 @@
         messageConstEvalNotListOrSetInSpread,
         messageConstEvalNotMapInSpread,
         messageConstEvalNullValue,
+        messageConstEvalUnevaluated,
         noLength,
         templateConstEvalDeferredLibrary,
         templateConstEvalDuplicateElement,
@@ -83,6 +84,7 @@
     bool enableAsserts: false,
     bool evaluateAnnotations: true,
     bool desugarSets: false,
+    bool errorOnUnevaluatedConstant: false,
     CoreTypes coreTypes,
     ClassHierarchy hierarchy}) {
   coreTypes ??= new CoreTypes(component);
@@ -95,6 +97,7 @@
       keepFields: keepFields,
       enableAsserts: enableAsserts,
       desugarSets: desugarSets,
+      errorOnUnevaluatedConstant: errorOnUnevaluatedConstant,
       evaluateAnnotations: evaluateAnnotations);
   return component;
 }
@@ -109,6 +112,7 @@
     bool keepVariables: false,
     bool evaluateAnnotations: true,
     bool desugarSets: false,
+    bool errorOnUnevaluatedConstant: false,
     bool enableAsserts: false}) {
   final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
       backend,
@@ -117,6 +121,7 @@
       keepVariables,
       evaluateAnnotations,
       desugarSets,
+      errorOnUnevaluatedConstant,
       typeEnvironment,
       enableAsserts,
       errorReporter);
@@ -150,6 +155,7 @@
   final bool keepVariables;
   final bool evaluateAnnotations;
   final bool desugarSets;
+  final bool errorOnUnevaluatedConstant;
 
   ConstantsTransformer(
       ConstantsBackend backend,
@@ -158,12 +164,14 @@
       this.keepVariables,
       this.evaluateAnnotations,
       this.desugarSets,
+      this.errorOnUnevaluatedConstant,
       this.typeEnvironment,
       bool enableAsserts,
       ErrorReporter errorReporter)
       : constantEvaluator = new ConstantEvaluator(backend, environmentDefines,
             typeEnvironment, enableAsserts, errorReporter,
-            desugarSets: desugarSets);
+            desugarSets: desugarSets,
+            errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
 
   // Transform the library/class members:
 
@@ -309,7 +317,8 @@
           // So the value of the variable is still available for debugging
           // purposes we convert the constant variable to be a final variable
           // initialized to the evaluated constant expression.
-          node.initializer = makeConstantExpression(constant)..parent = node;
+          node.initializer = makeConstantExpression(constant, node.initializer)
+            ..parent = node;
           node.isFinal = true;
           node.isConst = false;
         } else {
@@ -354,13 +363,13 @@
   // Handle use-sites of constants (and "inline" constant expressions):
 
   visitSymbolLiteral(SymbolLiteral node) {
-    return makeConstantExpression(constantEvaluator.evaluate(node));
+    return makeConstantExpression(constantEvaluator.evaluate(node), node);
   }
 
   visitStaticGet(StaticGet node) {
     final Member target = node.target;
     if (target is Field && target.isConst) {
-      return evaluateAndTransformWithContext(node, target.initializer);
+      return evaluateAndTransformWithContext(node, node);
     } else if (target is Procedure && target.kind == ProcedureKind.Method) {
       return evaluateAndTransformWithContext(node, node);
     }
@@ -426,7 +435,7 @@
   }
 
   evaluateAndTransformWithContext(TreeNode treeContext, Expression node) {
-    return makeConstantExpression(evaluateWithContext(treeContext, node));
+    return makeConstantExpression(evaluateWithContext(treeContext, node), node);
   }
 
   evaluateWithContext(TreeNode treeContext, Expression node) {
@@ -439,12 +448,13 @@
     });
   }
 
-  Expression makeConstantExpression(Constant constant) {
+  Expression makeConstantExpression(Constant constant, Expression node) {
     if (constant is UnevaluatedConstant &&
         constant.expression is InvalidExpression) {
       return constant.expression;
     }
-    return new ConstantExpression(constant);
+    return new ConstantExpression(constant, node.getStaticType(typeEnvironment))
+      ..fileOffset = node.fileOffset;
   }
 }
 
@@ -452,6 +462,7 @@
   final ConstantsBackend backend;
   final NumberSemantics numberSemantics;
   Map<String, String> environmentDefines;
+  final bool errorOnUnevaluatedConstant;
   final CoreTypes coreTypes;
   final TypeEnvironment typeEnvironment;
   final bool enableAsserts;
@@ -488,7 +499,7 @@
 
   ConstantEvaluator(this.backend, this.environmentDefines, this.typeEnvironment,
       this.enableAsserts, this.errorReporter,
-      {this.desugarSets = false})
+      {this.desugarSets = false, this.errorOnUnevaluatedConstant = false})
       : numberSemantics = backend.numberSemantics,
         coreTypes = typeEnvironment.coreTypes,
         canonicalizationCache = <Constant, Constant>{},
@@ -537,7 +548,11 @@
     seenUnevaluatedChild = false;
     lazyDepth = 0;
     try {
-      return _evaluateSubexpression(node);
+      Constant result = _evaluateSubexpression(node);
+      if (errorOnUnevaluatedConstant && result is UnevaluatedConstant) {
+        return report(node, messageConstEvalUnevaluated);
+      }
+      return result;
     } on _AbortDueToError catch (e) {
       final Uri uri = getFileUri(e.node);
       final int fileOffset = getFileOffset(uri, e.node);
@@ -653,7 +668,12 @@
         result = nodeCache[node] ?? report(node, messageConstEvalCircularity);
       } else {
         nodeCache[node] = null;
-        result = nodeCache[node] = node.accept(this);
+        try {
+          result = nodeCache[node] = node.accept(this);
+        } catch (e) {
+          nodeCache.remove(node);
+          rethrow;
+        }
       }
     } else {
       result = node.accept(this);
@@ -1931,6 +1951,9 @@
           concatenated.add(new StringBuffer(value));
         }
       } else if (shouldBeUnevaluated) {
+        // The constant is either unevaluated or a non-primitive in an
+        // unevaluated context. In both cases we defer the evaluation and/or
+        // error reporting till later.
         concatenated.add(constant);
       } else {
         return report(
@@ -1943,11 +1966,13 @@
       final expressions = new List<Expression>(concatenated.length);
       for (int i = 0; i < concatenated.length; i++) {
         Object value = concatenated[i];
-        if (value is UnevaluatedConstant) {
-          expressions[i] = extract(value);
-        } else {
+        if (value is StringBuffer) {
           expressions[i] = new ConstantExpression(
               canonicalize(new StringConstant(value.toString())));
+        } else {
+          // The value is either unevaluated constant or a non-primitive
+          // constant in an unevaluated expression.
+          expressions[i] = extract(value);
         }
       }
       return unevaluated(node, new StringConcatenation(expressions));
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index d34ba34..484c95e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -23,7 +23,6 @@
         StringLiteral,
         SuperInitializer,
         ThisExpression,
-        TreeNode,
         VariableGet;
 
 import 'kernel_shadow_ast.dart' show ShadowClass;
@@ -94,9 +93,10 @@
       this.stringType,
       LibraryBuilder parent,
       int startCharOffset,
-      int charOffset)
+      int charOffset,
+      int charEndOffset)
       : super(metadata, 0, name, null, null, null, scope, constructors, parent,
-            null, startCharOffset, charOffset, TreeNode.noOffset,
+            null, startCharOffset, charOffset, charEndOffset,
             cls: cls);
 
   factory KernelEnumBuilder(
@@ -105,6 +105,7 @@
       String name,
       List<EnumConstantInfo> enumConstantInfos,
       KernelLibraryBuilder parent,
+      int startCharOffset,
       int charOffset,
       int charEndOffset) {
     assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
@@ -226,8 +227,8 @@
         members[name] = fieldBuilder..next = existing;
       }
     }
-    final int startCharOffset =
-        metadata == null ? charOffset : metadata.first.charOffset;
+    final int startCharOffsetComputed =
+        metadata == null ? startCharOffset : metadata.first.charOffset;
     KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal(
         metadata,
         name,
@@ -241,8 +242,9 @@
         objectType,
         stringType,
         parent,
-        startCharOffset,
-        charOffset);
+        startCharOffsetComputed,
+        charOffset,
+        charEndOffset);
     void setParent(String name, MemberBuilder builder) {
       do {
         builder.parent = enumBuilder;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index a7fbd0a..eac2a4a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -32,7 +32,6 @@
         StaticInvocation,
         StringLiteral,
         Supertype,
-        TreeNode,
         Typedef,
         TypeParameter,
         TypeParameterType,
@@ -303,7 +302,8 @@
         modifiers,
         className,
         typeVariables,
-        applyMixins(supertype, charOffset, className, isMixinDeclaration,
+        applyMixins(supertype, startCharOffset, charOffset, charEndOffset,
+            className, isMixinDeclaration,
             typeVariables: typeVariables),
         interfaces,
         classScope,
@@ -379,8 +379,13 @@
     return typeVariablesByName;
   }
 
-  KernelTypeBuilder applyMixins(KernelTypeBuilder type, int charOffset,
-      String subclassName, bool isMixinDeclaration,
+  KernelTypeBuilder applyMixins(
+      KernelTypeBuilder type,
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset,
+      String subclassName,
+      bool isMixinDeclaration,
       {String documentationComment,
       List<MetadataBuilder> metadata,
       String name,
@@ -553,9 +558,9 @@
             }
           }
         }
-        final int startCharOffset =
+        final int computedStartCharOffset =
             (isNamedMixinApplication ? metadata : null) == null
-                ? charOffset
+                ? startCharOffset
                 : metadata.first.charOffset;
         SourceClassBuilder application = new SourceClassBuilder(
             isNamedMixinApplication ? metadata : null,
@@ -575,9 +580,9 @@
                 isModifiable: false),
             this,
             <ConstructorReferenceBuilder>[],
-            startCharOffset,
+            computedStartCharOffset,
             charOffset,
-            TreeNode.noOffset,
+            charEndOffset,
             mixedInType: isMixinDeclaration ? null : mixin);
         if (isNamedMixinApplication) {
           loader.target.metadataCollector?.setDocumentationComment(
@@ -605,11 +610,13 @@
       int modifiers,
       KernelTypeBuilder mixinApplication,
       List<KernelTypeBuilder> interfaces,
-      int charOffset) {
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset) {
     // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
     endNestedDeclaration(name).resolveTypes(typeVariables, this);
-    KernelNamedTypeBuilder supertype = applyMixins(
-        mixinApplication, charOffset, name, false,
+    KernelNamedTypeBuilder supertype = applyMixins(mixinApplication,
+        startCharOffset, charOffset, charEndOffset, name, false,
         documentationComment: documentationComment,
         metadata: metadata,
         name: name,
@@ -819,11 +826,19 @@
       List<MetadataBuilder> metadata,
       String name,
       List<EnumConstantInfo> enumConstantInfos,
+      int startCharOffset,
       int charOffset,
       int charEndOffset) {
     MetadataCollector metadataCollector = loader.target.metadataCollector;
-    KernelEnumBuilder builder = new KernelEnumBuilder(metadataCollector,
-        metadata, name, enumConstantInfos, this, charOffset, charEndOffset);
+    KernelEnumBuilder builder = new KernelEnumBuilder(
+        metadataCollector,
+        metadata,
+        name,
+        enumConstantInfos,
+        this,
+        startCharOffset,
+        charOffset,
+        charEndOffset);
     addBuilder(name, builder, charOffset);
     metadataCollector?.setDocumentationComment(
         builder.target, documentationComment);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index e2598abc..4533ae4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -70,7 +70,7 @@
         templateMissingImplementationCause,
         templateSuperclassHasNoDefaultConstructor;
 
-import '../problems.dart' show unhandled, unimplemented;
+import '../problems.dart' show unhandled;
 
 import '../scope.dart' show AmbiguousBuilder;
 
@@ -136,6 +136,9 @@
   final Map<String, String> environmentDefines =
       CompilerContext.current.options.environmentDefines;
 
+  final bool errorOnUnevaluatedConstant =
+      CompilerContext.current.options.errorOnUnevaluatedConstant;
+
   final bool enableAsserts = CompilerContext.current.options.enableAsserts;
 
   final List<Object> clonedFormals = <Object>[];
@@ -777,7 +780,8 @@
           environment,
           new KernelConstantErrorReporter(loader),
           enableAsserts: enableAsserts,
-          desugarSets: !backendTarget.supportsSetLiterals);
+          desugarSets: !backendTarget.supportsSetLiterals,
+          errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
       ticker.logMs("Evaluated constants");
     }
     backendTarget.performModularTransformationsOnLibraries(
@@ -790,10 +794,6 @@
   }
 
   void runProcedureTransformations(Procedure procedure) {
-    if (loader.target.enableConstantUpdate2018) {
-      unimplemented('constant evaluation during expression evaluation',
-          procedure.fileOffset, procedure.fileUri);
-    }
     backendTarget.performTransformationsOnProcedure(
         loader.coreTypes, loader.hierarchy, procedure,
         logger: (String msg) => ticker.logMs(msg));
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index dfa8437..b63af14 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -1142,6 +1142,11 @@
   }
 
   @override
+  void handleLanguageVersion(Token commentToken, int major, int minor) {
+    listener?.handleLanguageVersion(commentToken, major, minor);
+  }
+
+  @override
   void handleLiteralBool(Token token) {
     listener?.handleLiteralBool(token);
   }
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 c59f7ea..0dd6638 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
@@ -6,7 +6,7 @@
 
 import '../fasta_codes.dart' as fasta;
 
-import '../scanner/token_constants.dart' show IDENTIFIER_TOKEN;
+import '../scanner/token_constants.dart' show IDENTIFIER_TOKEN, STRING_TOKEN;
 
 import 'identifier_context.dart';
 
@@ -624,7 +624,8 @@
 
     // Recovery
     if (isOneOfOrEof(identifier, const [';', '=', ',', '{', '}']) ||
-        looksLikeStatementStart(identifier)) {
+        looksLikeStatementStart(identifier) ||
+        identifier.kind == STRING_TOKEN) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: fasta.templateExpectedIdentifier.withArguments(identifier));
     } else {
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 858b3b8..9cc581a 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -1405,6 +1405,15 @@
     logEvent("Script");
   }
 
+  /// A language version comment was parsed of the form
+  /// // @dart = <major>.<minor>
+  ///
+  /// For more information, see
+  /// https://github.com/dart-lang/language/blob/master/accepted/future-releases/language-versioning/language-versioning.md#individual-library-language-version-override
+  void handleLanguageVersion(Token commentToken, int major, int minor) {
+    // TODO(danrubel): Update listeners to handle this
+  }
+
   /// A type has been just parsed, and the parser noticed that the next token
   /// has a type substitution comment /*=T*. So, the type that has been just
   /// parsed should be discarded, and a new type should be parsed instead.
diff --git a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
index 83d9a8d..3a5c8d1 100644
--- a/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -240,7 +240,8 @@
       varFinalOrConst = constToken = next;
 
       if (afterFactory) {
-        parser.reportRecoverableError(next, fasta.messageConstAfterFactory);
+        parser.reportRecoverableError(next,
+            fasta.templateModifierOutOfOrder.withArguments('const', 'factory'));
       }
       return next;
     }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index e716b34..4a616ac 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -10,15 +10,17 @@
 
 import '../scanner.dart' show ErrorToken, Token;
 
+import '../scanner/characters.dart' show $0, $9, $SPACE;
+
 import '../../scanner/token.dart'
     show
         ASSIGNMENT_PRECEDENCE,
         BeginToken,
         CASCADE_PRECEDENCE,
+        CommentToken,
         EQUALITY_PRECEDENCE,
         Keyword,
         POSTFIX_PRECEDENCE,
-        PREFIX_PRECEDENCE,
         RELATIONAL_PRECEDENCE,
         SELECTOR_PRECEDENCE,
         SyntheticBeginToken,
@@ -339,6 +341,7 @@
       directiveState?.checkScriptTag(this, token.next);
       token = parseScript(token);
     }
+    parseLanguageVersionOpt(token);
     while (!token.next.isEof) {
       final Token start = token.next;
       token = parseTopLevelDeclarationImpl(token, directiveState);
@@ -365,6 +368,74 @@
     return token;
   }
 
+  /// Parse the optional language version comment as specified in
+  /// https://github.com/dart-lang/language/blob/master/accepted/future-releases/language-versioning/language-versioning.md#individual-library-language-version-override
+  void parseLanguageVersionOpt(Token token) {
+    // TODO(danrubel): Handle @dart version multi-line comments and dartdoc
+    // or update the spec to exclude them.
+    token = token.next.precedingComments;
+    while (token is CommentToken) {
+      if (parseLanguageVersionText(token)) {
+        break;
+      }
+      token = token.next;
+    }
+  }
+
+  bool parseLanguageVersionText(CommentToken token) {
+    String text = token.lexeme;
+    if (text == null || !text.startsWith('//')) {
+      return false;
+    }
+    int index = _skipSpaces(text, 2);
+    if (!text.startsWith('@dart', index)) {
+      return false;
+    }
+    index = _skipSpaces(text, index + 5);
+    if (!text.startsWith('=', index)) {
+      return false;
+    }
+    int start = index = _skipSpaces(text, index + 1);
+    index = _skipDigits(text, start);
+    if (start == index) {
+      return false;
+    }
+    int major = int.parse(text.substring(start, index));
+    if (!text.startsWith('.', index)) {
+      return false;
+    }
+    start = index + 1;
+    index = _skipDigits(text, start);
+    if (start == index) {
+      return false;
+    }
+    int minor = int.parse(text.substring(start, index));
+    index = _skipSpaces(text, index);
+    if (index != text.length) {
+      return false;
+    }
+    listener.handleLanguageVersion(token, major, minor);
+    return true;
+  }
+
+  int _skipSpaces(String text, int index) {
+    while (index < text.length && text.codeUnitAt(index) == $SPACE) {
+      ++index;
+    }
+    return index;
+  }
+
+  int _skipDigits(String text, int index) {
+    while (index < text.length) {
+      int code = text.codeUnitAt(index);
+      if (code < $0 || code > $9) {
+        break;
+      }
+      ++index;
+    }
+    return index;
+  }
+
   /// This method exists for analyzer compatibility only
   /// and will be removed once analyzer/fasta integration is complete.
   ///
@@ -3798,7 +3869,7 @@
     }
     Token next = token.next;
     TokenType type = next.type;
-    int tokenLevel = type.precedence;
+    int tokenLevel = _computePrecedence(type);
     for (int level = tokenLevel; level >= precedence; --level) {
       int lastBinaryExpressionLevel = -1;
       while (identical(tokenLevel, level)) {
@@ -3821,13 +3892,10 @@
               (identical(type, TokenType.MINUS_MINUS))) {
             listener.handleUnaryPostfixAssignmentExpression(token.next);
             token = next;
+          } else if (identical(type, TokenType.BANG)) {
+            listener.handleNonNullAssertExpression(token.next);
+            token = next;
           }
-        } else if (identical(tokenLevel, PREFIX_PRECEDENCE) &&
-            (identical(type, TokenType.BANG))) {
-          // The '!' has prefix precedence but here it's being used as a
-          // postfix operator to assert the expression has a non-null value.
-          listener.handleNonNullAssertExpression(token.next);
-          token = next;
         } else if (identical(tokenLevel, SELECTOR_PRECEDENCE)) {
           if (identical(type, TokenType.PERIOD) ||
               identical(type, TokenType.QUESTION_PERIOD)) {
@@ -3882,12 +3950,22 @@
         }
         next = token.next;
         type = next.type;
-        tokenLevel = type.precedence;
+        tokenLevel = _computePrecedence(type);
       }
     }
     return token;
   }
 
+  int _computePrecedence(TokenType type) {
+    if (identical(type, TokenType.BANG)) {
+      // The '!' has prefix precedence but here it's being used as a
+      // postfix operator to assert the expression has a non-null value.
+      return POSTFIX_PRECEDENCE;
+    } else {
+      return type.precedence;
+    }
+  }
+
   Token parseCascadeExpression(Token token) {
     Token cascadeOperator = token = token.next;
     assert(optional('..', cascadeOperator));
diff --git a/pkg/front_end/lib/src/fasta/scanner/scanner_main.dart b/pkg/front_end/lib/src/fasta/scanner/scanner_main.dart
index 848b65d..fd3c030 100644
--- a/pkg/front_end/lib/src/fasta/scanner/scanner_main.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/scanner_main.dart
@@ -8,22 +8,18 @@
 
 import '../scanner.dart' show ErrorToken, Token, scan;
 
-scanAll(Map<Uri, List<int>> files) {
+scanAll(Map<Uri, List<int>> files, {bool verbose: false, bool verify: false}) {
   Stopwatch sw = new Stopwatch()..start();
   int byteCount = 0;
   files.forEach((Uri uri, List<int> bytes) {
     var token = scan(bytes).tokens;
-    if (const bool.fromEnvironment("printTokens")) {
-      printTokens(token);
-    }
-    if (const bool.fromEnvironment('verifyErrorTokens')) {
-      verifyErrorTokens(token, uri);
-    }
+    if (verbose) printTokens(token);
+    if (verify) verifyErrorTokens(token, uri);
     byteCount += bytes.length - 1;
   });
   sw.stop();
   print("Scanning files took: ${sw.elapsed}");
-  print("Bytes/ms: ${byteCount/sw.elapsedMilliseconds}");
+  print("Bytes/ms: ${byteCount / sw.elapsedMilliseconds}");
 }
 
 void printTokens(Token token) {
@@ -78,12 +74,25 @@
 mainEntryPoint(List<String> arguments) {
   Map<Uri, List<int>> files = <Uri, List<int>>{};
   Stopwatch sw = new Stopwatch()..start();
-  for (String name in arguments) {
-    Uri uri = Uri.base.resolve(name);
+  bool verbose = const bool.fromEnvironment("printTokens");
+  bool verify = const bool.fromEnvironment('verifyErrorTokens');
+  for (String arg in arguments) {
+    if (arg.startsWith('--')) {
+      if (arg == '--print-tokens') {
+        verbose = true;
+      } else if (arg == '--verify-error-tokens') {
+        verify = true;
+      } else {
+        print('Unrecognized option: $arg');
+      }
+      continue;
+    }
+
+    Uri uri = Uri.base.resolve(arg);
     List<int> bytes = readBytesFromFileSync(uri);
     files[uri] = bytes;
   }
   sw.stop();
   print("Reading files took: ${sw.elapsed}");
-  scanAll(files);
+  scanAll(files, verbose: verbose, verify: verify);
 }
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 32a7071..0f4d72f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -944,8 +944,20 @@
       library.endNestedDeclaration("<syntax-error>");
       return;
     }
-    library.addNamedMixinApplication(documentationComment, metadata, name,
-        typeVariables, modifiers, mixinApplication, interfaces, charOffset);
+
+    int startCharOffset = beginToken.charOffset;
+    int charEndOffset = endToken.charOffset;
+    library.addNamedMixinApplication(
+        documentationComment,
+        metadata,
+        name,
+        typeVariables,
+        modifiers,
+        mixinApplication,
+        interfaces,
+        startCharOffset,
+        charOffset,
+        charEndOffset);
   }
 
   @override
@@ -1168,13 +1180,14 @@
     String documentationComment = getDocumentationComment(enumKeyword);
     List<EnumConstantInfo> enumConstantInfos =
         const FixedNullableList<EnumConstantInfo>().pop(stack, count);
-    int charOffset = pop();
+    int charOffset = pop(); // identifier char offset.
+    int startCharOffset = enumKeyword.charOffset;
     Object name = pop();
     List<MetadataBuilder<KernelTypeBuilder>> metadata = pop();
     checkEmpty(enumKeyword.charOffset);
     if (name is ParserRecovery) return;
     library.addEnum(documentationComment, metadata, name, enumConstantInfos,
-        charOffset, leftBrace?.endGroup?.charOffset);
+        startCharOffset, charOffset, leftBrace?.endGroup?.charOffset);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 7aadb95..8d2b369 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -378,7 +378,9 @@
       int modifiers,
       T mixinApplication,
       List<T> interfaces,
-      int charOffset);
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset);
 
   void addField(
       String documentationComment,
@@ -453,6 +455,7 @@
       List<MetadataBuilder> metadata,
       String name,
       List<EnumConstantInfo> enumConstantInfos,
+      int startCharOffset,
       int charOffset,
       int charEndOffset);
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 97a0382..4c3b6c9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -239,6 +239,12 @@
       case "dart:async":
         return utf8.encode(defaultDartAsyncSource);
 
+      case "dart:collection":
+        return utf8.encode(defaultDartCollectionSource);
+
+      case "dart:_internal":
+        return utf8.encode(defaultDartInternalSource);
+
       default:
         return utf8.encode(message == null ? "" : "/* ${message.message} */");
     }
@@ -1136,6 +1142,8 @@
 
 class Symbol {}
 
+class Set {}
+
 class Type {}
 
 class _InvocationMirror {
@@ -1221,3 +1229,20 @@
   cancel() {}
 }
 """;
+
+/// A minimal implementation of dart:collection that is sufficient to create an
+/// instance of [CoreTypes] and compile program.
+const String defaultDartCollectionSource = """
+class _UnmodifiableSet {
+  final Map _map;
+  const _UnmodifiableSet(this._map);
+}
+""";
+
+/// A minimal implementation of dart:_internel that is sufficient to create an
+/// instance of [CoreTypes] and compile program.
+const String defaultDartInternalSource = """
+class Symbol {
+  const Symbol(String name);
+}
+""";
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index d596481..5c8dbfa 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -131,6 +131,7 @@
     }
     if (declaredMethod is SyntheticAccessor) {
       declaredMethod._field.type = inferredType;
+      declaredMethod._field.initializer = null;
     } else {
       if (kind == ProcedureKind.Getter) {
         declaredMethod.function.returnType = inferredType;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 64141b8..844ba61 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -31,15 +31,14 @@
 CannotReadSdkSpecification/example: Fail
 CantDetermineConstness/analyzerCode: Fail
 CantDisambiguateAmbiguousInformation/analyzerCode: Fail # There's no analyzer code for that error yet.
-CantDisambiguateAmbiguousInformation/script: Fail # Can't be tested until 'spread-collections' flag is on.
 CantDisambiguateNotEnoughInformation/analyzerCode: Fail # There's no analyzer code for that error yet.
-CantDisambiguateNotEnoughInformation/script: Fail # Can't be tested until 'spread-collections' flag is on.
 CantInferPackagesFromManyInputs/analyzerCode: Fail
 CantInferPackagesFromManyInputs/example: Fail
 CantInferPackagesFromPackageUri/analyzerCode: Fail
 CantInferPackagesFromPackageUri/example: Fail
 CantInferTypeDueToCircularity/example: Fail
 CantInferTypeDueToInconsistentOverrides/example: Fail
+CantUseControlFlowOrSpreadAsConstant/example: Fail
 CantUseSuperBoundedTypeForInstanceCreation/analyzerCode: Fail
 CantUseSuperBoundedTypeForInstanceCreation/example: Fail
 ColonInPlaceOfIn/example: Fail
@@ -51,7 +50,6 @@
 ConflictsWithSetter/example: Fail
 ConflictsWithSetterWarning/example: Fail
 ConflictsWithTypeVariable/example: Fail
-ConstAfterFactory/script1: Fail
 ConstAndCovariant/script2: Fail
 ConstAndFinal/declaration3: Fail
 ConstAndFinal/declaration4: Fail
@@ -93,6 +91,8 @@
 ConstEvalNotListOrSetInSpread/example: Fail
 ConstEvalNotMapInSpread/example: Fail
 ConstEvalNullValue/example: Fail
+ConstEvalUnevaluated/analyzerCode: Fail
+ConstEvalUnevaluated/example: Fail
 ConstEvalZeroDivisor/example: Fail
 ConstFieldWithoutInitializer/example: Fail
 ConstructorNotFound/example: Fail
@@ -275,6 +275,7 @@
 MissingMain/example: Fail
 MissingPrefixInDeferredImport/example: Fail
 MixinInferenceNoMatchingClass/example: Fail
+ModifierOutOfOrder/script1: Fail
 MultipleExtends/script: Fail
 MultipleImplements/script: Fail
 MultipleLibraryDirectives/example: Fail
@@ -291,7 +292,6 @@
 NonConstFactory/example: Fail
 NonInstanceTypeVariableUse/example: Fail
 NonNullAwareSpreadIsNull/analyzerCode: Fail # There's no analyzer code for that error yet.
-NonNullAwareSpreadIsNull/script: Fail # Can't be tested until 'spread-collections' flag is on.
 NonPartOfDirectiveInPart/script1: Fail
 NotAConstantExpression/example: Fail
 NotAType/example: Fail
@@ -358,15 +358,8 @@
 SourceBodySummary/example: Fail
 SourceOutlineSummary/analyzerCode: Fail
 SourceOutlineSummary/example: Fail
-SpreadElementTypeMismatch/script: Fail # Can't be tested until 'spread-collections' flag is on.
-SpreadMapEntryElementKeyTypeMismatch/script: Fail # Can't be tested until 'spread-collections' flag is on.
-SpreadMapEntryElementValueTypeMismatch/script: Fail # Can't be tested until 'spread-collections' flag is on.
 SpreadMapEntryTypeMismatch/analyzerCode: Fail # There's no analyzer code for that error yet.
-SpreadMapEntryTypeMismatch/script1: Fail # Can't be tested until 'spread-collections' flag is on.
-SpreadMapEntryTypeMismatch/script2: Fail # Can't be tested until 'spread-collections' flag is on.
 SpreadTypeMismatch/analyzerCode: Fail # There's no analyzer code for that error yet.
-SpreadTypeMismatch/script1: Fail # Can't be tested until 'spread-collections' flag is on.
-SpreadTypeMismatch/script2: Fail # Can't be tested until 'spread-collections' flag is on.
 StackOverflow/example: Fail
 StaticAfterConst/script1: Fail
 SuperAsExpression/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index e633dfd..bc98cf9 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -193,6 +193,9 @@
   template: "Iteration can't be used in a constant map."
   analyzerCode: NON_CONSTANT_MAP_ELEMENT
 
+ConstEvalUnevaluated:
+  template: "Could not evaluate constant expression."
+
 NotConstantExpression:
   template: "#string is not a constant expression."
   analyzerCode: NOT_CONSTANT_EXPRESSION
@@ -218,7 +221,7 @@
 
 ExperimentNotEnabled:
   index: 93
-  template: "This requires the --#string experiment to be enabled."
+  template: "This requires the '#string' experiment to be enabled."
   tip: "Try enabling this experiment by adding it to the command line when compiling and running."
   analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
 
@@ -629,11 +632,11 @@
   tip: "Try using a constructor or factory that is 'const'."
   analyzerCode: NOT_CONSTANT_EXPRESSION
 
-ConstAfterFactory:
+ModifierOutOfOrder:
   index: 56
-  template: "The modifier 'const' should be before the modifier 'factory'."
+  template: "The modifier '#string' should be before the modifier '#string2'."
   tip: "Try re-ordering the modifiers."
-  analyzerCode: ParserErrorCode.CONST_AFTER_FACTORY
+  analyzerCode: ParserErrorCode.MODIFIER_OUT_OF_ORDER
   script:
     - "class C { factory const C() = prefix.B.foo; }"
 
@@ -3197,6 +3200,10 @@
       prefix?.Object;
     }
 
+CantUseControlFlowOrSpreadAsConstant:
+  template: "'#lexeme' is not supported in constant expressions."
+  analyzerCode: NOT_CONSTANT_EXPRESSION
+
 CantUseDeferredPrefixAsConstant:
   template: >
     '#lexeme' can't be used in a constant expression because it's marked as
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index abdd2f2..16125c3 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -439,11 +439,15 @@
       for (Library lib in component.libraries) {
         for (Class c in lib.classes) {
           for (Procedure p in c.procedures) {
-            if (p.function.body is! EmptyStatement) throw "Got body";
+            if (p.function.body != null && p.function.body is! EmptyStatement) {
+              throw "Got body (${p.function.body.runtimeType})";
+            }
           }
         }
         for (Procedure p in lib.procedures) {
-          if (p.function.body is! EmptyStatement) throw "Got body";
+          if (p.function.body != null && p.function.body is! EmptyStatement) {
+            throw "Got body (${p.function.body.runtimeType})";
+          }
         }
       }
     }
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
index 5167dc9..c660edf 100644
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
index 5167dc9..c660edf 100644
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
index 799a3cd..0a70d79 100644
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
index 494d25e..b5040a5 100644
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
index 908e7aa..e223280 100644
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
index 908e7aa..e223280 100644
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
index b570941..26b5b7d 100644
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
index 1ea2a3f..1f4e6c8 100644
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
index e9712c6..eebc07b 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
index 7f12556..989c4c4 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:async" as asy;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect
index db0bb07..512b965 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
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 5ac3a08..7b3dfb1 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
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:async" as asy;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
index 2a8fcd5..3cf5bf4 100644
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
index 2a8fcd5..3cf5bf4 100644
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect
index a4a8839..feb2112 100644
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
index 2b6f45a..b755990 100644
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
index d1bc459..169b56c 100644
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
index d1bc459..169b56c 100644
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect
index cf5fce5..3fa478a 100644
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
index a6a7f4a..40b7cc6 100644
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
index 175fa7c..714d35c 100644
--- a/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
index 175fa7c..714d35c 100644
--- a/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read.dart.strong.expect
index 1af399d..500b9e9 100644
--- a/pkg/front_end/testcases/check_deferred_read.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_read.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
index daa8674..1e9676c 100644
--- a/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
index 60e13fd..01f9ffd 100644
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
index 60e13fd..01f9ffd 100644
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
index 90d44a4..a454d85 100644
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
index ed7f244..c8d8259 100644
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
index 3982934..8acc0bb 100644
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
index 3982934..8acc0bb 100644
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
index d62739e..413f2f6 100644
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
index 747f240..363f918 100644
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
index a054b09..5e32eae 100644
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
index a054b09..5e32eae 100644
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
index 6ee7c79..cf7b29c 100644
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
index cfe8c33..0e05e8f 100644
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
index 423412d..982cf85 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
@@ -9,7 +9,7 @@
 //     ^^^
 //
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as d;
 
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
index 423412d..982cf85 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
 //     ^^^
 //
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as d;
 
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect
index 7693576..592059d 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as d;
 
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
index 6be11a9..29b1b92 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
@@ -9,7 +9,7 @@
 //     ^^^
 //
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as d;
 
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
index 6be11a9..29b1b92 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
 //     ^^^
 //
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as d;
 
diff --git a/pkg/front_end/testcases/export_main.dart.legacy.expect b/pkg/front_end/testcases/export_main.dart.legacy.expect
index 1f4d73b..2ce3772 100644
--- a/pkg/front_end/testcases/export_main.dart.legacy.expect
+++ b/pkg/front_end/testcases/export_main.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./hello.dart" as hel;
+import "hello.dart" as hel;
 additionalExports = (hel::main)
 
 
diff --git a/pkg/front_end/testcases/export_main.dart.legacy.transformed.expect b/pkg/front_end/testcases/export_main.dart.legacy.transformed.expect
index 1f4d73b..2ce3772 100644
--- a/pkg/front_end/testcases/export_main.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/export_main.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./hello.dart" as hel;
+import "hello.dart" as hel;
 additionalExports = (hel::main)
 
 
diff --git a/pkg/front_end/testcases/export_main.dart.outline.expect b/pkg/front_end/testcases/export_main.dart.outline.expect
index 349482d..ce25789 100644
--- a/pkg/front_end/testcases/export_main.dart.outline.expect
+++ b/pkg/front_end/testcases/export_main.dart.outline.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./hello.dart" as hel;
+import "hello.dart" as hel;
 additionalExports = (hel::main)
 
 
diff --git a/pkg/front_end/testcases/export_main.dart.strong.expect b/pkg/front_end/testcases/export_main.dart.strong.expect
index 1f4d73b..2ce3772 100644
--- a/pkg/front_end/testcases/export_main.dart.strong.expect
+++ b/pkg/front_end/testcases/export_main.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./hello.dart" as hel;
+import "hello.dart" as hel;
 additionalExports = (hel::main)
 
 
diff --git a/pkg/front_end/testcases/export_main.dart.strong.transformed.expect b/pkg/front_end/testcases/export_main.dart.strong.transformed.expect
index 1f4d73b..2ce3772 100644
--- a/pkg/front_end/testcases/export_main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/export_main.dart.strong.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./hello.dart" as hel;
+import "hello.dart" as hel;
 additionalExports = (hel::main)
 
 
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml
new file mode 100644
index 0000000..0105f44
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml
@@ -0,0 +1,22 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application with the option of only getting an outline.
+# This is a reproduction of http://dartbug.com/36498.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        abstract class Foo {
+          int get foo;
+        }
+
+        class Bar implements Foo {
+          static int _foo = 0;
+          final foo = _foo++;
+        }
+    outlineOnly: true
\ No newline at end of file
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
index 0998224..80d04c7 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as inf;
+import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
@@ -15,8 +15,8 @@
 
 library;
 import self as inf;
-import "./infer_consts_transitively_2.dart" as self;
-import "./infer_consts_transitively_2_b.dart" as inf2;
+import "infer_consts_transitively_2.dart" as self;
+import "infer_consts_transitively_2_b.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
index 0998224..80d04c7 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as inf;
+import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
@@ -15,8 +15,8 @@
 
 library;
 import self as inf;
-import "./infer_consts_transitively_2.dart" as self;
-import "./infer_consts_transitively_2_b.dart" as inf2;
+import "infer_consts_transitively_2.dart" as self;
+import "infer_consts_transitively_2_b.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
index 3530a86..d434a70 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as inf;
+import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
@@ -16,8 +16,8 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_consts_transitively_2.dart" as self;
-import "./infer_consts_transitively_2_b.dart" as inf2;
+import "infer_consts_transitively_2.dart" as self;
+import "infer_consts_transitively_2_b.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
index 3530a86..d434a70 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as inf;
+import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
@@ -16,8 +16,8 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_consts_transitively_2.dart" as self;
-import "./infer_consts_transitively_2_b.dart" as inf2;
+import "infer_consts_transitively_2.dart" as self;
+import "infer_consts_transitively_2_b.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
index c06662b..6fa0ac1 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
-import "./infer_consts_transitively_2.dart" as test;
-import "./infer_consts_transitively_2_b.dart" as inf;
+import "infer_consts_transitively_2.dart" as test;
+import "infer_consts_transitively_2_b.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
@@ -13,7 +13,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as self;
+import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
index c06662b..6fa0ac1 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
-import "./infer_consts_transitively_2.dart" as test;
-import "./infer_consts_transitively_2_b.dart" as inf;
+import "infer_consts_transitively_2.dart" as test;
+import "infer_consts_transitively_2_b.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
@@ -13,7 +13,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as self;
+import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
index cbafa8c..f548afe 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_consts_transitively_2.dart" as test;
-import "./infer_consts_transitively_2_b.dart" as inf;
+import "infer_consts_transitively_2.dart" as test;
+import "infer_consts_transitively_2_b.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
@@ -14,7 +14,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as self;
+import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
index cbafa8c..f548afe 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_consts_transitively_2.dart" as test;
-import "./infer_consts_transitively_2_b.dart" as inf;
+import "infer_consts_transitively_2.dart" as test;
+import "infer_consts_transitively_2_b.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
@@ -14,7 +14,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_consts_transitively_2_a.dart" as self;
+import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
index 4ea1232..9c32726 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
 
@@ -24,7 +24,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
index 4ea1232..9c32726 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
 
@@ -24,7 +24,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
index c251bf8..3e157ba 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
 
@@ -25,7 +25,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
index c251bf8..3e157ba 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
 
@@ -25,7 +25,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
index 878a97d..11440fd 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
index 878a97d..11440fd 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
index 28ec8b4..d23de18 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
index 28ec8b4..d23de18 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
index 9af84b2..3f3d4f9 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
@@ -15,7 +15,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
index 9af84b2..3f3d4f9 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
@@ -15,7 +15,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
index 5112e7e..1ace456 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
@@ -15,7 +15,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
index 5112e7e..1ace456 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
index ad43ba3..12230fd 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
@@ -9,7 +9,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
index ad43ba3..12230fd 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
index f5cd011..f6fbc3e 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
@@ -10,7 +10,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
index f5cd011..f6fbc3e 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 library test;
 import self as self2;
 import "dart:core" as core;
-import "./infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
index d442d47..6e1db6f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
@@ -1,6 +1,6 @@
 library test;
 import self as self;
-import "./infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
index d442d47..6e1db6f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library test;
 import self as self;
-import "./infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index ebfe694..1499bf7 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -13,7 +13,7 @@
 //                                    ^
 //
 import self as self;
-import "./infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
index ebfe694..1499bf7 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
 //                                    ^
 //
 import self as self;
-import "./infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
index db58bcd..426906e 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
index db58bcd..426906e 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index 2af44de..4d2b4b8 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -14,7 +14,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
index 2af44de..4d2b4b8 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
+import "infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
index 094adfb..7e55b99 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf;
+import "infer_statics_transitively_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -16,8 +16,8 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf2;
-import "./infer_statics_transitively.dart" as self;
+import "infer_statics_transitively_b.dart" as inf2;
+import "infer_statics_transitively.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
index 094adfb..7e55b99 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf;
+import "infer_statics_transitively_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -16,8 +16,8 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf2;
-import "./infer_statics_transitively.dart" as self;
+import "infer_statics_transitively_b.dart" as inf2;
+import "infer_statics_transitively.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
index 7d3fd79..99c4846 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf;
+import "infer_statics_transitively_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -16,8 +16,8 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf2;
-import "./infer_statics_transitively.dart" as self;
+import "infer_statics_transitively_b.dart" as inf2;
+import "infer_statics_transitively.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
index 7d3fd79..99c4846 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf;
+import "infer_statics_transitively_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -16,8 +16,8 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf2;
-import "./infer_statics_transitively.dart" as self;
+import "infer_statics_transitively_b.dart" as inf2;
+import "infer_statics_transitively.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
index c14e037..b5b71b0 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively3_a.dart" as inf;
+import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
index c14e037..b5b71b0 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively3_a.dart" as inf;
+import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
index 8554b53..d80f5c4 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively3_a.dart" as inf;
+import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
index 8554b53..d80f5c4 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively3_a.dart" as inf;
+import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
index 041ca29..4e48a93 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -21,7 +21,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf2;
+import "infer_statics_transitively_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -44,8 +44,8 @@
 library;
 import self as inf2;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
index 041ca29..4e48a93 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -21,7 +21,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf2;
+import "infer_statics_transitively_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -44,8 +44,8 @@
 library;
 import self as inf2;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
index 295510c..9891055 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -21,7 +21,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf2;
+import "infer_statics_transitively_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -45,8 +45,8 @@
 library;
 import self as inf2;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
index 295510c..9891055 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -21,7 +21,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as inf2;
+import "infer_statics_transitively_a.dart" as inf2;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
@@ -45,8 +45,8 @@
 library;
 import self as inf2;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
index e1f6bf9..7c8af8a 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -19,7 +19,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as self;
+import "infer_statics_transitively_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
index e1f6bf9..7c8af8a 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -19,7 +19,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as self;
+import "infer_statics_transitively_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
index e5c5eb0..aa6b4be 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -19,7 +19,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as self;
+import "infer_statics_transitively_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
index e5c5eb0..aa6b4be 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
@@ -1,8 +1,8 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_transitively_b.dart" as inf;
-import "./infer_statics_transitively.dart" as test;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
 
 import "org-dartlang-testcase:///infer_statics_transitively.dart";
 import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
@@ -19,7 +19,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_statics_transitively_a.dart" as self;
+import "infer_statics_transitively_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
index cdad9fa..1303bcc 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_with_method_invocations_a.dart" as inf;
+import "infer_statics_with_method_invocations_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
index cdad9fa..1303bcc 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_with_method_invocations_a.dart" as inf;
+import "infer_statics_with_method_invocations_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
index cdad9fa..1303bcc 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_with_method_invocations_a.dart" as inf;
+import "infer_statics_with_method_invocations_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
index cdad9fa..1303bcc 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_statics_with_method_invocations_a.dart" as inf;
+import "infer_statics_with_method_invocations_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
index 4302f4f..707d09d 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
@@ -1,6 +1,6 @@
 library test;
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
@@ -29,7 +29,7 @@
 
 library;
 import self as inf;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
index 4302f4f..707d09d 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library test;
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
@@ -29,7 +29,7 @@
 
 library;
 import self as inf;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 1f0fd34..ff10b61 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -8,7 +8,7 @@
 //                                                                     ^
 //
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
@@ -40,7 +40,7 @@
 
 library;
 import self as inf;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
index 1f0fd34..ff10b61 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
 //                                                                     ^
 //
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
@@ -40,7 +40,7 @@
 
 library;
 import self as inf;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
index 2e91f62..f32c8d5 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
@@ -13,7 +13,7 @@
 
 library test;
 import self as test;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
index 2e91f62..f32c8d5 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
@@ -13,7 +13,7 @@
 
 library test;
 import self as test;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
index fe03c30..9b49051 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
@@ -21,7 +21,7 @@
 //                                                                     ^
 //
 import self as test;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
index fe03c30..9b49051 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
@@ -21,7 +21,7 @@
 //                                                                     ^
 //
 import self as test;
-import "./infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
index 2f73c7b..ecee2c6 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
@@ -34,7 +34,7 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
index 2f73c7b..ecee2c6 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
@@ -34,7 +34,7 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index af26f52..1f20b42 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -9,7 +9,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
@@ -45,7 +45,7 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index af26f52..1f20b42 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
@@ -45,7 +45,7 @@
 library;
 import self as inf;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
index c8150f5..54ed9fa 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
@@ -16,7 +16,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
index c8150f5..54ed9fa 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
@@ -16,7 +16,7 @@
 library test;
 import self as test;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index 09436d7..a10bf88 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
@@ -24,7 +24,7 @@
 //
 import self as test;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
index 09436d7..a10bf88 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
 
@@ -24,7 +24,7 @@
 //
 import self as test;
 import "dart:core" as core;
-import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
 
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
index 34e8860..aa682e0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "non_simple_many_libs_same_name_cycle_lib.dart" as non;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
@@ -14,7 +14,7 @@
 
 library non_simple_many_libs_same_name_cycle_lib;
 import self as non;
-import "./non_simple_many_libs_same_name_cycle.dart" as self;
+import "non_simple_many_libs_same_name_cycle.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
index 34e8860..aa682e0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "non_simple_many_libs_same_name_cycle_lib.dart" as non;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
@@ -14,7 +14,7 @@
 
 library non_simple_many_libs_same_name_cycle_lib;
 import self as non;
-import "./non_simple_many_libs_same_name_cycle.dart" as self;
+import "non_simple_many_libs_same_name_cycle.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
index 63b417d..8b8c4bb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "non_simple_many_libs_same_name_cycle_lib.dart" as non;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
@@ -14,7 +14,7 @@
 
 library non_simple_many_libs_same_name_cycle_lib;
 import self as non;
-import "./non_simple_many_libs_same_name_cycle.dart" as self;
+import "non_simple_many_libs_same_name_cycle.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
index aa390f4..5ed003d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
@@ -27,7 +27,7 @@
 
 library non_simple_many_libs_same_name_cycle_lib;
 import self as self2;
-import "./non_simple_many_libs_same_name_cycle.dart" as self;
+import "non_simple_many_libs_same_name_cycle.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
index aa390f4..5ed003d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
 
 library non_simple_many_libs_same_name_cycle_lib;
 import self as self2;
-import "./non_simple_many_libs_same_name_cycle.dart" as self;
+import "non_simple_many_libs_same_name_cycle.dart" as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
index 214711b..3afff4b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
@@ -1,7 +1,7 @@
 library private;
 import self as self;
 import "dart:core" as core;
-import "./private_module.dart" as pri;
+import "private_module.dart" as pri;
 
 import "org-dartlang-testcase:///private_module.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
index 214711b..3afff4b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library private;
 import self as self;
 import "dart:core" as core;
-import "./private_module.dart" as pri;
+import "private_module.dart" as pri;
 
 import "org-dartlang-testcase:///private_module.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 6270b7f..518a7f4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
@@ -1,7 +1,7 @@
 library private;
 import self as self;
 import "dart:core" as core;
-import "./private_module.dart" as pri;
+import "private_module.dart" as pri;
 
 import "org-dartlang-testcase:///private_module.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
index 214711b..3afff4b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
@@ -1,7 +1,7 @@
 library private;
 import self as self;
 import "dart:core" as core;
-import "./private_module.dart" as pri;
+import "private_module.dart" as pri;
 
 import "org-dartlang-testcase:///private_module.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
index 214711b..3afff4b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library private;
 import self as self;
 import "dart:core" as core;
-import "./private_module.dart" as pri;
+import "private_module.dart" as pri;
 
 import "org-dartlang-testcase:///private_module.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
index 52f88c4..a545e64 100644
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./no_such_method_private_setter_lib.dart" as no_;
+import "no_such_method_private_setter_lib.dart" as no_;
 
 import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
index 52f88c4..a545e64 100644
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./no_such_method_private_setter_lib.dart" as no_;
+import "no_such_method_private_setter_lib.dart" as no_;
 
 import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect
index 78df3aa..099c2ab 100644
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./no_such_method_private_setter_lib.dart" as no_;
+import "no_such_method_private_setter_lib.dart" as no_;
 
 import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect
index 52f88c4..a545e64 100644
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./no_such_method_private_setter_lib.dart" as no_;
+import "no_such_method_private_setter_lib.dart" as no_;
 
 import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";
 
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
index 52f88c4..a545e64 100644
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./no_such_method_private_setter_lib.dart" as no_;
+import "no_such_method_private_setter_lib.dart" as no_;
 
 import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";
 
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect b/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect
index a057f8b..b9dac32 100644
--- a/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect
+++ b/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect
@@ -17,7 +17,7 @@
 
 library;
 import self as self2;
-import "./part_not_part_of_lib1.dart" as par;
+import "part_not_part_of_lib1.dart" as par;
 
 import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
 
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect b/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
index a057f8b..b9dac32 100644
--- a/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
@@ -17,7 +17,7 @@
 
 library;
 import self as self2;
-import "./part_not_part_of_lib1.dart" as par;
+import "part_not_part_of_lib1.dart" as par;
 
 import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
 
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.strong.expect b/pkg/front_end/testcases/part_not_part_of.dart.strong.expect
index a057f8b..b9dac32 100644
--- a/pkg/front_end/testcases/part_not_part_of.dart.strong.expect
+++ b/pkg/front_end/testcases/part_not_part_of.dart.strong.expect
@@ -17,7 +17,7 @@
 
 library;
 import self as self2;
-import "./part_not_part_of_lib1.dart" as par;
+import "part_not_part_of_lib1.dart" as par;
 
 import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
 
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect b/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
index a057f8b..b9dac32 100644
--- a/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
 
 library;
 import self as self2;
-import "./part_not_part_of_lib1.dart" as par;
+import "part_not_part_of_lib1.dart" as par;
 
 import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
 
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
index 2355e10..3e521af 100644
--- a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
+++ b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./private_method_tearoff_lib.dart" as pri;
+import "private_method_tearoff_lib.dart" as pri;
 
 import "org-dartlang-testcase:///private_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
index 2355e10..3e521af 100644
--- a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./private_method_tearoff_lib.dart" as pri;
+import "private_method_tearoff_lib.dart" as pri;
 
 import "org-dartlang-testcase:///private_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect
index d1c7b20..dc1a5ae 100644
--- a/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./private_method_tearoff_lib.dart" as pri;
+import "private_method_tearoff_lib.dart" as pri;
 
 import "org-dartlang-testcase:///private_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect b/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect
index cb76ba8..1422ece 100644
--- a/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./private_method_tearoff_lib.dart" as pri;
+import "private_method_tearoff_lib.dart" as pri;
 
 import "org-dartlang-testcase:///private_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
index cb76ba8..1422ece 100644
--- a/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./private_method_tearoff_lib.dart" as pri;
+import "private_method_tearoff_lib.dart" as pri;
 
 import "org-dartlang-testcase:///private_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
index f4aa6fe..4e942b2 100644
--- a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
+++ b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./public_method_tearoff_lib.dart" as pub;
+import "public_method_tearoff_lib.dart" as pub;
 
 import "org-dartlang-testcase:///public_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
index f4aa6fe..4e942b2 100644
--- a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./public_method_tearoff_lib.dart" as pub;
+import "public_method_tearoff_lib.dart" as pub;
 
 import "org-dartlang-testcase:///public_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect
index 2df3cac..7648db6 100644
--- a/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./public_method_tearoff_lib.dart" as pub;
+import "public_method_tearoff_lib.dart" as pub;
 
 import "org-dartlang-testcase:///public_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect b/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect
index a7c45ab..32ce75e 100644
--- a/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./public_method_tearoff_lib.dart" as pub;
+import "public_method_tearoff_lib.dart" as pub;
 
 import "org-dartlang-testcase:///public_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
index a7c45ab..32ce75e 100644
--- a/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./public_method_tearoff_lib.dart" as pub;
+import "public_method_tearoff_lib.dart" as pub;
 
 import "org-dartlang-testcase:///public_method_tearoff_lib.dart";
 
diff --git a/pkg/front_end/testcases/qualified.dart.legacy.expect b/pkg/front_end/testcases/qualified.dart.legacy.expect
index 9abbf6a..bd70509 100644
--- a/pkg/front_end/testcases/qualified.dart.legacy.expect
+++ b/pkg/front_end/testcases/qualified.dart.legacy.expect
@@ -23,7 +23,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
+import "qualified_lib.dart" as lib;
 
 import "org-dartlang-testcase:///qualified_lib.dart" as lib;
 
@@ -73,7 +73,7 @@
 library test.qualified.lib;
 import self as lib;
 import "dart:core" as core;
-import "./qualified.dart" as self;
+import "qualified.dart" as self;
 
 import "org-dartlang-testcase:///qualified.dart" as main;
 
diff --git a/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect b/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
index 6f18b56..df06d18 100644
--- a/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
@@ -23,7 +23,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
+import "qualified_lib.dart" as lib;
 
 import "org-dartlang-testcase:///qualified_lib.dart" as lib;
 
@@ -76,7 +76,7 @@
 library test.qualified.lib;
 import self as lib;
 import "dart:core" as core;
-import "./qualified.dart" as self;
+import "qualified.dart" as self;
 
 import "org-dartlang-testcase:///qualified.dart" as main;
 
diff --git a/pkg/front_end/testcases/qualified.dart.outline.expect b/pkg/front_end/testcases/qualified.dart.outline.expect
index a8b09cd..0fca5f9 100644
--- a/pkg/front_end/testcases/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/qualified.dart.outline.expect
@@ -23,7 +23,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
+import "qualified_lib.dart" as lib;
 
 import "org-dartlang-testcase:///qualified_lib.dart" as lib;
 
@@ -62,7 +62,7 @@
 library test.qualified.lib;
 import self as lib;
 import "dart:core" as core;
-import "./qualified.dart" as self;
+import "qualified.dart" as self;
 
 import "org-dartlang-testcase:///qualified.dart" as main;
 
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index 2844fc6..9bc943f 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -23,7 +23,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
+import "qualified_lib.dart" as lib;
 
 import "org-dartlang-testcase:///qualified_lib.dart" as lib;
 
@@ -73,7 +73,7 @@
 library test.qualified.lib;
 import self as lib;
 import "dart:core" as core;
-import "./qualified.dart" as self;
+import "qualified.dart" as self;
 
 import "org-dartlang-testcase:///qualified.dart" as main;
 
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index 807fc74..197c0d8 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
+import "qualified_lib.dart" as lib;
 
 import "org-dartlang-testcase:///qualified_lib.dart" as lib;
 
@@ -76,7 +76,7 @@
 library test.qualified.lib;
 import self as lib;
 import "dart:core" as core;
-import "./qualified.dart" as self;
+import "qualified.dart" as self;
 
 import "org-dartlang-testcase:///qualified.dart" as main;
 
diff --git a/pkg/front_end/testcases/rasta/export.dart.legacy.expect b/pkg/front_end/testcases/rasta/export.dart.legacy.expect
index 467d2a4..b0410f4 100644
--- a/pkg/front_end/testcases/rasta/export.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/export.dart.legacy.expect
@@ -1,6 +1,6 @@
 library export;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/export.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/export.dart.legacy.transformed.expect
index 467d2a4..b0410f4 100644
--- a/pkg/front_end/testcases/rasta/export.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/export.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library export;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/export.dart.outline.expect b/pkg/front_end/testcases/rasta/export.dart.outline.expect
index 7c8cd4d..2314e9e 100644
--- a/pkg/front_end/testcases/rasta/export.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/export.dart.outline.expect
@@ -1,6 +1,6 @@
 library export;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/export.dart.strong.expect b/pkg/front_end/testcases/rasta/export.dart.strong.expect
index 467d2a4..b0410f4 100644
--- a/pkg/front_end/testcases/rasta/export.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/export.dart.strong.expect
@@ -1,6 +1,6 @@
 library export;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/export.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/export.dart.strong.transformed.expect
index 467d2a4..b0410f4 100644
--- a/pkg/front_end/testcases/rasta/export.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/export.dart.strong.transformed.expect
@@ -1,6 +1,6 @@
 library export;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.legacy.expect b/pkg/front_end/testcases/rasta/import_export.dart.legacy.expect
index 33c77ad..e4794e6 100644
--- a/pkg/front_end/testcases/rasta/import_export.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/import_export.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 
 import "org-dartlang-testcase:///export.dart";
 
@@ -10,7 +10,7 @@
 
 library export;
 import self as self2;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
index 33c77ad..e4794e6 100644
--- a/pkg/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 
 import "org-dartlang-testcase:///export.dart";
 
@@ -10,7 +10,7 @@
 
 library export;
 import self as self2;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.outline.expect b/pkg/front_end/testcases/rasta/import_export.dart.outline.expect
index d1a411b..42bbbc3 100644
--- a/pkg/front_end/testcases/rasta/import_export.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/import_export.dart.outline.expect
@@ -8,7 +8,7 @@
 
 library export;
 import self as self2;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.strong.expect b/pkg/front_end/testcases/rasta/import_export.dart.strong.expect
index 33c77ad..e4794e6 100644
--- a/pkg/front_end/testcases/rasta/import_export.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/import_export.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 
 import "org-dartlang-testcase:///export.dart";
 
@@ -10,7 +10,7 @@
 
 library export;
 import self as self2;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/import_export.dart.strong.transformed.expect
index 33c77ad..e4794e6 100644
--- a/pkg/front_end/testcases/rasta/import_export.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/import_export.dart.strong.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 
 import "org-dartlang-testcase:///export.dart";
 
@@ -10,7 +10,7 @@
 
 library export;
 import self as self2;
-import "./foo.dart" as foo;
+import "foo.dart" as foo;
 additionalExports = (foo::foo)
 
 
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
index a4ac799..0a16b0d 100644
--- a/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
index a4ac799..0a16b0d 100644
--- a/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.expect
index a4ac799..0a16b0d 100644
--- a/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
index 52df70f..601cdae 100644
--- a/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./deferred_lib.dart" as def;
+import "deferred_lib.dart" as def;
 
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
index be09171..bbd2127 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./mixin_library.dart" as mix;
+import "mixin_library.dart" as mix;
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
index 3c31738..90e3685 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./mixin_library.dart" as mix;
+import "mixin_library.dart" as mix;
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
index 64b6bb0..f8efb4c 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./mixin_library.dart" as mix;
+import "mixin_library.dart" as mix;
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
index 5ecf3b5..aba8974 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./mixin_library.dart" as mix;
+import "mixin_library.dart" as mix;
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
index b75366e..16fd29e 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./issue_34291_lib.dart" as iss;
+import "issue_34291_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
index b75366e..16fd29e 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./issue_34291_lib.dart" as iss;
+import "issue_34291_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
index a72a23c..7e0d3a3 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
@@ -1,7 +1,7 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "./issue_34291_lib.dart" as iss;
+import "issue_34291_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
index 4bc0e99..6411f4c 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
@@ -84,7 +84,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./issue_34403_lib.dart" as iss;
+import "issue_34403_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34403_lib.dart" as p;
 
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
index 4bc0e99..6411f4c 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
@@ -84,7 +84,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./issue_34403_lib.dart" as iss;
+import "issue_34403_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34403_lib.dart" as p;
 
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect
index 67776e6..ae029a9 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect
@@ -84,7 +84,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./issue_34403_lib.dart" as iss;
+import "issue_34403_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34403_lib.dart" as p;
 
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
index 67776e6..ae029a9 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
@@ -84,7 +84,7 @@
 //
 import self as self;
 import "dart:core" as core;
-import "./issue_34403_lib.dart" as iss;
+import "issue_34403_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue_34403_lib.dart" as p;
 
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 76c12be..d64034e 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -139,7 +139,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 23;
+  UInt32 formatVersion = 25;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
   UriSource sourceMap;
@@ -238,8 +238,11 @@
   List<Field> fields;
   List<Procedure> procedures;
 
+  List<UInt> sourceReferences; // list of sources owned by library, indexes into UriSource on Component.
+
   // Library index. Offsets are used to get start (inclusive) and end (exclusive) byte positions for
   // a specific class or procedure. Note the "+1" to account for needing the end of the last entry.
+  UInt32 sourceReferencesOffset;
   UInt32[classes.length + 1] classOffsets;
   UInt32 classCount = classes.length;
   UInt32[procedures.length + 1] procedureOffsets;
@@ -901,6 +904,13 @@
 }
 
 type ConstantExpression extends Expression {
+  Byte tag = 106;
+  FileOffset fileOffset;
+  DartType type;
+  ConstantReference constantReference;
+}
+
+type Deprecated_ConstantExpression extends Expression {
   Byte tag = 107;
   ConstantReference constantReference;
 }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 140a9e4..f8709b7 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -661,6 +661,10 @@
     annotations.add(node);
     node.parent = this;
   }
+
+  Location _getLocationInEnclosingFile(int offset) {
+    return _getLocationInComponent(enclosingComponent, fileUri, offset);
+  }
 }
 
 /// The degree to which the contents of a class have been loaded into memory.
@@ -3756,22 +3760,25 @@
 
 class ConstantExpression extends Expression {
   Constant constant;
+  DartType type;
 
-  ConstantExpression(this.constant) {
+  ConstantExpression(this.constant, [this.type = const DynamicType()]) {
     assert(constant != null);
   }
 
-  DartType getStaticType(TypeEnvironment types) => constant.getType(types);
+  DartType getStaticType(TypeEnvironment types) => type;
 
   accept(ExpressionVisitor v) => v.visitConstantExpression(this);
   accept1(ExpressionVisitor1 v, arg) => v.visitConstantExpression(this, arg);
 
   visitChildren(Visitor v) {
     constant?.acceptReference(v);
+    type?.accept(v);
   }
 
   transformChildren(Transformer v) {
     constant = v.visitConstant(constant);
+    type = v.visitDartType(type);
   }
 }
 
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index ad088c0..6526e31 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1656,7 +1656,10 @@
         var typeArguments = readDartTypeList();
         return new Instantiation(expression, typeArguments);
       case Tag.ConstantExpression:
-        return new ConstantExpression(readConstantReference());
+        int offset = readOffset();
+        DartType type = readDartType();
+        Constant constant = readConstantReference();
+        return new ConstantExpression(constant, type)..fileOffset = offset;
       default:
         throw fail('unexpected expression tag: $tag');
     }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 2b9baba..4b3434c 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -25,6 +25,7 @@
   final UriIndexer _sourceUriIndexer = new UriIndexer();
   bool _currentlyInNonimplementation = false;
   final List<bool> _sourcesFromRealImplementation = new List<bool>();
+  final List<bool> _sourcesFromRealImplementationInLibrary = new List<bool>();
   Map<LibraryDependency, int> _libraryDependencyIndex =
       <LibraryDependency, int>{};
 
@@ -263,16 +264,19 @@
   }
 
   // Returns the new active file uri.
-  Uri writeUriReference(Uri uri) {
+  void writeUriReference(Uri uri) {
     final int index = _sourceUriIndexer.put(uri);
     writeUInt30(index);
     if (!_currentlyInNonimplementation) {
+      if (_sourcesFromRealImplementationInLibrary.length <= index) {
+        _sourcesFromRealImplementationInLibrary.length = index + 1;
+      }
+      _sourcesFromRealImplementationInLibrary[index] = true;
       if (_sourcesFromRealImplementation.length <= index) {
         _sourcesFromRealImplementation.length = index + 1;
       }
       _sourcesFromRealImplementation[index] = true;
     }
-    return uri;
   }
 
   void writeList<T>(List<T> items, void writeItem(T x)) {
@@ -921,7 +925,26 @@
     writeProcedureNodeList(node.procedures);
     procedureOffsets.add(getBufferOffset());
 
+    // Dump all source-references used in this library; used by the VM.
+    int sourceReferencesOffset = getBufferOffset();
+    int sourceReferencesCount = 0;
+    // Note: We start at 1 because 0 is the null-entry and we don't want to
+    // include that.
+    for (int i = 1; i < _sourcesFromRealImplementationInLibrary.length; i++) {
+      if (_sourcesFromRealImplementationInLibrary[i] == true) {
+        sourceReferencesCount++;
+      }
+    }
+    writeUInt30(sourceReferencesCount);
+    for (int i = 1; i < _sourcesFromRealImplementationInLibrary.length; i++) {
+      if (_sourcesFromRealImplementationInLibrary[i] == true) {
+        writeUInt30(i);
+        _sourcesFromRealImplementationInLibrary[i] = false;
+      }
+    }
+
     // Fixed-size ints at the end used as an index.
+    writeUInt32(sourceReferencesOffset);
     assert(classOffsets.length > 0);
     for (int i = 0; i < classOffsets.length; ++i) {
       int offset = classOffsets[i];
@@ -1758,6 +1781,8 @@
   @override
   void visitConstantExpression(ConstantExpression node) {
     writeByte(Tag.ConstantExpression);
+    writeOffset(node.fileOffset);
+    writeDartType(node.type);
     writeConstantReference(node.constant);
   }
 
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 42200e1..8e52b70 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -122,7 +122,10 @@
   static const int ClassReference = 100;
   static const int MemberReference = 101;
 
-  static const int ConstantExpression = 107;
+  static const int ConstantExpression = 106;
+
+  // Tag is deprecated since version 24.
+  static const int Deprecated_ConstantExpression = 107;
 
   /// 108 is occupied by [RedirectingFactoryConstructor] (member).
   /// 109 is occupied by [SetLiteral] (expression).
@@ -147,7 +150,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 23;
+  static const int BinaryFormatVersion = 25;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index fd3bb4d..d5f1940 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -276,7 +276,8 @@
   }
 
   visitConstantExpression(ConstantExpression node) {
-    return new ConstantExpression(visitConstant(node.constant));
+    return new ConstantExpression(
+        visitConstant(node.constant), visitType(node.type));
   }
 
   visitStringLiteral(StringLiteral node) {
diff --git a/pkg/kernel/lib/import_table.dart b/pkg/kernel/lib/import_table.dart
index ae2829c..f549933 100644
--- a/pkg/kernel/lib/import_table.dart
+++ b/pkg/kernel/lib/import_table.dart
@@ -4,7 +4,6 @@
 library kernel.import_table;
 
 import 'ast.dart';
-import 'package:path/path.dart' as path;
 
 abstract class ImportTable {
   int getImportIndex(Library library);
@@ -89,12 +88,8 @@
     bool isTargetSchemeFileOrCustom = isFileOrCustomScheme(targetUri);
     bool isReferenceSchemeFileOrCustom = isFileOrCustomScheme(referenceUri);
     if (isTargetSchemeFileOrCustom && isReferenceSchemeFileOrCustom) {
-      var targetDirectory = path.dirname(targetUri.path);
-      var currentDirectory = path.dirname(referenceUri.path);
-      var relativeDirectory =
-          path.relative(targetDirectory, from: currentDirectory);
-      var filename = path.basename(targetUri.path);
-      table.addImport(target, '$relativeDirectory/$filename');
+      String relativeUri = relativeUriPath(targetUri, referenceUri);
+      table.addImport(target, relativeUri);
     } else if (isTargetSchemeFileOrCustom) {
       // Cannot import a file:URI from a dart:URI or package:URI.
       // We may want to remove this restriction, but for now it's just a sanity
@@ -126,3 +121,36 @@
     }
   }
 }
+
+String relativeUriPath(Uri target, Uri ref) {
+  List<String> targetSegments = target.pathSegments;
+  List<String> refSegments = ref.pathSegments;
+  int to = refSegments.length;
+  if (targetSegments.length < to) to = targetSegments.length;
+  to--; // The last entry is the filename, here we compare only directories.
+  int same = -1;
+  for (int i = 0; i < to; i++) {
+    if (targetSegments[i] == refSegments[i]) {
+      same = i;
+    } else {
+      break;
+    }
+  }
+  if (same == targetSegments.length - 2 &&
+      targetSegments.length == refSegments.length) {
+    // Both parts have the same number of segments,
+    // and they agree on all directories.
+    if (targetSegments.last == "") return ".";
+    return targetSegments.last;
+  }
+  List<String> path = new List<String>();
+  int oked = same + 1;
+  while (oked < refSegments.length - 1) {
+    path.add("..");
+    oked++;
+  }
+  path.addAll(targetSegments.skip(same + 1));
+
+  if (path.isEmpty) path.add(".");
+  return path.join("/");
+}
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index a78a3ab..b599cdf 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -747,7 +747,8 @@
           new VariableGet(iteratorVariable),
           new Name('moveNext'),
           new Arguments(<Expression>[]),
-          helper.streamIteratorMoveNext));
+          helper.streamIteratorMoveNext))
+        ..fileOffset = stmt.fileOffset;
 
       // _asyncStarMoveNextHelper(:stream)
       var asyncStarMoveNextCall = new StaticInvocation(
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index f81ec66..8faae52 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -811,6 +811,11 @@
   }
 
   @override
+  visitConstantExpression(ConstantExpression node) {
+    return node.type;
+  }
+
+  @override
   visitAssertStatement(AssertStatement node) {
     visitExpression(node.condition);
     if (node.message != null) {
@@ -1034,11 +1039,4 @@
 
   @override
   visitInvalidInitializer(InvalidInitializer node) {}
-
-  @override
-  visitConstantExpression(ConstantExpression node) {
-    // Without explicitly running the "constants" transformation, we should
-    // never get here!
-    throw 'unreachable';
-  }
 }
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index d9d4a46..3cbab2e 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -8,14 +8,9 @@
 environment:
   sdk: '>=2.0.0-dev.48.0 <3.0.0'
 dependencies:
-  path: ^1.3.9
   args: '>=0.13.4 <2.0.0'
 dev_dependencies:
-  expect:
-    path: ../expect
-  front_end:
-    path: ../front_end
-  test:
-    path: ../../third_party/pkg/test
-  testing:
-    path: ../testing
+  expect: any
+  front_end: any
+  test: any
+  testing: any
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index c195192..469b603 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -111,7 +111,7 @@
     _assertLibraryText(libWithB, '''
 library test_b;
 import self as self;
-import "./test.dart" as test;
+import "test.dart" as test;
 
 class B extends test::A {}
 ''');
diff --git a/pkg/kernel/test/import_table_test.dart b/pkg/kernel/test/import_table_test.dart
new file mode 100644
index 0000000..d02207f
--- /dev/null
+++ b/pkg/kernel/test/import_table_test.dart
@@ -0,0 +1,35 @@
+import 'package:kernel/import_table.dart';
+
+main() {
+  List<String> paths = new List<String>();
+  paths.add("file://");
+  paths.add("file:///a");
+  paths.add("file:///a/b");
+  paths.add("file:///a/b/c");
+
+  int end = paths.length;
+  for (int i = 0; i < end; i++) {
+    paths.add(paths[i] + "/d.dart");
+    paths.add(paths[i] + "/e.dart");
+    paths.add(paths[i] + "/");
+  }
+  paths[0] = "file:///";
+  paths.sort();
+  for (int i = 0; i < paths.length; i++) {
+    for (int j = 0; j < paths.length; j++) {
+      check(paths[i], paths[j]);
+    }
+  }
+  check("", "");
+}
+
+void check(String target, String ref) {
+  Uri uriTarget = Uri.parse(target);
+  Uri uriRef = Uri.parse(ref);
+  String relative = relativeUriPath(uriTarget, uriRef);
+  if (Uri.base.resolveUri(uriTarget) !=
+      Uri.base.resolveUri(uriRef).resolve(relative)) {
+    throw "Failure on '$target' and '$ref': Got '$relative' which resolves to "
+        "${uriRef.resolve(relative)}";
+  }
+}
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index 0686cd6..cfb843e 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -281,6 +281,11 @@
     emitWord(_encodeAD(Opcode.kInterfaceCall, ra, rd));
   }
 
+  void emitUncheckedInterfaceCall(int ra, int rd) {
+    emitSourcePosition();
+    emitWord(_encodeAD(Opcode.kUncheckedInterfaceCall, ra, rd));
+  }
+
   void emitDynamicCall(int ra, int rd) {
     emitSourcePosition();
     emitWord(_encodeAD(Opcode.kDynamicCall, ra, rd));
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index 8702add..730ee69 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -10,7 +10,7 @@
 /// Before bumping current bytecode version format, make sure that
 /// all users have switched to a VM which is able to consume new
 /// version of bytecode.
-const int currentBytecodeFormatVersion = 4;
+const int currentBytecodeFormatVersion = 6;
 
 /// Version of experimental / bleeding edge bytecode format.
 /// Produced by bytecode generator when --use-future-bytecode-format
@@ -125,6 +125,20 @@
   kDirectCall,
 
   kAllocateClosure,
+
+  kUncheckedInterfaceCall,
+
+  // Double operations.
+  kNegateDouble,
+  kAddDouble,
+  kSubDouble,
+  kMulDouble,
+  kDivDouble,
+  kCompareDoubleEq,
+  kCompareDoubleGt,
+  kCompareDoubleLt,
+  kCompareDoubleGe,
+  kCompareDoubleLe,
 }
 
 enum Encoding {
@@ -304,6 +318,28 @@
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
   Opcode.kAllocateClosure: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kUncheckedInterfaceCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kNegateDouble: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kAddDouble: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kSubDouble: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kMulDouble: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kDivDouble: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareDoubleEq: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareDoubleGt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareDoubleLt: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareDoubleGe: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+  Opcode.kCompareDoubleLe: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
 };
 
 // Should match constant in runtime/vm/stack_frame_dbc.h.
@@ -322,6 +358,7 @@
   switch (opcode) {
     case Opcode.kIndirectStaticCall:
     case Opcode.kInterfaceCall:
+    case Opcode.kUncheckedInterfaceCall:
     case Opcode.kDynamicCall:
     case Opcode.kNativeCall:
     case Opcode.kDirectCall:
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 0e54ba3..f8ae346 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -33,7 +33,8 @@
         getDefaultFunctionTypeArguments,
         getInstantiatorTypeArguments,
         hasFreeTypeParameters,
-        hasInstantiatorTypeArguments;
+        hasInstantiatorTypeArguments,
+        isUncheckedCall;
 import 'local_vars.dart' show LocalVariables;
 import 'nullability_detector.dart' show NullabilityDetector;
 import 'object_table.dart' show ObjectHandle, ObjectTable, NameAndType;
@@ -2252,6 +2253,7 @@
         break;
 
       case Opcode.kNegateInt:
+      case Opcode.kNegateDouble:
         _generateNode(node.receiver);
         break;
 
@@ -2270,6 +2272,15 @@
       case Opcode.kCompareIntLt:
       case Opcode.kCompareIntGe:
       case Opcode.kCompareIntLe:
+      case Opcode.kAddDouble:
+      case Opcode.kSubDouble:
+      case Opcode.kMulDouble:
+      case Opcode.kDivDouble:
+      case Opcode.kCompareDoubleEq:
+      case Opcode.kCompareDoubleGt:
+      case Opcode.kCompareDoubleLt:
+      case Opcode.kCompareDoubleGe:
+      case Opcode.kCompareDoubleLe:
         _generateNode(node.receiver);
         _generateNode(node.arguments.positional.single);
         break;
@@ -2281,9 +2292,13 @@
     asm.emitBytecode0(opcode);
   }
 
-  void _genInstanceCall(int totalArgCount, int callCpIndex, bool isDynamic) {
+  void _genInstanceCall(
+      int totalArgCount, int callCpIndex, bool isDynamic, bool isUnchecked) {
     if (isDynamic) {
+      assert(!isUnchecked);
       asm.emitDynamicCall(totalArgCount, callCpIndex);
+    } else if (isUnchecked) {
+      asm.emitUncheckedInterfaceCall(totalArgCount, callCpIndex);
     } else {
       asm.emitInterfaceCall(totalArgCount, callCpIndex);
     }
@@ -2305,6 +2320,8 @@
       interfaceTarget = null;
     }
     final isDynamic = interfaceTarget == null;
+    final isUnchecked =
+        isUncheckedCall(interfaceTarget, node.receiver, typeEnvironment);
     _genArguments(node.receiver, args);
     final argDesc =
         objectTable.getArgDescHandleByArguments(args, hasReceiver: true);
@@ -2314,7 +2331,7 @@
         args.named.length +
         1 /* receiver */ +
         (args.types.isNotEmpty ? 1 : 0) /* type arguments */;
-    _genInstanceCall(totalArgCount, callCpIndex, isDynamic);
+    _genInstanceCall(totalArgCount, callCpIndex, isDynamic, isUnchecked);
   }
 
   @override
@@ -2324,7 +2341,7 @@
     final argDesc = objectTable.getArgDescHandle(1);
     final callCpIndex = cp.addInstanceCall(
         InvocationKind.getter, node.interfaceTarget, node.name, argDesc);
-    _genInstanceCall(1, callCpIndex, isDynamic);
+    _genInstanceCall(1, callCpIndex, isDynamic, /*isUnchecked=*/ false);
   }
 
   @override
@@ -2340,10 +2357,12 @@
     }
 
     final isDynamic = node.interfaceTarget == null;
+    final isUnchecked =
+        isUncheckedCall(node.interfaceTarget, node.receiver, typeEnvironment);
     final argDesc = objectTable.getArgDescHandle(2);
     final callCpIndex = cp.addInstanceCall(
         InvocationKind.setter, node.interfaceTarget, node.name, argDesc);
-    _genInstanceCall(2, callCpIndex, isDynamic);
+    _genInstanceCall(2, callCpIndex, isDynamic, isUnchecked);
     asm.emitDrop1();
 
     if (hasResult) {
diff --git a/pkg/vm/lib/bytecode/generics.dart b/pkg/vm/lib/bytecode/generics.dart
index 9382da6..4e795d6 100644
--- a/pkg/vm/lib/bytecode/generics.dart
+++ b/pkg/vm/lib/bytecode/generics.dart
@@ -7,7 +7,9 @@
 import 'dart:math' show min;
 
 import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
 bool hasInstantiatorTypeArguments(Class c) {
   for (; c != null; c = c.superclass) {
@@ -236,3 +238,81 @@
     visit(node.returnType);
   }
 }
+
+/// Returns static type of [expr].
+DartType getStaticType(Expression expr, TypeEnvironment typeEnvironment) {
+  // TODO(dartbug.com/34496): Remove this try/catch once
+  // getStaticType() is reliable.
+  try {
+    return expr.getStaticType(typeEnvironment);
+  } catch (e) {
+    return const DynamicType();
+  }
+}
+
+/// Returns `true` if [type] cannot be extended in user code.
+bool isSealedType(DartType type, CoreTypes coreTypes) {
+  if (type is InterfaceType) {
+    final cls = type.classNode;
+    return cls == coreTypes.intClass ||
+        cls == coreTypes.doubleClass ||
+        cls == coreTypes.boolClass ||
+        cls == coreTypes.stringClass ||
+        cls == coreTypes.nullClass;
+  }
+  return false;
+}
+
+// Returns true if an instance call to [interfaceTarget] with given
+// [receiver] can omit argument type checks needed due to generic-covariant
+// parameters.
+bool isUncheckedCall(Member interfaceTarget, Expression receiver,
+    TypeEnvironment typeEnvironment) {
+  if (interfaceTarget == null) {
+    // Dynamic call cannot be unchecked.
+    return false;
+  }
+
+  if (!_hasGenericCovariantParameters(interfaceTarget)) {
+    // Unchecked call makes sense only if there are generic-covariant parameters.
+    return false;
+  }
+
+  // Calls via [this] do not require checks.
+  if (receiver is ThisExpression) {
+    return true;
+  }
+
+  DartType receiverStaticType = getStaticType(receiver, typeEnvironment);
+  if (receiverStaticType is InterfaceType) {
+    if (receiverStaticType.typeArguments.isEmpty) {
+      return true;
+    }
+
+    if (receiverStaticType.typeArguments
+        .every((t) => isSealedType(t, typeEnvironment.coreTypes))) {
+      return true;
+    }
+  }
+  return false;
+}
+
+bool _hasGenericCovariantParameters(Member target) {
+  if (target is Field) {
+    return target.isGenericCovariantImpl;
+  } else if (target is Procedure) {
+    for (var param in target.function.positionalParameters) {
+      if (param.isGenericCovariantImpl) {
+        return true;
+      }
+    }
+    for (var param in target.function.namedParameters) {
+      if (param.isGenericCovariantImpl) {
+        return true;
+      }
+    }
+    return false;
+  } else {
+    throw 'Unexpected instance call target ${target.runtimeType} $target';
+  }
+}
diff --git a/pkg/vm/lib/bytecode/nullability_detector.dart b/pkg/vm/lib/bytecode/nullability_detector.dart
index 961dfef..414807b 100644
--- a/pkg/vm/lib/bytecode/nullability_detector.dart
+++ b/pkg/vm/lib/bytecode/nullability_detector.dart
@@ -129,4 +129,14 @@
   Opcode.kCompareIntLt,
   Opcode.kCompareIntGe,
   Opcode.kCompareIntLe,
+  Opcode.kNegateDouble,
+  Opcode.kAddDouble,
+  Opcode.kSubDouble,
+  Opcode.kMulDouble,
+  Opcode.kDivDouble,
+  Opcode.kCompareDoubleEq,
+  Opcode.kCompareDoubleGt,
+  Opcode.kCompareDoubleLt,
+  Opcode.kCompareDoubleGe,
+  Opcode.kCompareDoubleLe,
 ]);
diff --git a/pkg/vm/lib/bytecode/recognized_methods.dart b/pkg/vm/lib/bytecode/recognized_methods.dart
index b658fdf..6b776cc 100644
--- a/pkg/vm/lib/bytecode/recognized_methods.dart
+++ b/pkg/vm/lib/bytecode/recognized_methods.dart
@@ -8,6 +8,7 @@
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
 import 'dbc.dart';
+import 'generics.dart' show getStaticType;
 
 class RecognizedMethods {
   static const binaryIntOps = <String, Opcode>{
@@ -28,21 +29,27 @@
     '<=': Opcode.kCompareIntLe,
   };
 
+  static const binaryDoubleOps = <String, Opcode>{
+    '+': Opcode.kAddDouble,
+    '-': Opcode.kSubDouble,
+    '*': Opcode.kMulDouble,
+    '/': Opcode.kDivDouble,
+    '==': Opcode.kCompareDoubleEq,
+    '>': Opcode.kCompareDoubleGt,
+    '<': Opcode.kCompareDoubleLt,
+    '>=': Opcode.kCompareDoubleGe,
+    '<=': Opcode.kCompareDoubleLe,
+  };
+
   final TypeEnvironment typeEnv;
 
   RecognizedMethods(this.typeEnv);
 
-  DartType staticType(Expression expr) {
-    // TODO(dartbug.com/34496): Remove this ugly try/catch once
-    // getStaticType() is reliable.
-    try {
-      return expr.getStaticType(typeEnv);
-    } catch (e) {
-      return const DynamicType();
-    }
-  }
+  DartType staticType(Expression expr) => getStaticType(expr, typeEnv);
 
-  bool isInt(Expression expr) => staticType(expr) == typeEnv.intType;
+  bool isInt(DartType type) => type == typeEnv.intType;
+
+  bool isDouble(DartType type) => type == typeEnv.doubleType;
 
   Opcode specializedBytecodeFor(MethodInvocation node) {
     final args = node.arguments;
@@ -65,8 +72,13 @@
   }
 
   Opcode specializedBytecodeForUnaryOp(String selector, Expression arg) {
-    if (selector == 'unary-' && isInt(arg)) {
-      return Opcode.kNegateInt;
+    if (selector == 'unary-') {
+      final argType = staticType(arg);
+      if (isInt(argType)) {
+        return Opcode.kNegateInt;
+      } else if (isDouble(argType)) {
+        return Opcode.kNegateDouble;
+      }
     }
 
     return null;
@@ -78,10 +90,15 @@
       return Opcode.kEqualsNull;
     }
 
-    if (isInt(a) && isInt(b)) {
+    final aType = staticType(a);
+    final bType = staticType(b);
+
+    if (isInt(aType) && isInt(bType)) {
       return binaryIntOps[selector];
     }
-
+    if (isDouble(aType) && isDouble(bType)) {
+      return binaryDoubleOps[selector];
+    }
     return null;
   }
 }
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index ecd0c8e..6685160 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -34,6 +34,7 @@
         convertFileOrUriArgumentToUri,
         createFrontEndTarget,
         createFrontEndFileSystem,
+        setVMEnvironmentDefines,
         writeDepfile;
 
 ArgParser argParser = new ArgParser(allowTrailingOptions: true)
@@ -331,6 +332,8 @@
     Component component;
     if (options['incremental']) {
       _compilerOptions = compilerOptions;
+      setVMEnvironmentDefines(environmentDefines, _compilerOptions);
+
       _compilerOptions.omitPlatform = false;
       _generator =
           generator ?? _createGenerator(new Uri.file(_initializeFromDill));
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index dfc4b67..452e2ca 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -297,28 +297,7 @@
       new ErrorDetector(previousErrorHandler: options.onDiagnostic);
   options.onDiagnostic = errorDetector;
 
-  // TODO(alexmarkov): move this logic into VmTarget and call from front-end
-  // in order to have the same defines when compiling platform.
-  assert(environmentDefines != null);
-  if (environmentDefines['dart.vm.product'] == 'true') {
-    environmentDefines['dart.developer.causal_async_stacks'] = 'false';
-  }
-  environmentDefines['dart.isVM'] = 'true';
-  // TODO(dartbug.com/36460): Derive dart.library.* definitions from platform.
-  for (String library in options.target.extraRequiredLibraries) {
-    Uri libraryUri = Uri.parse(library);
-    if (libraryUri.scheme == 'dart') {
-      final path = libraryUri.path;
-      if (!path.startsWith('_')) {
-        environmentDefines['dart.library.${path}'] = 'true';
-      }
-    }
-  }
-  // dart:core is not mentioned in Target.extraRequiredLibraries.
-  environmentDefines['dart.library.core'] = 'true';
-
-  options.environmentDefines = environmentDefines;
-
+  setVMEnvironmentDefines(environmentDefines, options);
   final component = await kernelForProgram(source, options);
 
   // Run global transformations only if component is correct.
@@ -355,6 +334,30 @@
   return component;
 }
 
+void setVMEnvironmentDefines(
+    Map<String, dynamic> environmentDefines, CompilerOptions options) {
+  // TODO(alexmarkov): move this logic into VmTarget and call from front-end
+  // in order to have the same defines when compiling platform.
+  assert(environmentDefines != null);
+  if (environmentDefines['dart.vm.product'] == 'true') {
+    environmentDefines['dart.developer.causal_async_stacks'] = 'false';
+  }
+  environmentDefines['dart.isVM'] = 'true';
+  // TODO(dartbug.com/36460): Derive dart.library.* definitions from platform.
+  for (String library in options.target.extraRequiredLibraries) {
+    Uri libraryUri = Uri.parse(library);
+    if (libraryUri.scheme == 'dart') {
+      final path = libraryUri.path;
+      if (!path.startsWith('_')) {
+        environmentDefines['dart.library.${path}'] = 'true';
+      }
+    }
+  }
+  // dart:core is not mentioned in Target.extraRequiredLibraries.
+  environmentDefines['dart.library.core'] = 'true';
+  options.environmentDefines = environmentDefines;
+}
+
 Future _runGlobalTransformations(
     Uri source,
     CompilerOptions compilerOptions,
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index ff3431b..0fa7432 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -50,10 +50,14 @@
     if (annotation is ConstantExpression) {
       Constant constant = annotation.constant;
       if (constant is InstanceConstant) {
-        if (constant.classReference.node == coreTypes.pragmaClass) {
+        if (constant.classNode == coreTypes.pragmaClass) {
           pragmaConstant = constant;
         }
+      } else if (constant is UnevaluatedConstant) {
+        throw 'Error: unevaluated constant $constant';
       }
+    } else {
+      throw 'Error: non-constant annotation $annotation';
     }
     if (pragmaConstant == null) return null;
 
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index ff23f2f..9a496a8 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -19,7 +19,11 @@
 
 import 'package:vm/target/vm.dart' show VmTarget;
 
-const bool kDumpActualResult = const bool.fromEnvironment('dump.actual.result');
+/// Environment define to update expectation files on failures.
+const kUpdateExpectations = 'updateExpectations';
+
+/// Environment define to dump actual results alongside expectations.
+const kDumpActualResult = 'dump.actual.result';
 
 class TestingVmTarget extends VmTarget {
   TestingVmTarget(TargetFlags flags) : super(flags);
@@ -37,6 +41,7 @@
   final options = new CompilerOptions()
     ..target = target
     ..linkedDependencies = <Uri>[platformKernel]
+    ..environmentDefines = <String, String>{}
     ..onDiagnostic = (DiagnosticMessage message) {
       fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
     };
@@ -81,14 +86,62 @@
   new BinaryPrinter(new DevNullSink<List<int>>()).writeComponentFile(component);
 }
 
+class Difference {
+  final int line;
+  final String actual;
+  final String expected;
+
+  Difference(this.line, this.actual, this.expected);
+}
+
+Difference findFirstDifference(String actual, String expected) {
+  final actualLines = actual.split('\n');
+  final expectedLines = expected.split('\n');
+  int i = 0;
+  for (; i < actualLines.length && i < expectedLines.length; ++i) {
+    if (actualLines[i] != expectedLines[i]) {
+      return new Difference(i + 1, actualLines[i], expectedLines[i]);
+    }
+  }
+  return new Difference(
+      i + 1,
+      i < actualLines.length ? actualLines[i] : '<END>',
+      i < expectedLines.length ? expectedLines[i] : '<END>');
+}
+
 void compareResultWithExpectationsFile(Uri source, String actual) {
   final expectFile = new File(source.toFilePath() + '.expect');
   final expected = expectFile.existsSync() ? expectFile.readAsStringSync() : '';
 
   if (actual != expected) {
-    if (kDumpActualResult) {
-      new File(source.toFilePath() + '.actual').writeAsStringSync(actual);
+    if (bool.fromEnvironment(kUpdateExpectations)) {
+      expectFile.writeAsStringSync(actual);
+      print("  Updated $expectFile");
+    } else {
+      if (bool.fromEnvironment(kDumpActualResult)) {
+        new File(source.toFilePath() + '.actual').writeAsStringSync(actual);
+      }
+      Difference diff = findFirstDifference(actual, expected);
+      fail("""
+
+Result is different for the test case $source
+
+The first difference is at line ${diff.line}.
+Actual:   ${diff.actual}
+Expected: ${diff.expected}
+
+This failure can be caused by changes in the front-end if it starts generating
+different kernel AST for the same Dart programs.
+
+In order to re-generate expectations run tests with -D$kUpdateExpectations=true VM option:
+
+  tools/test.py -m release --vm-options -D$kUpdateExpectations=true pkg/vm
+
+In order to dump actual results into .actual files run tests with -D$kDumpActualResult=true VM option:
+
+  tools/test.py -m release --vm-options -D$kDumpActualResult=true pkg/vm
+
+""");
     }
-    expect(actual, equals(expected), reason: "Test case: $source");
   }
 }
diff --git a/pkg/vm/test/frontend_server_flutter.dart b/pkg/vm/test/frontend_server_flutter.dart
new file mode 100644
index 0000000..be1ee67
--- /dev/null
+++ b/pkg/vm/test/frontend_server_flutter.dart
@@ -0,0 +1,251 @@
+import 'dart:async' show StreamController;
+import 'dart:convert' show utf8, LineSplitter;
+import 'dart:io' show Directory, File, FileSystemEntity, IOSink, stdout;
+
+import 'package:kernel/ast.dart' show Component;
+import 'package:kernel/kernel.dart' show loadComponentFromBytes;
+import 'package:kernel/verifier.dart' show verifyComponent;
+
+import '../lib/frontend_server.dart';
+
+main(List<String> args) async {
+  String flutterDir;
+  String flutterPlatformDir;
+  for (String arg in args) {
+    if (arg.startsWith("--flutterDir=")) {
+      flutterDir = arg.substring(13);
+    } else if (arg.startsWith("--flutterPlatformDir=")) {
+      flutterPlatformDir = arg.substring(21);
+    }
+  }
+  if (flutterDir == null || !(new Directory(flutterDir).existsSync())) {
+    throw "Didn't get a valid flutter directory to work with.";
+  }
+  Directory flutterDirectory = new Directory(flutterDir);
+  List<FileSystemEntity> allFlutterFiles =
+      flutterDirectory.listSync(recursive: true, followLinks: false);
+  Directory flutterPlatformDirectory;
+  if (flutterPlatformDir == null) {
+    List<File> platformFiles = new List<File>.from(allFlutterFiles.where((f) =>
+        f.uri
+            .toString()
+            .endsWith("/flutter_patched_sdk/platform_strong.dill")));
+    if (platformFiles.length < 1) {
+      throw "Expected to find a flutter platform file but didn't.";
+    }
+    flutterPlatformDirectory = platformFiles.first.parent;
+  } else {
+    flutterPlatformDirectory = Directory(flutterPlatformDir);
+  }
+  if (!flutterPlatformDirectory.existsSync()) {
+    throw "$flutterPlatformDirectory doesn't exist.";
+  }
+  if (!new File.fromUri(
+          flutterPlatformDirectory.uri.resolve("platform_strong.dill"))
+      .existsSync()) {
+    throw "$flutterPlatformDirectory doesn't contain a "
+        "platform_strong.dill file.";
+  }
+  print("Using $flutterPlatformDirectory as platform directory.");
+  List<File> dotPackagesFiles = new List<File>.from(allFlutterFiles.where((f) =>
+      (f.uri.toString().contains("/examples/") ||
+          f.uri.toString().contains("/packages/")) &&
+      f.uri.toString().endsWith("/.packages")));
+
+  for (File dotPackage in dotPackagesFiles) {
+    Directory tempDir;
+    Directory systemTempDir = Directory.systemTemp;
+    tempDir = systemTempDir.createTempSync('foo bar');
+    try {
+      Directory testDir =
+          new Directory.fromUri(dotPackage.parent.uri.resolve("test/"));
+      if (!testDir.existsSync()) continue;
+      print("Go for $testDir");
+      await attemptStuff(
+          tempDir, flutterPlatformDirectory, dotPackage, testDir);
+    } finally {
+      tempDir.delete(recursive: true);
+    }
+  }
+}
+
+void attemptStuff(Directory tempDir, Directory flutterPlatformDirectory,
+    File dotPackage, Directory testDir) async {
+  File dillFile = new File('${tempDir.path}/dill.dill');
+  if (dillFile.existsSync()) {
+    throw "$dillFile already exists.";
+  }
+  List<int> platformData = new File.fromUri(
+          flutterPlatformDirectory.uri.resolve("platform_strong.dill"))
+      .readAsBytesSync();
+  final List<String> args = <String>[
+    '--sdk-root',
+    flutterPlatformDirectory.path,
+    '--incremental',
+    '--strong',
+    '--target=flutter',
+    '--packages',
+    dotPackage.path,
+    '--output-dill=${dillFile.path}',
+    // '--unsafe-package-serialization',
+  ];
+
+  List<File> testFiles = new List<File>.from(testDir
+      .listSync(recursive: true)
+      .where((f) => f.path.endsWith("_test.dart")));
+  if (testFiles.isEmpty) return;
+
+  Stopwatch stopwatch = new Stopwatch()..start();
+
+  final StreamController<List<int>> inputStreamController =
+      new StreamController<List<int>>();
+  final StreamController<List<int>> stdoutStreamController =
+      new StreamController<List<int>>();
+  final IOSink ioSink = new IOSink(stdoutStreamController.sink);
+  StreamController<Result> receivedResults = new StreamController<Result>();
+
+  final outputParser = new OutputParser(receivedResults);
+  stdoutStreamController.stream
+      .transform(utf8.decoder)
+      .transform(const LineSplitter())
+      .listen(outputParser.listener);
+
+  Iterator<File> testFileIterator = testFiles.iterator;
+  testFileIterator.moveNext();
+
+  final Future<int> result =
+      starter(args, input: inputStreamController.stream, output: ioSink);
+  String shortTestPath =
+      testFileIterator.current.path.substring(testDir.path.length);
+  stdout.write("    => $shortTestPath");
+  Stopwatch stopwatch2 = new Stopwatch()..start();
+  inputStreamController
+      .add('compile ${testFileIterator.current.path}\n'.codeUnits);
+  int compilations = 0;
+  receivedResults.stream.listen((Result compiledResult) {
+    stdout.write(" --- done in ${stopwatch2.elapsedMilliseconds} ms\n");
+    stopwatch2.reset();
+    compiledResult.expectNoErrors();
+
+    List<int> resultBytes = dillFile.readAsBytesSync();
+    Component component = loadComponentFromBytes(platformData);
+    component = loadComponentFromBytes(resultBytes, component);
+    verifyComponent(component);
+    print("        => verified in ${stopwatch2.elapsedMilliseconds} ms.");
+    stopwatch2.reset();
+
+    inputStreamController.add('accept\n'.codeUnits);
+    inputStreamController.add('reset\n'.codeUnits);
+    compilations++;
+
+    if (!testFileIterator.moveNext()) {
+      inputStreamController.add('quit\n'.codeUnits);
+      return;
+    }
+    String shortTestPath =
+        testFileIterator.current.path.substring(testDir.path.length);
+    stdout.write("    => $shortTestPath");
+    inputStreamController.add('recompile ${testFileIterator.current.path} abc\n'
+            '${testFileIterator.current.uri}\n'
+            'abc\n'
+        .codeUnits);
+  });
+
+  int resultDone = await result;
+  if (resultDone != 0) {
+    throw "Got $resultDone, expected 0";
+  }
+
+  inputStreamController.close();
+
+  print("Did $compilations compilations and verifications in "
+      "${stopwatch.elapsedMilliseconds} ms.");
+}
+
+// The below is copied from incremental_compiler_test.dart,
+// but with expect stuff replaced with ifs and throws
+// (expect can only be used in tests via the test framework).
+
+class OutputParser {
+  OutputParser(this._receivedResults);
+  bool expectSources = true;
+
+  StreamController<Result> _receivedResults;
+  List<String> _receivedSources;
+
+  String _boundaryKey;
+  bool _readingSources;
+
+  void listener(String s) {
+    if (_boundaryKey == null) {
+      const String RESULT_OUTPUT_SPACE = 'result ';
+      if (s.startsWith(RESULT_OUTPUT_SPACE)) {
+        _boundaryKey = s.substring(RESULT_OUTPUT_SPACE.length);
+      }
+      _readingSources = false;
+      _receivedSources?.clear();
+      return;
+    }
+
+    if (s.startsWith(_boundaryKey)) {
+      // First boundaryKey separates compiler output from list of sources
+      // (if we expect list of sources, which is indicated by receivedSources
+      // being not null)
+      if (expectSources && !_readingSources) {
+        _readingSources = true;
+        return;
+      }
+      // Second boundaryKey indicates end of frontend server response
+      expectSources = true;
+      _receivedResults.add(new Result(
+          s.length > _boundaryKey.length
+              ? s.substring(_boundaryKey.length + 1)
+              : null,
+          _receivedSources));
+      _boundaryKey = null;
+    } else {
+      if (_readingSources) {
+        if (_receivedSources == null) {
+          _receivedSources = <String>[];
+        }
+        _receivedSources.add(s);
+      }
+    }
+  }
+}
+
+class Result {
+  String status;
+  List<String> sources;
+
+  Result(this.status, this.sources);
+
+  void expectNoErrors({String filename}) {
+    CompilationResult result = new CompilationResult.parse(status);
+    if (result.errorsCount != 0) {
+      throw "Got ${result.errorsCount} errors. Expected 0.";
+    }
+    if (filename != null) {
+      if (result.filename != filename) {
+        throw "Got ${result.filename} errors. Expected $filename.";
+      }
+    }
+  }
+}
+
+class CompilationResult {
+  String filename;
+  int errorsCount;
+
+  CompilationResult.parse(String filenameAndErrorCount) {
+    if (filenameAndErrorCount == null) {
+      return;
+    }
+    int delim = filenameAndErrorCount.lastIndexOf(' ');
+    if (delim <= 0) {
+      throw "Expected $delim > 0...";
+    }
+    filename = filenameAndErrorCount.substring(0, delim);
+    errorsCount = int.parse(filenameAndErrorCount.substring(delim + 1).trim());
+  }
+}
diff --git a/pkg/vm/test/transformations/type_flow/annotation_matcher.dart b/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
deleted file mode 100644
index 2b7f278..0000000
--- a/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart';
-import 'package:vm/transformations/type_flow/utils.dart';
-import 'package:vm/transformations/pragma.dart';
-
-// Since we don't run the constants transformation in this test, we can't
-// recognize all pragma annotations precisely. Instead, we pattern match on
-// annotations which look like a pragma and assume that their options field
-// evaluates to true.
-class ExpressionPragmaAnnotationParser extends PragmaAnnotationParser {
-  final CoreTypes coreTypes;
-
-  ExpressionPragmaAnnotationParser(this.coreTypes);
-
-  ParsedPragma parsePragma(Expression annotation) {
-    assertx(annotation is! ConstantExpression);
-
-    String pragmaName;
-    Expression options;
-
-    if (annotation is ConstructorInvocation) {
-      if (annotation.constructedType.classNode != coreTypes.pragmaClass) {
-        return null;
-      }
-
-      if (annotation.arguments.types.length != 0 ||
-          (annotation.arguments.positional.length != 1 &&
-              annotation.arguments.positional.length != 2) ||
-          annotation.arguments.named.length != 0) {
-        throw "Cannot evaluate pragma annotation $annotation";
-      }
-
-      var arguments = annotation.arguments.positional;
-      var nameArg = arguments[0];
-      if (nameArg is StringLiteral) {
-        pragmaName = nameArg.value;
-      } else {
-        return null;
-      }
-
-      options = arguments.length > 1 ? arguments[1] : new NullLiteral();
-    }
-
-    switch (pragmaName) {
-      case kEntryPointPragmaName:
-        // We ignore the option because we can't properly evaluate it, assume
-        // it's true.
-        return new ParsedEntryPointPragma(PragmaEntryPointType.Default);
-      case kExactResultTypePragmaName:
-        if (options is TypeLiteral) {
-          return new ParsedResultTypeByTypePragma(options.type);
-        } else if (options is StringLiteral) {
-          return new ParsedResultTypeByPathPragma(options.value);
-        }
-        throw "Could not recognize option to $kExactResultTypePragmaName";
-      default:
-        return null;
-    }
-  }
-}
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index 022c7e1..4ab863b 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -9,10 +9,11 @@
 import 'package:kernel/core_types.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:test/test.dart';
+import 'package:vm/transformations/pragma.dart'
+    show ConstantPragmaAnnotationParser;
 import 'package:vm/transformations/type_flow/native_code.dart';
 import 'package:vm/transformations/type_flow/summary_collector.dart';
 import 'package:vm/transformations/type_flow/analysis.dart';
-import 'annotation_matcher.dart';
 import 'package:kernel/target/targets.dart';
 
 import '../../common_test_utils.dart';
@@ -31,7 +32,7 @@
             hierarchy,
             new EmptyEntryPointsListener(),
             new NativeCodeOracle(
-                null, new ExpressionPragmaAnnotationParser(coreTypes)),
+                null, new ConstantPragmaAnnotationParser(coreTypes)),
             new GenericInterfacesInfoImpl(hierarchy));
 
   String print(TreeNode node) {
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index d031f10..4d1effb 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -11,7 +11,6 @@
 import 'package:test/test.dart';
 import 'package:vm/transformations/type_flow/transformer.dart'
     show transformComponent;
-import 'annotation_matcher.dart';
 
 import '../../common_test_utils.dart';
 
@@ -24,8 +23,7 @@
 
   final coreTypes = new CoreTypes(component);
 
-  component = transformComponent(target, coreTypes, component,
-      new ExpressionPragmaAnnotationParser(coreTypes));
+  component = transformComponent(target, coreTypes, component);
 
   final actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
 
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index a71a37a..fe17198 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -479,11 +479,11 @@
     constructor _() → #lib::_NamespaceImpl
       : super dart.core::Object::•()
       ;
-    @dart._internal::ExternalName::•("Namespace_Create")
+    @#C2
     external static method _create(#lib::_NamespaceImpl namespace, dynamic n) → #lib::_NamespaceImpl;
-    @dart._internal::ExternalName::•("Namespace_GetPointer")
+    @#C4
     external static method _getPointer(#lib::_NamespaceImpl namespace) → dart.core::int;
-    @dart._internal::ExternalName::•("Namespace_GetDefault")
+    @#C6
     external static method _getDefault() → dart.core::int;
     static method _setupNamespace(dynamic namespace) → void {
       #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), namespace);
@@ -823,13 +823,13 @@
   static field dart.core::int _stderrFD = 2;
   static field dart.core::String _rawScript;
   static field #lib::Stdin _stdin;
-  @dart._internal::ExternalName::•("Builtin_PrintString")
+  @#C8
   external static method _printString(dart.core::String s) → void;
   static method _print(dynamic arg) → void {
     #lib::_printString(arg.{dart.core::Object::toString}());
   }
   static method _getPrintClosure() → dynamic
-    return #lib::_print;
+    return #C9;
   static method _setScheduleImmediateClosure((() → void) → void closure) → void {
     #lib::_ScheduleImmediate::_closure = closure;
   }
@@ -847,7 +847,7 @@
     }
   }
   static method _setupHooks() → dynamic {
-    #lib::VMLibraryHooks::platformScript = #lib::_scriptUri;
+    #lib::VMLibraryHooks::platformScript = #C10;
   }
   static get stdin() → #lib::Stdin {
     #lib::_stdin.{dart.core::Object::==}(null) ?{#lib::Stdin} #lib::_stdin = #lib::_StdIOUtils::_getStdioInputStream(#lib::_stdinFD) : null;
@@ -855,3 +855,15 @@
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = "Namespace_Create"
+  #C2 = dart._internal::ExternalName {name: #C1}
+  #C3 = "Namespace_GetPointer"
+  #C4 = dart._internal::ExternalName {name: #C3}
+  #C5 = "Namespace_GetDefault"
+  #C6 = dart._internal::ExternalName {name: #C5}
+  #C7 = "Builtin_PrintString"
+  #C8 = dart._internal::ExternalName {name: #C7}
+  #C9 = TearOffConstant(#lib::_print)
+  #C10 = TearOffConstant(#lib::_scriptUri)
+}
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index b122da6..1a25aa9 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -270,7 +270,7 @@
 ]  class B extends #lib::A {
     field dart.core::int foo6 = 46;
     static field dart.core::int foo7 = 47;
-    static const field dart.core::int foo8 = 48;
+    static const field dart.core::int foo8 = #C1;
     constructor •() → #lib::B
       : super #lib::A::•(49)
       ;
@@ -280,3 +280,6 @@
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 48
+}
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index b79b398..2a98dd2 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -710,7 +710,7 @@
     constructor •(dynamic param) → #lib::I
       : super dart.core::Object::•()
       ;
-    static factory test_factory2({dynamic param = null}) → #lib::I
+    static factory test_factory2({dynamic param = #C1}) → #lib::I
       return new #lib::I::•(param);
   }
 [@vm.bytecode=
@@ -738,7 +738,7 @@
 
 }
 ]  class J extends dart.core::Object {
-    @dart._internal::ExternalName::•("agent_J")
+    @#C3
     external static factory •() → #lib::J;
   }
 [@vm.bytecode=
@@ -835,3 +835,8 @@
     #lib::foo3<dart.core::String>();
   }
 }
+constants  {
+  #C1 = null
+  #C2 = "agent_J"
+  #C3 = dart._internal::ExternalName {name: #C2}
+}
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index bc4b45d..3449af2 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -557,11 +557,11 @@
 ]  class A extends dart.core::Object {
     final field dart.core::int index;
     final field dart.core::String _name;
-    static const field dart.core::List<#lib::A> values = const <#lib::A>[#lib::A::elem1, #lib::A::elem2, #lib::A::elem3, #lib::A::elem4];
-    static const field #lib::A elem1 = const #lib::A::•(0, "A.elem1");
-    static const field #lib::A elem2 = const #lib::A::•(1, "A.elem2");
-    static const field #lib::A elem3 = const #lib::A::•(2, "A.elem3");
-    static const field #lib::A elem4 = const #lib::A::•(3, "A.elem4");
+    static const field dart.core::List<#lib::A> values = #C13;
+    static const field #lib::A elem1 = #C3;
+    static const field #lib::A elem2 = #C6;
+    static const field #lib::A elem3 = #C9;
+    static const field #lib::A elem4 = #C12;
     const constructor •(dart.core::int index, dart.core::String _name) → #lib::A
       : #lib::A::index = index, #lib::A::_name = _name, super dart.core::Object::•()
       ;
@@ -701,7 +701,7 @@
 ]  class D extends dart.core::Object {
     final field dynamic x;
     final field dynamic y;
-    const constructor •(dynamic x, [dynamic y = null]) → #lib::D
+    const constructor •(dynamic x, [dynamic y = #C14]) → #lib::D
       : #lib::D::x = x, #lib::D::y = y, super dart.core::Object::•()
       ;
   }
@@ -769,26 +769,26 @@
       : super #lib::E::•()
       ;
   }
-  static const field #lib::A c1 = #lib::A::elem3;
-  static const field dart.core::String c2 = "hello!";
-  static const field dart.core::int c3 = #lib::c2.{dart.core::String::length};
-  static const field #lib::C c4 = const #lib::C::•(1, 2, 3);
-  static const field #lib::D c5 = const #lib::D::•(const #lib::B::•(4));
+  static const field #lib::A c1 = #C9;
+  static const field dart.core::String c2 = #C15;
+  static const field dart.core::int c3 = #C16;
+  static const field #lib::C c4 = #C18;
+  static const field #lib::D c5 = #C21;
   static field dart.core::double fieldWithDoubleLiteralInitializer = 1.0;
   static method test_constants1() → void {
-    dart.core::print(#lib::c1);
-    dart.core::print(#lib::c2);
-    dart.core::print(#lib::c3);
-    dart.core::print(#lib::c4);
-    dart.core::print(#lib::c5);
+    dart.core::print(#C9);
+    dart.core::print(#C15);
+    dart.core::print(#C16);
+    dart.core::print(#C18);
+    dart.core::print(#C21);
   }
   static method test_constants2() → void {
     dart.core::print(42);
     dart.core::print("foo");
-    dart.core::print(#lib::A::elem2);
-    dart.core::print(const <dart.core::Object>[42, "foo", dart.core::int]);
-    dart.core::print(const <dart.core::String, #lib::A>{"E2": #lib::A::elem2, "E4": #lib::A::elem4});
-    dart.core::print(const #lib::D::•(const #lib::C::•(4, 5, 6), const <dart.core::String, dart.core::Object>{"foo": 42, "bar": const #lib::B::•(#lib::c2.{dart.core::String::length})}));
+    dart.core::print(#C6);
+    dart.core::print(#C25);
+    dart.core::print(#C29);
+    dart.core::print(#C37);
   }
   static method test_list_literal(dart.core::int a) → void {
     dart.core::print(<dart.core::int>[1, a, 3]);
@@ -801,18 +801,60 @@
     dart.core::print(<#lib::test_map_literal::T, dart.core::int>{c: 4});
   }
   static method test_symbol() → void {
-    dart.core::print(#test_symbol);
-    dart.core::print(#_private_symbol);
+    dart.core::print(#C38);
+    dart.core::print(#C39);
   }
   static method test_type_literal<T extends dart.core::Object = dynamic>() → void {
     dart.core::print(dart.core::String);
     dart.core::print(#lib::test_type_literal::T);
   }
   static method testGenericConstInstance() → dynamic
-    return const #lib::F::•<dart.core::int, dart.core::String>();
+    return #C40;
   static method testGenericFunctionTypeLiteral() → dynamic
     return <X extends dart.core::Object = dynamic>(X) → X;
   static method testFieldWithDoubleLiteralInitializer() → dynamic
     return #lib::fieldWithDoubleLiteralInitializer;
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 0
+  #C2 = "A.elem1"
+  #C3 = #lib::A {index: #C1, #lib::_name: #C2}
+  #C4 = 1
+  #C5 = "A.elem2"
+  #C6 = #lib::A {index: #C4, #lib::_name: #C5}
+  #C7 = 2
+  #C8 = "A.elem3"
+  #C9 = #lib::A {index: #C7, #lib::_name: #C8}
+  #C10 = 3
+  #C11 = "A.elem4"
+  #C12 = #lib::A {index: #C10, #lib::_name: #C11}
+  #C13 = ListConstant<#lib::A>(#C3, #C6, #C9, #C12)
+  #C14 = null
+  #C15 = "hello!"
+  #C16 = 6
+  #C17 = 15
+  #C18 = #lib::C {j: #C10, i: #C17}
+  #C19 = 4
+  #C20 = #lib::B {i: #C19}
+  #C21 = #lib::D {x: #C20, y: #C14}
+  #C22 = 42
+  #C23 = "foo"
+  #C24 = TypeLiteralConstant(dart.core::int)
+  #C25 = ListConstant<dart.core::Object>(#C22, #C23, #C24)
+  #C26 = "E2"
+  #C27 = "E4"
+  #C28 = ListConstant<dynamic>(#C26, #C6, #C27, #C12)
+  #C29 = dart.core::_ImmutableMap<dart.core::String, #lib::A> {dart.core::_kvPairs: #C28}
+  #C30 = 9
+  #C31 = 30
+  #C32 = #lib::C {j: #C30, i: #C31}
+  #C33 = "bar"
+  #C34 = #lib::B {i: #C16}
+  #C35 = ListConstant<dynamic>(#C23, #C22, #C33, #C34)
+  #C36 = dart.core::_ImmutableMap<dart.core::String, dart.core::Object> {dart.core::_kvPairs: #C35}
+  #C37 = #lib::D {x: #C32, y: #C36}
+  #C38 = #test_symbol
+  #C39 = ##lib::_private_symbol
+  #C40 = #lib::F<dart.core::int, dart.core::String> {}
+}
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart.expect b/pkg/vm/testcases/bytecode/optional_params.dart.expect
index 3ff8087..4fcf451 100644
--- a/pkg/vm/testcases/bytecode/optional_params.dart.expect
+++ b/pkg/vm/testcases/bytecode/optional_params.dart.expect
@@ -271,19 +271,19 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  static method foo1(dynamic x, [dynamic a = "default_a", dynamic b = "default_b"]) → void {
+  static method foo1(dynamic x, [dynamic a = #C1, dynamic b = #C2]) → void {
     dart.core::print("x = ${x}");
     dart.core::print("a = ${a}");
     dart.core::print("b = ${b}");
   }
-  static method foo2(dynamic y, dynamic z, {dynamic c = "default_c", dynamic a = 42, dynamic b = const <dart.core::String>["default_b"]}) → void {
+  static method foo2(dynamic y, dynamic z, {dynamic c = #C3, dynamic a = #C4, dynamic b = #C5}) → void {
     dart.core::print("y = ${y}");
     dart.core::print("z = ${z}");
     dart.core::print("a = ${a}");
     dart.core::print("b = ${b}");
     dart.core::print("c = ${c}");
   }
-  static method foo3<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic>(dynamic z, dynamic y, {dart.core::bool a = false, dart.core::Map<#lib::foo3::P, #lib::foo3::Q> b = null}) → void {
+  static method foo3<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic>(dynamic z, dynamic y, {dart.core::bool a = #C6, dart.core::Map<#lib::foo3::P, #lib::foo3::Q> b = #C7}) → void {
     dart.core::print(#lib::foo3::P);
     dart.core::print(y);
     dart.core::print(b);
@@ -293,3 +293,12 @@
     #lib::foo2("fixed_y", "fixed_z", a: "concrete_a");
   }
 }
+constants  {
+  #C1 = "default_a"
+  #C2 = "default_b"
+  #C3 = "default_c"
+  #C4 = 42
+  #C5 = ListConstant<dart.core::String>(#C2)
+  #C6 = false
+  #C7 = null
+}
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index b7ca049..adea1f5a 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -198,19 +198,19 @@
     #L1:
     switch(x) {
       #L2:
-      case 1:
+      case #C1:
         {
           y = 11;
           break #L1;
         }
       #L3:
-      case 2:
+      case #C2:
         {
           y = 22;
           break #L1;
         }
       #L4:
-      case 3:
+      case #C3:
         {
           y = 33;
           break #L1;
@@ -223,17 +223,17 @@
     #L5:
     switch(x) {
       #L6:
-      case 1:
-      case 2:
-      case 3:
+      case #C1:
+      case #C2:
+      case #C3:
         {
           y = 11;
           break #L5;
         }
       #L7:
-      case 4:
-      case 5:
-      case 6:
+      case #C4:
+      case #C5:
+      case #C6:
         {
           y = 22;
           break #L5;
@@ -250,17 +250,17 @@
     dart.core::int y;
     switch(x) {
       #L9:
-      case 1:
-      case 2:
-      case 3:
+      case #C1:
+      case #C2:
+      case #C3:
         {
           y = 11;
           continue #L10;
         }
       #L10:
-      case 4:
-      case 5:
-      case 6:
+      case #C4:
+      case #C5:
+      case #C6:
         {
           y = 22;
           return 42;
@@ -275,3 +275,11 @@
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 3
+  #C4 = 4
+  #C5 = 5
+  #C6 = 6
+}
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 126eae9..b6575db 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -1119,7 +1119,7 @@
     #L2:
     switch(x) {
       #L3:
-      case 1:
+      case #C1:
         {
           try {
             dart.core::print("before try 1");
@@ -1144,7 +1144,7 @@
           break #L2;
         }
       #L4:
-      case 2:
+      case #C2:
         {
           dart.core::print("case 2");
           break #L2;
@@ -1191,3 +1191,7 @@
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 6b29eac..22da680 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -285,7 +285,7 @@
   PushNull
   PushConstant         CP#10
   AssertAssignable     0, CP#11
-  InterfaceCall        2, CP#12
+  UncheckedInterfaceCall 2, CP#12
   Drop1
   PushNull
   ReturnTOS
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
index ea11fc1..16476c9 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -2,44 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-@self::TypedefAnnotation::•(const <core::int>[1, 2, 3])
+@#C5
 typedef SomeType<T extends core::Object = dynamic> = (core::List<T>) → void;
 abstract class ClassAnnotation2 extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •() → self::ClassAnnotation2
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
 }
 abstract class MethodAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(core::int x) → self::MethodAnnotation
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
+[@vm.unreachable.metadata=]  final field core::int x;
 }
 abstract class TypedefAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(core::List<core::int> list) → self::TypedefAnnotation
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
+[@vm.unreachable.metadata=]  final field core::List<core::int> list;
 }
 abstract class VarAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •() → self::VarAnnotation
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
 }
 abstract class ParametrizedAnnotation<T extends core::Object = dynamic> extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(self::ParametrizedAnnotation::T foo) → self::ParametrizedAnnotation<self::ParametrizedAnnotation::T>
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
+[@vm.unreachable.metadata=]  final field self::ParametrizedAnnotation::T foo;
 }
 abstract class A extends core::Object {
   static method staticMethod() → void {}
 }
-@self::ClassAnnotation2::•()
+@#C6
 class B extends core::Object {
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  @self::MethodAnnotation::•(42)
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  @#C8
   method instanceMethod() → void {}
 }
 static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int>) → void a) → core::int {
-  @self::VarAnnotation::•() core::int x = 2;
-  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] x.{core::num::+}(2);
+  @#C9 core::int x = 2;
+  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
 }
-@self::ParametrizedAnnotation::•<core::Null>(null)
+@#C11
 static method main(core::List<core::String> args) → dynamic {
   self::A::staticMethod();
   [@vm.direct-call.metadata=#lib::B::instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index ffdd14f..fa9c87b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-static method isPrime([@vm.inferred-type.metadata=int?] dynamic n) → core::bool {
-  if(_in::unsafeCast<core::bool>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
+static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool {
+  if(_in::unsafeCast<core::bool>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
     return false;
-  for (core::int i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
-    if([@vm.inferred-type.metadata=dart.core::bool] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::%??] [@vm.inferred-type.metadata=int?] n.%(i).{core::Object::==}(0))
+  for (core::int i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
+    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::%] [@vm.inferred-type.metadata=int] n.%(i).{core::Object::==}(0))
       return false;
   }
   return true;
 }
 static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi] core::int n) → core::int {
   core::int counter = 0;
-  for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+  for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
-      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] counter.{core::num::+}(1);
-    if([@vm.inferred-type.metadata=dart.core::bool] counter.{core::num::==}(n)) {
+      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1);
+    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] counter.{core::num::==}(n)) {
       return i;
     }
   }
@@ -31,7 +31,7 @@
 }
 static method main(core::List<core::String> args) → dynamic {
   core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
-  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::run();
   }
   [@vm.direct-call.metadata=dart.core::Stopwatch::stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index fb2975e..7fa4e1f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -12,14 +12,14 @@
   constructor •([@vm.inferred-type.metadata=dart.core::_Smi] core::int size) → self::_Vector
     : self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasTearOffUses:false]  operator [](core::int i) → core::double
-    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
+[@vm.procedure-attributes.metadata=hasTearOffUses:false]  operator []([@vm.inferred-type.metadata=!] core::int i) → core::double
+    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
     let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
     core::double result = 0.0;
-    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1))
+    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1))
       result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
     return result;
   }
@@ -28,7 +28,7 @@
 [@vm.inferred-type.metadata=dart.core::_Double?]static field core::double x = 0.0;
 static method main(core::List<core::String> args) → dynamic {
   core::Stopwatch timer = let final core::Stopwatch #t4 = new core::Stopwatch::•() in let final dynamic #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t4.{core::Stopwatch::start}() in #t4;
-  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
   }
   [@vm.direct-call.metadata=dart.core::Stopwatch::stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index aee6417..d508c60 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -42,7 +42,7 @@
 static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A aa) → void {
   [@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A aa = null}) → void {
+static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A aa = #C1}) → void {
   [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
 static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A aa) → void {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
index 999e779..1762eb3 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -21,13 +21,13 @@
   synthetic constructor •() → self::Stream
     : super core::Object::•()
     ;
-  abstract method foobar((dynamic) → void onData, {core::Function onError = null}) → self::StreamSubscription;
+  abstract method foobar((dynamic) → void onData, {core::Function onError = #C1}) → self::StreamSubscription;
 }
 abstract class _StreamImpl extends self::Stream {
   synthetic constructor •() → self::_StreamImpl
     : super self::Stream::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → self::StreamSubscription {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = #C1}) → self::StreamSubscription {
     return [@vm.inferred-type.metadata=!] this.{self::_StreamImpl::_createSubscription}();
   }
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method _createSubscription() → self::StreamSubscription {
@@ -52,7 +52,7 @@
   constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → self::StreamView
     : self::StreamView::_stream = stream, super self::Stream::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → self::StreamSubscription {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = #C1}) → self::StreamSubscription {
     return [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] this.{self::StreamView::_stream}.{self::Stream::foobar}(onData, onError: onError);
   }
 }
@@ -66,7 +66,7 @@
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData) → dynamic {
     super.{self::StreamView::foobar}(onData);
   }
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = #C1}) → dynamic {
     super.{self::StreamView::foobar}(onData, onError: onError);
   }
   get super_stream() → self::Stream
@@ -80,23 +80,23 @@
 static method round0() → void {
   new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
 }
-static method round1({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
+static method round1({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = #C1}) → void {
   self::ByteStream x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
   [@vm.direct-call.metadata=#lib::ByteStream::super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
 }
-static method round2({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
+static method round2({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = #C1}) → void {
   new self::_ControllerStream::•();
   self::Stream x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x.{self::Stream::foobar}(onData, onError: onError);
 }
-static method round3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
+static method round3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = #C1}) → void {
   self::Stream x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x = new self::_ControllerStream::•();
   x.{self::Stream::foobar}(onData, onError: onError);
 }
-static method round4({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
+static method round4({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = #C1}) → void {
   self::ByteStream x = new self::ByteStream::•(new self::_ControllerStream::•());
   self::Stream y = [@vm.direct-call.metadata=#lib::ByteStream::super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
   self::Stream z = [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index 5fc9b87..1b22241 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -39,27 +39,27 @@
     ;
   abstract method foo() → dynamic;
   abstract get bar() → dynamic;
-  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = null, dynamic a5 = null]) → dynamic;
+  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = #C1, dynamic a5 = #C1]) → dynamic;
 }
 class B extends self::A {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T1::•();
   }
   no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = #C1]) → dynamic
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
 }
 abstract class C extends core::Object {
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T2::•();
   }
 }
@@ -68,27 +68,27 @@
     : super self::C::•()
     ;
   no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = #C1]) → dynamic
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
 }
 class E extends core::Object implements self::A {
   synthetic constructor •() → self::E
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T4::•();
   }
   no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(#C5))));
 }
 class F extends core::Object {
   synthetic constructor •() → self::F
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T2::•();
   }
 }
@@ -96,7 +96,7 @@
   synthetic constructor •() → self::G
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T5::•();
   }
 }
@@ -104,9 +104,9 @@
   synthetic constructor •() → self::H
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = null, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = null}) → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = #C1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = #C1}) → dynamic
     return new self::T6::•();
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
     return new self::T7::•();
   }
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
index 472fbbd..7f64259 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
@@ -54,7 +54,7 @@
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call(x);
 static method main(core::List<core::String> args) → dynamic {
   self::func1(self::getDynamic() as{TypeError} self::T0);
-  self::use(self::func2);
+  self::use(#C1);
   self::use(new self::A::•().{self::A::method1});
   self::B bb = self::getDynamic() as{TypeError} self::B;
   [@vm.direct-call.metadata=#lib::C::method2??] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B::method2}(self::getDynamic());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index 0630a2a..36dbf0d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -19,7 +19,7 @@
   synthetic constructor •() → self::A1
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = _in::unsafeCast<self::T1>(a5);
   }
 }
@@ -42,7 +42,7 @@
   synthetic constructor •() → self::A2
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
   }
 }
@@ -75,7 +75,7 @@
   synthetic constructor •() → self::A3
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
   }
 }
@@ -98,7 +98,7 @@
   synthetic constructor •() → self::A4
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
   }
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
index 2c96882..3c1beb0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false]  method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=!? (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=! (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
 }
 class TearOffDynamicMethod extends core::Object {
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic bazz;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
index 66af620..ccb925f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
@@ -14,7 +14,7 @@
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
-    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
+    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → core::int
     return 3;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
index 950a81d..b147844 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
@@ -14,14 +14,14 @@
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → core::int
-    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
+    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
 }
 abstract class Base extends core::Object {
   synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
-    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
+    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method doCall(dynamic x) → core::int
     return [@vm.call-site-attributes.metadata=receiverType:dynamic] x.call() as{TypeError} core::int;
 }
diff --git a/pkg/vm/tool/gen_kernel b/pkg/vm/tool/gen_kernel
index a968d05..8174ed5 100755
--- a/pkg/vm/tool/gen_kernel
+++ b/pkg/vm/tool/gen_kernel
@@ -14,8 +14,8 @@
 
 for arg in "$@"; do
   case $arg in
-    --abi-version=*)
-    ABI_VERSION="$(echo "$arg" | sed "s|--abi-version=||")"
+    --use-abi-version=*)
+    ABI_VERSION="$(echo "$arg" | sed "s|--use-abi-version=||")"
     ;;
     --platform*)
     HAS_PLATFORM="TRUE"
diff --git a/runtime/bin/ffi_test_functions.cc b/runtime/bin/ffi_test_functions.cc
index c22939d..1f07257 100644
--- a/runtime/bin/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test_functions.cc
@@ -8,6 +8,7 @@
 #include <stdlib.h>
 #include <sys/types.h>
 
+#include "platform/assert.h"
 #include "platform/globals.h"
 #if defined(HOST_OS_WINDOWS)
 #include <psapi.h>
@@ -469,6 +470,36 @@
   return *reinterpret_cast<void**>(&origin);
 }
 
+// Allocates 'count'-many Mint boxes, to stress-test GC during an FFI call.
+DART_EXPORT void AllocateMints(uint64_t count) {
+  Dart_EnterScope();
+  for (uint64_t i = 0; i < count; ++i) {
+    Dart_NewInteger(0x8000000000000001);
+  }
+  Dart_ExitScope();
+}
+
+// Calls a Dart function to allocate 'count' objects.
+// Used for stress-testing GC when re-entering the API.
+DART_EXPORT void AllocateThroughDart(uint64_t count) {
+  Dart_EnterScope();
+  Dart_Handle root = Dart_RootLibrary();
+  Dart_Handle arguments[1] = {Dart_NewIntegerFromUint64(count)};
+  Dart_Handle result = Dart_Invoke(
+      root, Dart_NewStringFromCString("testAllocationsInDartHelper"), 1,
+      arguments);
+  const char* error;
+  if (Dart_IsError(result)) {
+    Dart_StringToCString(Dart_ToString(result), &error);
+    fprintf(stderr, "Could not call 'testAllocationsInDartHelper': %s\n",
+            error);
+    Dart_DumpNativeStackTrace(nullptr);
+    Dart_PrepareToAbort();
+    abort();
+  }
+  Dart_ExitScope();
+}
+
 #if !defined(_WIN32)
 DART_EXPORT int RedirectStderr() {
   char filename[256];
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 2d09c17..d0916b9 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -511,7 +511,7 @@
   // Load embedder specific bits and return.
   if (!VmService::Setup(
           Options::vm_service_server_ip(), Options::vm_service_server_port(),
-          Options::vm_service_dev_mode(), Options::vm_service_auth_disabled(),
+          Options::vm_service_dev_mode(), !Options::vm_service_auth_enabled(),
           Options::trace_loading(), Options::deterministic())) {
     *error = strdup(VmService::GetErrorMessage());
     return NULL;
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 8513fe3..414f309 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -34,12 +34,16 @@
 
 // As STRING_OPTIONS_LIST but for boolean valued options. The default value is
 // always false, and the presence of the flag switches the value to true.
+// TODO(bkonyi): enable_service_auth_codes is a temporary flag and will be
+// removed once auth codes are enabled by default. disable_service_auth_codes is
+// a no-op for now.
 #define BOOL_OPTIONS_LIST(V)                                                   \
   V(version, version_option)                                                   \
   V(compile_all, compile_all)                                                  \
   V(disable_service_origin_check, vm_service_dev_mode)                         \
   V(disable_service_auth_codes, vm_service_auth_disabled)                      \
   V(deterministic, deterministic)                                              \
+  V(enable_service_auth_codes, vm_service_auth_enabled)                        \
   V(trace_loading, trace_loading)                                              \
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 0615daa..3680f23 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -589,10 +589,24 @@
       return status;
     }
 
+    // After reading the binary into a VMO, we need to mark it as executable,
+    // since the VMO returned by fdio_get_vmo_clone should be read-only.
+    status = zx_vmo_replace_as_executable(vmo, ZX_HANDLE_INVALID, &vmo);
+    if (status != ZX_OK) {
+      close(exit_pipe_fds[0]);
+      close(exit_pipe_fds[1]);
+      *os_error_message_ = DartUtils::ScopedCopyCString(
+          "Failed to mark binary as executable for process start.");
+      return status;
+    }
+
     fdio_spawn_action_t* actions;
     const intptr_t actions_count = BuildSpawnActions(
         namespc_->namespc()->fdio_ns(), &actions);
     if (actions_count < 0) {
+      zx_handle_close(vmo);
+      close(exit_pipe_fds[0]);
+      close(exit_pipe_fds[1]);
       *os_error_message_ = DartUtils::ScopedCopyCString(
           "Failed to build spawn actions array.");
       return ZX_ERR_IO;
@@ -605,10 +619,9 @@
     zx_handle_t process = ZX_HANDLE_INVALID;
     char err_msg[FDIO_SPAWN_ERR_MSG_MAX_LENGTH];
     uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_CLONE_LDSVC;
-    status =
-        fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
-                       program_environment_, actions_count, actions, &process,
-                       err_msg);
+    status = fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
+                            program_environment_, actions_count, actions,
+                            &process, err_msg);
     // Handles are consumed by fdio_spawn_vmo even if it fails.
     delete[] actions;
     if (status != ZX_OK) {
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 447d334..40d7def 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -307,7 +307,10 @@
 
     final String path = _checkAuthTokenAndGetPath(request.uri);
     if (path == null) {
-      // Malformed.
+      // Either no authentication code was provided when one was expected or an
+      // incorrect authentication code was provided.
+      request.response.statusCode = HttpStatus.forbidden;
+      request.response.write("missing or invalid authentication code");
       request.response.close();
       return;
     }
@@ -335,7 +338,7 @@
     }
     // HTTP based service request.
     final client = new HttpRequestClient(request, _service);
-    final message = new Message.fromUri(client, request.uri);
+    final message = new Message.fromUri(client, Uri.parse(path));
     client.onRequest(message); // exception free, no need to try catch
   }
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index be316ee..18714e5 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -3372,4 +3372,10 @@
  */
 DART_EXPORT void Dart_DumpNativeStackTrace(void* context);
 
+/**
+ *  Indicate that the process is about to abort, and the Dart VM should not
+ *  attempt to cleanup resources.
+ */
+DART_EXPORT void Dart_PrepareToAbort();
+
 #endif /* INCLUDE_DART_API_H_ */ /* NOLINT */
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index d717fc9..7bdca63 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -230,15 +230,15 @@
   CheckRange(argCount, 1, max_count, "count");
 
   size_t size = compiler::ffi::ElementSizeInBytes(type_cid) * count;
-  intptr_t memory = reinterpret_cast<intptr_t>(malloc(size));
+  uint64_t memory = reinterpret_cast<uint64_t>(malloc(size));
   if (memory == 0) {
     const String& error = String::Handle(String::NewFormatted(
         "allocating (%" Pd ") bytes of memory failed", size));
     Exceptions::ThrowArgumentError(error);
   }
 
-  RawPointer* result =
-      Pointer::New(type_arg, Integer::Handle(zone, Integer::New(memory)));
+  RawPointer* result = Pointer::New(
+      type_arg, Integer::Handle(zone, Integer::NewFromUint64(memory)));
   return result;
 }
 
diff --git a/runtime/observatory/.packages b/runtime/observatory/.packages
index 914bffb..0b5a10a 100644
--- a/runtime/observatory/.packages
+++ b/runtime/observatory/.packages
@@ -22,6 +22,7 @@
 matcher:../../third_party/pkg/matcher/lib
 package_config:../../third_party/pkg_tested/package_config/lib
 package_resolver:../../third_party/pkg_tested/package_resolver/lib
+pedantic:../../third_party/pkg/pedantic/lib
 pool:../../third_party/pkg/pool/lib
 pub_semver:../../third_party/pkg/pub_semver/lib
 source_map_stack_trace:../../third_party/pkg/source_map_stack_trace/lib
@@ -30,6 +31,8 @@
 stream_channel:../../third_party/pkg/stream_channel/lib
 string_scanner:../../third_party/pkg/string_scanner/lib
 term_glyph:../../third_party/pkg/term_glyph/lib
-test:../../third_party/pkg/test/lib
+test:../../third_party/pkg/test/pkgs/test/lib
+test_api:../../third_party/pkg/test/pkgs/test_api/lib
+test_core:../../third_party/pkg/test/pkgs/test_core/lib
 typed_data:../../third_party/pkg/typed_data/lib
 observatory_test_package:tests/service/observatory_test_package
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index 3c32189..6b73ba8 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -428,10 +428,10 @@
         return 'implicit setter';
       case M.FunctionKind.implicitStaticFinalGetter:
         return 'implicit static final getter';
+      case M.FunctionKind.staticFieldInitializer:
+        return 'field initializer';
       case M.FunctionKind.irregexpFunction:
         return 'irregexp function';
-      case M.FunctionKind.staticInitializer:
-        return 'static initializer';
       case M.FunctionKind.methodExtractor:
         return 'method extractor';
       case M.FunctionKind.noSuchMethodDispatcher:
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 541dcad..777f57d 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -14,8 +14,8 @@
   implicitGetter,
   implicitSetter,
   implicitStaticFinalGetter,
+  staticFieldInitializer,
   irregexpFunction,
-  staticInitializer,
   methodExtractor,
   noSuchMethodDispatcher,
   invokeFieldDispatcher,
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 7e828a1..99e84be 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -3022,10 +3022,10 @@
       return M.FunctionKind.implicitSetter;
     case 'ImplicitStaticFinalGetter':
       return M.FunctionKind.implicitStaticFinalGetter;
+    case 'StaticFieldInitializer':
+      return M.FunctionKind.staticFieldInitializer;
     case 'IrregexpFunction':
       return M.FunctionKind.irregexpFunction;
-    case 'StaticInitializer':
-      return M.FunctionKind.staticInitializer;
     case 'MethodExtractor':
       return M.FunctionKind.methodExtractor;
     case 'NoSuchMethodDispatcher':
diff --git a/runtime/observatory/tests/service/breakpoint_on_if_null_1_test.dart b/runtime/observatory/tests/service/breakpoint_on_if_null_1_test.dart
new file mode 100644
index 0000000..2d28590
--- /dev/null
+++ b/runtime/observatory/tests/service/breakpoint_on_if_null_1_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2019, 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 breakpoint_in_parts_class;
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 18;
+const String file = "breakpoint_on_if_null_1_test.dart";
+
+code() {
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == null) {
+    print("was null");
+  }
+  if (args != null) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:12", // on '=='
+  "$file:${LINE + 3}:12", // on '!='
+  "$file:${LINE + 4}:5", // on 'print'
+  "$file:${LINE + 6}:12", // on '=='
+  "$file:${LINE + 7}:5", // on 'print'
+  "$file:${LINE + 9}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/breakpoint_on_if_null_2_test.dart b/runtime/observatory/tests/service/breakpoint_on_if_null_2_test.dart
new file mode 100644
index 0000000..5eb37e5
--- /dev/null
+++ b/runtime/observatory/tests/service/breakpoint_on_if_null_2_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2019, 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 breakpoint_in_parts_class;
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 21;
+const String file = "breakpoint_on_if_null_2_test.dart";
+
+dynamic compareWithMe = 43;
+
+code() {
+  compareWithMe = null;
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == compareWithMe) {
+    print("was null");
+  }
+  if (args != compareWithMe) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:12", // on '=='
+  "$file:${LINE + 3}:12", // on '!='
+  "$file:${LINE + 4}:5", // on 'print'
+  "$file:${LINE + 6}:12", // on '=='
+  "$file:${LINE + 7}:5", // on 'print'
+  "$file:${LINE + 9}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/breakpoint_on_if_null_3_test.dart b/runtime/observatory/tests/service/breakpoint_on_if_null_3_test.dart
new file mode 100644
index 0000000..a4c1fde
--- /dev/null
+++ b/runtime/observatory/tests/service/breakpoint_on_if_null_3_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2019, 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 breakpoint_in_parts_class;
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 17;
+const String file = "breakpoint_on_if_null_3_test.dart";
+
+code() {
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == null) {
+    print("was null");
+  }
+  if (args != null) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on 'args'
+  "$file:${LINE + 1}:12", // on '=='
+  "$file:${LINE + 4}:12", // on '!='
+  "$file:${LINE + 5}:5", // on 'print'
+  "$file:${LINE + 7}:12", // on '=='
+  "$file:${LINE + 8}:5", // on 'print'
+  "$file:${LINE + 10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/breakpoint_on_if_null_4_test.dart b/runtime/observatory/tests/service/breakpoint_on_if_null_4_test.dart
new file mode 100644
index 0000000..7b9ffe1
--- /dev/null
+++ b/runtime/observatory/tests/service/breakpoint_on_if_null_4_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2019, 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 breakpoint_in_parts_class;
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 20;
+const String file = "breakpoint_on_if_null_4_test.dart";
+
+dynamic compareWithMe = 43;
+
+code() {
+  compareWithMe = null;
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == compareWithMe) {
+    print("was null");
+  }
+  if (args != compareWithMe) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on 'args'
+  "$file:${LINE + 1}:12", // on '=='
+  "$file:${LINE + 4}:12", // on '!='
+  "$file:${LINE + 5}:5", // on 'print'
+  "$file:${LINE + 7}:12", // on '=='
+  "$file:${LINE + 8}:5", // on 'print'
+  "$file:${LINE + 10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index eb8c14d..f859e6d 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -91,9 +91,7 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    // Running in app_jitk mode will result in the number of ranges being 9
-    // during the training run and 10 when running from the snapshot.
-    expect(((numRanges == 9) || (numRanges == 10)), isTrue);
+    expect((numRanges == 12), isTrue);
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -108,7 +106,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, numRanges + 2);
+    expect(coverage['ranges'].length, numRanges);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/observatory/tests/service/next_through_await_for_test.dart b/runtime/observatory/tests/service/next_through_await_for_test.dart
new file mode 100644
index 0000000..734c1f1
--- /dev/null
+++ b/runtime/observatory/tests/service/next_through_await_for_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2019, 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 'test_helper.dart';
+import 'service_test_common.dart';
+
+const int LINE = 14;
+const String file = "next_through_await_for_test.dart";
+
+code() async {
+  int count = 0;
+  await for (var num in naturalsTo(2)) {
+    print(num);
+    count++;
+  }
+}
+
+Stream<int> naturalsTo(int n) async* {
+  int k = 0;
+  while (k < n) {
+    k++;
+    yield k;
+  }
+  yield 42;
+}
+
+List<String> stops = [];
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on '='
+  "$file:${LINE + 1}:25", // on 'naturalsTo'
+
+  // Iteration #1
+  "$file:${LINE + 1}:3", // on 'await'
+  "$file:${LINE + 1}:40", // on '{'
+  "$file:${LINE + 2}:5", // on 'print'
+  "$file:${LINE + 3}:10", // on '++'
+
+  // Iteration #2
+  "$file:${LINE + 1}:3", // on 'await'
+  "$file:${LINE + 1}:40", // on '{'
+  "$file:${LINE + 2}:5", // on 'print'
+  "$file:${LINE + 3}:10", // on '++'
+
+  // Iteration #3
+  "$file:${LINE + 1}:3", // on 'await'
+  "$file:${LINE + 1}:40", // on '{'
+  "$file:${LINE + 2}:5", // on 'print'
+  "$file:${LINE + 3}:10", // on '++'
+
+  // Done
+  "$file:${LINE + 1}:3", // on 'await'
+  "$file:${LINE + 5}:1"
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtLine(LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected,
+      debugPrint: true, debugPrintFile: file, debugPrintLine: LINE)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(args, tests,
+      testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index 05c37a1..f57bf4e 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -132,8 +132,8 @@
     if (pause_on_exit) {
       fullArgs.add('--pause-isolates-on-exit');
     }
-    if (!useAuthToken) {
-      fullArgs.add('--disable-service-auth-codes');
+    if (useAuthToken) {
+      fullArgs.add('--enable-service-auth-codes');
     }
     if (pause_on_unhandled_exceptions) {
       fullArgs.add('--pause-isolates-on-unhandled-exceptions');
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index 48d1443..ed56f3a 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -278,29 +278,7 @@
     if (!(cond)) dart::Assert(__FILE__, __LINE__).Fail("expected: %s", #cond); \
   } while (false)
 
-// The COMPILE_ASSERT macro can be used to verify that a compile time
-// expression is true. For example, you could use it to verify the
-// size of a static array:
-//
-//   COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES);
-//
-// or to make sure a struct is smaller than a certain size:
-//
-//   COMPILE_ASSERT(sizeof(foo) < 128);
-//
-
-template <bool>
-struct CompileAssert {};
-// Macro to concatenate two tokens. The helper is need to proper expansion
-// in case an argument is a macro itself.
-#if !defined(COMPILE_ASSERT)
-#define COMPILE_ASSERT_JOIN(a, b) COMPILE_ASSERT_JOIN_HELPER(a, b)
-#define COMPILE_ASSERT_JOIN_HELPER(a, b) a##b
-#define COMPILE_ASSERT(expr)                                                   \
-  DART_UNUSED typedef CompileAssert<(static_cast<bool>(expr))>                 \
-      COMPILE_ASSERT_JOIN(CompileAssertTypeDef,                                \
-                          __LINE__)[static_cast<bool>(expr) ? 1 : -1]
-#endif  // !defined(COMPILE_ASSERT)
+#define COMPILE_ASSERT(expr) static_assert(expr, "")
 
 #if defined(TESTING)
 
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index be43b30..7815569 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -352,6 +352,19 @@
 #error Unknown architecture.
 #endif
 
+// Determine whether HOST_ARCH equals TARGET_ARCH.
+#if defined(HOST_ARCH_ARM) && defined(TARGET_ARCH_ARM)
+#define HOST_ARCH_EQUALS_TARGET_ARCH 1
+#elif defined(HOST_ARCH_ARM64) && defined(TARGET_ARCH_ARM64)
+#define HOST_ARCH_EQUALS_TARGET_ARCH 1
+#elif defined(HOST_ARCH_IA32) && defined(TARGET_ARCH_IA32)
+#define HOST_ARCH_EQUALS_TARGET_ARCH 1
+#elif defined(HOST_ARCH_X64) && defined(TARGET_ARCH_X64)
+#define HOST_ARCH_EQUALS_TARGET_ARCH 1
+#else
+// HOST_ARCH != TARGET_ARCH.
+#endif
+
 #if !defined(TARGET_OS_ANDROID) && !defined(TARGET_OS_FUCHSIA) &&              \
     !defined(TARGET_OS_MACOS_IOS) && !defined(TARGET_OS_LINUX) &&              \
     !defined(TARGET_OS_MACOS) && !defined(TARGET_OS_WINDOWS)
diff --git a/runtime/tests/vm/dart/regress_36590_test.dart b/runtime/tests/vm/dart/regress_36590_test.dart
new file mode 100644
index 0000000..645c45b
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_36590_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Regression test for https://github.com/dart-lang/sdk/issues/36590.
+//
+// This test verifies that compiler does not crash if OSR occurs at
+// CheckStack bytecode instruction which is not at the beginning of a join
+// block in bytecode (if the end of the "loop" body is unreachable and hence
+// there is no backward jump).
+//
+// VMOptions=--deterministic
+
+var var6 = [1, 2, 3];
+
+void bar() {}
+
+var cond_true = true;
+
+void foo() {
+  for (int i = 0; i < 9995; ++i) {
+    var6[0] += 1;
+  }
+  if (cond_true) {
+    var6[0] += 1;
+    for (var loc1 in var6) {
+      break;
+    }
+  }
+  if (cond_true) {
+    var6[0] += 1;
+    for (var loc1 in var6) {
+      break;
+    }
+  }
+  if (cond_true) {
+    var6[0] += 1;
+    for (var loc1 in var6) {
+      break;
+    }
+  }
+  if (cond_true) {
+    var6[0] += 1;
+    for (var loc1 in var6) {
+      break;
+    }
+  }
+  if (cond_true) {
+    var6[0] += 1;
+    for (var loc1 in var6) {
+      break;
+    }
+  }
+}
+
+main() {
+  foo();
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index b626857..195b548 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -41,6 +41,10 @@
 dart/redirection_type_shuffling_test/none: RuntimeError
 dart/snapshot_version_test: RuntimeError
 
+[ $hot_reload || $hot_reload_rollback ]
+dart/compilation_trace_test: Pass, Slow
+dart/type_feedback_test: Pass, Slow
+
 [ $compiler != dartk || ($arch != x64 && $arch != simarm && $arch != arm) || $hot_reload || $hot_reload_rollback ]
 dart/entrypoints/jit/*: SkipByDesign  # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
 
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index 9f79e8a..879e669 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -13,7 +13,7 @@
 // Version of DartFuzz. Increase this each time changes are made
 // to preserve the property that a given version of DartFuzz yields
 // the same fuzzed program for a deterministic random seed.
-const String version = '1.7';
+const String version = '1.9';
 
 // Restriction on statement and expression depths.
 const int stmtDepth = 2;
diff --git a/runtime/tools/dartfuzz/dartfuzz_api_table.dart b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
index 170f19d..787e324 100644
--- a/runtime/tools/dartfuzz/dartfuzz_api_table.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
@@ -171,9 +171,6 @@
     DartLib('FileSystemEvent.all', 'Vv'),
     DartLib('FileSystemEvent.ALL', 'Vv'),
     DartLib('exitCode', 'Vv'),
-    DartLib('pid', 'Vv'),
-    DartLib('ProcessInfo.currentRss', 'Vv'),
-    DartLib('ProcessInfo.maxRss', 'Vv'),
     DartLib('RawSocketOption.levelSocket', 'Vv'),
     DartLib('RawSocketOption.levelIPv4', 'Vv'),
     DartLib('RawSocketOption.IPv4MulticastInterface', 'Vv'),
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index 768ba39..05a5000 100755
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -127,8 +127,8 @@
 }
 
 void visitClass(ClassElement classElement) {
-  // Platform operations cause too many divergences.
-  if (classElement.name == 'Platform') {
+  // Classes that cause too many false divergences.
+  if (classElement.name == 'ProcessInfo' || classElement.name == 'Platform') {
     return;
   }
   // Every class element contains elements for the members, viz. `methods` visits
@@ -252,13 +252,14 @@
   if (ret.contains('?') || proto.contains('?')) {
     return;
   }
-  // Restrict parameters for a few hardcoded cases, for
-  // example, to avoid excessive runtime or memory allocation
-  // in the generated fuzzing program or to avoid obvious
-  // divergences.
+  // Restrict parameters for a few hardcoded cases,
+  // for example, to avoid excessive runtime or memory
+  // allocation in the generated fuzzing program or to
+  // avoid false divergences.
   if (name == 'padLeft' || name == 'padRight') {
     proto = proto.replaceAll('I', 'i');
-  } else if (name == 'Platform.executable' ||
+  } else if (name == 'pid' ||
+      name == 'Platform.executable' ||
       name == 'Platform.resolvedExecutable') {
     return;
   }
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index ce2bac2..ba2dc60 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1181,6 +1181,14 @@
   ASSERT(Thread::Current()->IsMutatorThread());
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
+    // TODO(36584) : We expect is_type_finalized to be true for all classes
+    // here, but with eager reading of the constant table we get into
+    // situations where we see classes whose types have not been finalized yet,
+    // the real solution is to implement lazy evaluation of constants. This is
+    // a temporary workaround until lazy evaluation is implemented.
+    if (!cls.is_type_finalized()) {
+      FinalizeTypesInClass(cls);
+    }
     ClassFinalizer::FinalizeClass(cls);
     return Error::null();
   } else {
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 213a394..5f0accb 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -4685,12 +4685,12 @@
                 "<empty>");
   AddBaseObject(Object::empty_exception_handlers().raw(), "ExceptionHandlers",
                 "<empty>");
-  ASSERT(Object::implicit_getter_bytecode().raw() != Object::null());
   AddBaseObject(Object::implicit_getter_bytecode().raw(), "Bytecode",
                 "<implicit getter>");
-  ASSERT(Object::implicit_setter_bytecode().raw() != Object::null());
   AddBaseObject(Object::implicit_setter_bytecode().raw(), "Bytecode",
                 "<implicit setter>");
+  AddBaseObject(Object::method_extractor_bytecode().raw(), "Bytecode",
+                "<method extractor>");
 
   for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
     AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i],
@@ -5148,6 +5148,7 @@
   AddBaseObject(Object::empty_exception_handlers().raw());
   AddBaseObject(Object::implicit_getter_bytecode().raw());
   AddBaseObject(Object::implicit_setter_bytecode().raw());
+  AddBaseObject(Object::method_extractor_bytecode().raw());
 
   for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
     AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i]);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 4289942..58750f8 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -794,6 +794,8 @@
         Z, Closure::Cast(instance).instantiator_type_arguments()));
     AddTypeArguments(TypeArguments::Handle(
         Z, Closure::Cast(instance).function_type_arguments()));
+    AddTypeArguments(TypeArguments::Handle(
+        Z, Closure::Cast(instance).delayed_type_arguments()));
     return;
   }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index e5e6e5f..b3debf1 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -547,6 +547,90 @@
   Emit(encoding);
 }
 
+void Assembler::TransitionGeneratedToNative(Register destination_address,
+                                            Register addr,
+                                            Register state) {
+  // Save exit frame information to enable stack walking.
+  StoreToOffset(kWord, FP, THR, Thread::top_exit_frame_info_offset());
+
+  // Mark that the thread is executing native code.
+  StoreToOffset(kWord, destination_address, THR, Thread::vm_tag_offset());
+  LoadImmediate(state, compiler::target::Thread::native_execution_state());
+  StoreToOffset(kWord, state, THR, Thread::execution_state_offset());
+
+  if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+    EnterSafepointSlowly();
+  } else {
+    Label slow_path, done, retry;
+    LoadImmediate(addr, compiler::target::Thread::safepoint_state_offset());
+    add(addr, THR, Operand(addr));
+    Bind(&retry);
+    ldrex(state, addr);
+    cmp(state, Operand(Thread::safepoint_state_unacquired()));
+    b(&slow_path, NE);
+
+    mov(state, Operand(Thread::safepoint_state_acquired()));
+    strex(TMP, state, addr);
+    cmp(TMP, Operand(0));  // 0 means strex was successful.
+    b(&done, EQ);
+    b(&retry);
+
+    Bind(&slow_path);
+    EnterSafepointSlowly();
+
+    Bind(&done);
+  }
+}
+
+void Assembler::EnterSafepointSlowly() {
+  ldr(TMP,
+      Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
+  ldr(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  blx(TMP);
+}
+
+void Assembler::TransitionNativeToGenerated(Register addr, Register state) {
+  if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+    ExitSafepointSlowly();
+  } else {
+    Label slow_path, done, retry;
+    LoadImmediate(addr, compiler::target::Thread::safepoint_state_offset());
+    add(addr, THR, Operand(addr));
+    Bind(&retry);
+    ldrex(state, addr);
+    cmp(state, Operand(Thread::safepoint_state_acquired()));
+    b(&slow_path, NE);
+
+    mov(state, Operand(Thread::safepoint_state_unacquired()));
+    strex(TMP, state, addr);
+    cmp(TMP, Operand(0));  // 0 means strex was successful.
+    b(&done, EQ);
+    b(&retry);
+
+    Bind(&slow_path);
+    ExitSafepointSlowly();
+
+    Bind(&done);
+  }
+
+  // Mark that the thread is executing Dart code.
+  LoadImmediate(state, compiler::target::Thread::vm_tag_compiled_id());
+  StoreToOffset(kWord, state, THR, Thread::vm_tag_offset());
+  LoadImmediate(state, compiler::target::Thread::generated_execution_state());
+  StoreToOffset(kWord, state, THR, Thread::execution_state_offset());
+
+  // Reset exit frame information in Isolate structure.
+  LoadImmediate(state, 0);
+  StoreToOffset(kWord, state, THR, Thread::top_exit_frame_info_offset());
+}
+
+void Assembler::ExitSafepointSlowly() {
+  ldr(TMP,
+      Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
+  ldr(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  blx(TMP);
+}
+
 void Assembler::clrex() {
   ASSERT(TargetCPUFeatures::arm_version() != ARMv5TE);
   int32_t encoding = (kSpecialCondition << kConditionShift) | B26 | B24 | B22 |
@@ -3158,8 +3242,6 @@
     }
   }
 
-  LoadPoolPointer();
-
   ReserveAlignedFrameSpace(frame_space);
 }
 
@@ -3202,7 +3284,7 @@
   entry.Call(this, argument_count);
 }
 
-void Assembler::EnterDartFrame(intptr_t frame_size) {
+void Assembler::EnterDartFrame(intptr_t frame_size, bool load_pool_pointer) {
   ASSERT(!constant_pool_allowed());
 
   // Registers are pushed in descending order: R5 | R6 | R7/R11 | R14.
@@ -3214,7 +3296,7 @@
     EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << LR), 0);
 
     // Setup pool pointer for this dart function.
-    LoadPoolPointer();
+    if (load_pool_pointer) LoadPoolPointer();
   } else {
     EnterFrame((1 << FP) | (1 << LR), 0);
   }
@@ -3595,28 +3677,6 @@
   strb(tmp, Address(addr, 3));
 }
 
-static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-    "r0", "r1",  "r2", "r3", "r4", "r5", "r6", "r7",
-    "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc",
-};
-
-const char* Assembler::RegisterName(Register reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
-  return cpu_reg_names[reg];
-}
-
-static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
-    "q0", "q1", "q2",  "q3",  "q4",  "q5",  "q6",  "q7",
-#if defined(VFPv3_D32)
-    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
-#endif
-};
-
-const char* Assembler::FpuRegisterName(FpuRegister reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
-  return fpu_reg_names[reg];
-}
-
 }  // namespace compiler
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index cef1ff6..3f37cbd6 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -379,10 +379,6 @@
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  static const char* RegisterName(Register reg);
-
-  static const char* FpuRegisterName(FpuRegister reg);
-
   // Data-processing instructions.
   void and_(Register rd, Register rn, Operand o, Condition cond = AL);
 
@@ -514,6 +510,13 @@
   void ldrex(Register rd, Register rn, Condition cond = AL);
   void strex(Register rd, Register rt, Register rn, Condition cond = AL);
 
+  // Requires two temporary registers 'scratch0' and 'scratch1' (in addition to
+  // TMP).
+  void TransitionGeneratedToNative(Register destination_address,
+                                   Register scratch0,
+                                   Register scratch1);
+  void TransitionNativeToGenerated(Register scratch0, Register scratch1);
+
   // Miscellaneous instructions.
   void clrex();
   void nop(Condition cond = AL);
@@ -1014,7 +1017,7 @@
   // Set up a Dart frame on entry with a frame pointer and PC information to
   // enable easy access to the RawInstruction object of code corresponding
   // to this frame.
-  void EnterDartFrame(intptr_t frame_size);
+  void EnterDartFrame(intptr_t frame_size, bool load_pool_pointer = true);
 
   void LeaveDartFrame();
 
@@ -1295,6 +1298,9 @@
                              CanBeSmi can_be_smi,
                              BarrierFilterMode barrier_filter_mode);
 
+  void EnterSafepointSlowly();
+  void ExitSafepointSlowly();
+
   friend class dart::FlowGraphCompiler;
   std::function<void(Condition, Register)>
       generate_invoke_write_barrier_wrapper_;
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index b466c6b..c88687fc 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -68,28 +68,6 @@
   buffer_.Emit<int32_t>(value);
 }
 
-static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
-    "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
-    "r22", "r23", "r24", "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "r31",
-};
-
-const char* Assembler::RegisterName(Register reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
-  return cpu_reg_names[reg];
-}
-
-static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
-    "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",  "v8",  "v9",  "v10",
-    "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
-    "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
-};
-
-const char* Assembler::FpuRegisterName(FpuRegister reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
-  return fpu_reg_names[reg];
-}
-
 int32_t Assembler::BindImm19Branch(int64_t position, int64_t dest) {
   if (use_far_branches() && !CanEncodeImm19BranchOffset(dest)) {
     // Far branches are enabled, and we can't encode the branch offset in
@@ -1327,9 +1305,82 @@
   LeaveFrame();
 }
 
+void Assembler::TransitionGeneratedToNative(Register destination,
+                                            Register state) {
+  Register addr = TMP2;
+
+  // Save exit frame information to enable stack walking.
+  StoreToOffset(FPREG, THR,
+                compiler::target::Thread::top_exit_frame_info_offset());
+
+  // Mark that the thread is executing native code.
+  StoreToOffset(destination, THR, compiler::target::Thread::vm_tag_offset());
+  LoadImmediate(state, Thread::native_execution_state());
+  StoreToOffset(state, THR, compiler::target::Thread::execution_state_offset());
+
+  Label slow_path, done, retry;
+  movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()), 0);
+  add(addr, THR, Operand(addr));
+  Bind(&retry);
+  ldxr(state, addr);
+  cmp(state, Operand(Thread::safepoint_state_unacquired()));
+  b(&slow_path, NE);
+
+  movz(state, Immediate(Thread::safepoint_state_acquired()), 0);
+  stxr(TMP, state, addr);
+  cbz(&done, TMP);  // 0 means stxr was successful.
+  b(&retry);
+
+  Bind(&slow_path);
+  ldr(addr,
+      Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
+  ldr(addr, FieldAddress(addr, compiler::target::Code::entry_point_offset()));
+  blr(addr);
+
+  Bind(&done);
+}
+
+void Assembler::TransitionNativeToGenerated(Register state) {
+  Register addr = TMP2;
+
+  Label slow_path, done, retry;
+  movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()), 0);
+  add(addr, THR, Operand(addr));
+  Bind(&retry);
+  ldxr(state, addr);
+  cmp(state, Operand(Thread::safepoint_state_acquired()));
+  b(&slow_path, NE);
+
+  movz(state, Immediate(Thread::safepoint_state_unacquired()), 0);
+  stxr(TMP, state, addr);
+  cbz(&done, TMP);  // 0 means stxr was successful.
+  b(&retry);
+
+  Bind(&slow_path);
+  ldr(addr,
+      Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
+  ldr(addr, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  blr(addr);
+
+  Bind(&done);
+
+  // Mark that the thread is executing Dart code.
+  LoadImmediate(state, compiler::target::Thread::vm_tag_compiled_id());
+  StoreToOffset(state, THR, compiler::target::Thread::vm_tag_offset());
+  LoadImmediate(state, compiler::target::Thread::generated_execution_state());
+  StoreToOffset(state, THR, compiler::target::Thread::execution_state_offset());
+
+  // Reset exit frame information in Isolate structure.
+  StoreToOffset(ZR, THR,
+                compiler::target::Thread::top_exit_frame_info_offset());
+}
+
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_size) {
   Comment("EnterCallRuntimeFrame");
-  EnterStubFrame();
+  EnterFrame(0);
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    TagAndPushPPAndPcMarker();  // Save PP and PC marker.
+  }
 
   // Store fpu registers with the lowest register number at the lowest
   // address.
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index de51436..1ff5ac9 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -473,10 +473,6 @@
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  static const char* RegisterName(Register reg);
-
-  static const char* FpuRegisterName(FpuRegister reg);
-
   void SetPrologueOffset() {
     if (prologue_offset_ == -1) {
       prologue_offset_ = CodeSize();
@@ -1265,11 +1261,9 @@
     ldr(reg, Address(SP, 1 * target::kWordSize, Address::PostIndex));
   }
   void PushPair(Register low, Register high) {
-    ASSERT((low != PP) && (high != PP));
     stp(low, high, Address(SP, -2 * target::kWordSize, Address::PairPreIndex));
   }
   void PopPair(Register low, Register high) {
-    ASSERT((low != PP) && (high != PP));
     ldp(low, high, Address(SP, 2 * target::kWordSize, Address::PairPostIndex));
   }
   void PushFloat(VRegister reg) {
@@ -1533,6 +1527,12 @@
   void LeaveFrame();
   void Ret() { ret(LR); }
 
+  // These require that CSP and SP are equal and aligned.
+  // These require a scratch register (in addition to TMP/TMP2).
+  void TransitionGeneratedToNative(Register destination_address,
+                                   Register scratch);
+  void TransitionNativeToGenerated(Register scratch);
+
   void CheckCodePointer();
   void RestoreCodePointer();
 
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.cc b/runtime/vm/compiler/assembler/assembler_dbc.cc
index 141c36a..fe6f47f 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc.cc
@@ -71,14 +71,6 @@
   buffer_.Emit<int32_t>(value);
 }
 
-const char* Assembler::RegisterName(Register reg) {
-  return ThreadState::Current()->zone()->PrintToString("R%d", reg);
-}
-
-const char* Assembler::FpuRegisterName(FpuRegister reg) {
-  return ThreadState::Current()->zone()->PrintToString("F%d", reg);
-}
-
 static int32_t EncodeJump(int32_t relative_pc) {
   return SimulatorBytecode::kJump | (relative_pc << 8);
 }
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.h b/runtime/vm/compiler/assembler/assembler_dbc.h
index 3c57878..253fdc1 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.h
+++ b/runtime/vm/compiler/assembler/assembler_dbc.h
@@ -44,10 +44,6 @@
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  static const char* RegisterName(Register reg);
-
-  static const char* FpuRegisterName(FpuRegister reg);
-
   static uword GetBreakInstructionFiller() { return SimulatorBytecode::kTrap; }
 
   static bool IsSafe(const Object& value) { return true; }
diff --git a/runtime/vm/compiler/assembler/assembler_dbc_test.cc b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
index d577eec..1b192b5 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
@@ -1681,6 +1681,70 @@
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
 }
 
+ASSEMBLER_TEST_GENERATE(IfEqNullTOSNotNull, assembler) {
+  Label branch_taken;
+  __ PushConstant(Smi::Handle(Smi::New(-1)));
+  __ IfEqNullTOS();
+  __ Jump(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(42)));
+  __ ReturnTOS();
+  __ Bind(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(0)));
+  __ ReturnTOS();
+}
+
+ASSEMBLER_TEST_RUN(IfEqNullTOSNotNull, test) {
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+ASSEMBLER_TEST_GENERATE(IfEqNullTOSIsNull, assembler) {
+  Label branch_taken;
+  __ PushConstant(Object::null_object());
+  __ IfEqNullTOS();
+  __ Jump(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(0)));
+  __ ReturnTOS();
+  __ Bind(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(42)));
+  __ ReturnTOS();
+}
+
+ASSEMBLER_TEST_RUN(IfEqNullTOSIsNull, test) {
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+ASSEMBLER_TEST_GENERATE(IfNeNullTOSNotNull, assembler) {
+  Label branch_taken;
+  __ PushConstant(Smi::Handle(Smi::New(-1)));
+  __ IfNeNullTOS();
+  __ Jump(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(0)));
+  __ ReturnTOS();
+  __ Bind(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(42)));
+  __ ReturnTOS();
+}
+
+ASSEMBLER_TEST_RUN(IfNeNullTOSNotNull, test) {
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
+ASSEMBLER_TEST_GENERATE(IfNeNullTOSIsNull, assembler) {
+  Label branch_taken;
+  __ PushConstant(Object::null_object());
+  __ IfNeNullTOS();
+  __ Jump(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(42)));
+  __ ReturnTOS();
+  __ Bind(&branch_taken);
+  __ PushConstant(Smi::Handle(Smi::New(0)));
+  __ ReturnTOS();
+}
+
+ASSEMBLER_TEST_RUN(IfNeNullTOSIsNull, test) {
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
+}
+
 //  - If<Cond> rA, rD
 //
 //    Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 5df8760..4ca49e3 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2078,6 +2078,72 @@
   }
 }
 
+void Assembler::TransitionGeneratedToNative(Register destination_address,
+                                            Register scratch) {
+  // Save exit frame information to enable stack walking.
+  movl(Address(THR, Thread::top_exit_frame_info_offset()), FPREG);
+
+  // Mark that the thread is executing native code.
+  movl(VMTagAddress(), destination_address);
+  movl(Address(THR, Thread::execution_state_offset()),
+       Immediate(compiler::target::Thread::native_execution_state()));
+
+  // Compare and swap the value at Thread::safepoint_state from unacquired to
+  // acquired. On success, jump to 'success'; otherwise, fallthrough.
+  pushl(EAX);
+  movl(EAX, Immediate(Thread::safepoint_state_unacquired()));
+  movl(scratch, Immediate(Thread::safepoint_state_acquired()));
+  LockCmpxchgl(Address(THR, Thread::safepoint_state_offset()), scratch);
+  movl(scratch, EAX);
+  popl(EAX);
+  cmpl(scratch, Immediate(Thread::safepoint_state_unacquired()));
+
+  Label done;
+  j(EQUAL, &done);
+
+  movl(scratch,
+       Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
+  movl(scratch,
+       FieldAddress(scratch, compiler::target::Code::entry_point_offset()));
+  call(scratch);
+
+  Bind(&done);
+}
+
+void Assembler::TransitionNativeToGenerated(Register scratch) {
+  // Compare and swap the value at Thread::safepoint_state from acquired to
+  // unacquired. On success, jump to 'success'; otherwise, fallthrough.
+  pushl(EAX);
+  movl(EAX, Immediate(compiler::target::Thread::safepoint_state_acquired()));
+  movl(scratch,
+       Immediate(compiler::target::Thread::safepoint_state_unacquired()));
+  LockCmpxchgl(Address(THR, compiler::target::Thread::safepoint_state_offset()),
+               scratch);
+  movl(scratch, EAX);
+  popl(EAX);
+  cmpl(scratch, Immediate(Thread::safepoint_state_acquired()));
+
+  Label done;
+  j(EQUAL, &done);
+
+  movl(scratch,
+       Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
+  movl(scratch,
+       FieldAddress(scratch, compiler::target::Code::entry_point_offset()));
+  call(scratch);
+
+  Bind(&done);
+
+  // Mark that the thread is executing Dart code.
+  movl(Assembler::VMTagAddress(),
+       Immediate(compiler::target::Thread::vm_tag_compiled_id()));
+  movl(Address(THR, Thread::execution_state_offset()),
+       Immediate(compiler::target::Thread::generated_execution_state()));
+
+  // Reset exit frame information in Isolate structure.
+  movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
+}
+
 static const intptr_t kNumberOfVolatileCpuRegisters = 3;
 static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = {
     EAX, ECX, EDX};
@@ -2594,24 +2660,6 @@
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-// Used by disassembler, so it is declared outside of
-// !defined(DART_PRECOMPILED_RUNTIME) section.
-static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-    "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
-
-const char* Assembler::RegisterName(Register reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
-  return cpu_reg_names[reg];
-}
-
-static const char* xmm_reg_names[kNumberOfXmmRegisters] = {
-    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"};
-
-const char* Assembler::FpuRegisterName(FpuRegister reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
-  return xmm_reg_names[reg];
-}
-
 }  // namespace compiler
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 1ec4248..91fa1c2 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -645,6 +645,12 @@
   void LeaveFrame();
   void ReserveAlignedFrameSpace(intptr_t frame_space);
 
+  // Require a temporary register 'tmp'.
+  // Clobber all non-CPU registers (e.g. XMM registers and the "FPU stack").
+  void TransitionGeneratedToNative(Register destination_address,
+                                   Register scratch);
+  void TransitionNativeToGenerated(Register scratch);
+
   // Create a frame for calling into runtime that preserves all volatile
   // registers.  Frame's RSP is guaranteed to be correctly aligned and
   // frame_space bytes are reserved under it.
@@ -811,9 +817,6 @@
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  static const char* RegisterName(Register reg);
-  static const char* FpuRegisterName(FpuRegister reg);
-
   // Check if the given value is an integer value that can be directly
   // emdedded into the code without additional XORing with jit_cookie.
   // We consider 16-bit integers, powers of two and corresponding masks
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 0889448..64f3d7ed 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -164,6 +164,63 @@
   EmitUint8(0xC0 + (dst & 0x07));
 }
 
+void Assembler::TransitionGeneratedToNative(Register destination_address) {
+  // Save exit frame information to enable stack walking.
+  movq(Address(THR, Thread::top_exit_frame_info_offset()), FPREG);
+
+  movq(Assembler::VMTagAddress(), destination_address);
+  movq(Address(THR, compiler::target::Thread::execution_state_offset()),
+       Immediate(compiler::target::Thread::native_execution_state()));
+
+  // Compare and swap the value at Thread::safepoint_state from unacquired to
+  // acquired. If the CAS fails, go to a slow-path stub.
+  Label done;
+  pushq(RAX);
+  movq(RAX, Immediate(Thread::safepoint_state_unacquired()));
+  movq(TMP, Immediate(Thread::safepoint_state_acquired()));
+  LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
+  movq(TMP, RAX);
+  popq(RAX);
+  cmpq(TMP, Immediate(Thread::safepoint_state_unacquired()));
+  j(EQUAL, &done);
+
+  movq(TMP,
+       Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
+  movq(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  CallCFunction(TMP);
+
+  Bind(&done);
+}
+
+void Assembler::TransitionNativeToGenerated() {
+  // Compare and swap the value at Thread::safepoint_state from acquired to
+  // unacquired. On success, jump to 'success'; otherwise, fallthrough.
+  Label done;
+  pushq(RAX);
+  movq(RAX, Immediate(Thread::safepoint_state_acquired()));
+  movq(TMP, Immediate(Thread::safepoint_state_unacquired()));
+  LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
+  movq(TMP, RAX);
+  popq(RAX);
+  cmpq(TMP, Immediate(Thread::safepoint_state_acquired()));
+  j(EQUAL, &done);
+
+  movq(TMP,
+       Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
+  movq(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  CallCFunction(TMP);
+
+  Bind(&done);
+
+  movq(Assembler::VMTagAddress(),
+       Immediate(compiler::target::Thread::vm_tag_compiled_id()));
+  movq(Address(THR, Thread::execution_state_offset()),
+       Immediate(compiler::target::Thread::generated_execution_state()));
+
+  // Reset exit frame information in Isolate structure.
+  movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
+}
+
 void Assembler::EmitQ(int reg,
                       const Address& address,
                       int opcode,
@@ -1527,7 +1584,11 @@
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   Comment("EnterCallRuntimeFrame");
-  EnterStubFrame();
+  EnterFrame(0);
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    pushq(CODE_REG);
+    pushq(PP);
+  }
 
   // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
   PushRegisters(CallingConventions::kVolatileCpuRegisters,
@@ -2133,26 +2194,6 @@
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-static const char* xmm_reg_names[kNumberOfXmmRegisters] = {
-    "xmm0", "xmm1", "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",  "xmm7",
-    "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"};
-
-const char* Assembler::FpuRegisterName(FpuRegister reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters));
-  return xmm_reg_names[reg];
-}
-
-static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
-    "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
-    "r8",  "r9",  "r10", "r11", "r12", "r13", "thr", "pp"};
-
-// Used by disassembler, so it is declared outside of
-// !defined(DART_PRECOMPILED_RUNTIME) section.
-const char* Assembler::RegisterName(Register reg) {
-  ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
-  return cpu_reg_names[reg];
-}
-
 }  // namespace compiler
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 2df4c31..0ef1efe 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -306,6 +306,9 @@
 
   void setcc(Condition condition, ByteRegister dst);
 
+  void TransitionGeneratedToNative(Register destination_address);
+  void TransitionNativeToGenerated();
+
 // Register-register, register-address and address-register instructions.
 #define RR(width, name, ...)                                                   \
   void name(Register dst, Register src) { Emit##width(dst, src, __VA_ARGS__); }
@@ -929,10 +932,6 @@
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  static const char* RegisterName(Register reg);
-
-  static const char* FpuRegisterName(FpuRegister reg);
-
   static Address ElementAddressForIntIndex(bool is_external,
                                            intptr_t cid,
                                            intptr_t index_scale,
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index e0c7f8a..c0b9538 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -215,6 +215,7 @@
     case KernelBytecode::kPushConstant:
     case KernelBytecode::kIndirectStaticCall:
     case KernelBytecode::kInterfaceCall:
+    case KernelBytecode::kUncheckedInterfaceCall:
     case KernelBytecode::kDynamicCall:
     case KernelBytecode::kStoreStaticTOS:
     case KernelBytecode::kPushStatic:
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index 9d9b45e..756e5d4 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -308,7 +308,7 @@
   }
 
   const char* NameOfCPURegister(int reg) const {
-    return compiler::Assembler::RegisterName(static_cast<Register>(reg));
+    return RegisterNames::RegisterName(static_cast<Register>(reg));
   }
 
   const char* NameOfByteCPURegister(int reg) const {
diff --git a/runtime/vm/compiler/backend/block_builder.h b/runtime/vm/compiler/backend/block_builder.h
index 0337556..22557d7 100644
--- a/runtime/vm/compiler/backend/block_builder.h
+++ b/runtime/vm/compiler/backend/block_builder.h
@@ -28,13 +28,15 @@
     return def;
   }
 
-  Definition* AddDefinition(Definition* def) {
+  template <typename T>
+  T* AddDefinition(T* def) {
     def->set_ssa_temp_index(flow_graph_->alloc_ssa_temp_index());
     AddInstruction(def);
     return def;
   }
 
-  Instruction* AddInstruction(Instruction* instr) {
+  template <typename T>
+  T* AddInstruction(T* instr) {
     if (instr->ComputeCanDeoptimize()) {
       // All instructions that can deoptimize must have an environment attached
       // to them.
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index a33c17b..d27b6e2 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1326,6 +1326,10 @@
   SetValue(instr, non_constant_);
 }
 
+void ConstantPropagator::VisitBitCast(BitCastInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
 void ConstantPropagator::VisitUnaryUint32Op(UnaryUint32OpInstr* instr) {
   // TODO(kmillikin): Handle unary operations.
   SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index e4e02d5..40eac02 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -497,10 +497,6 @@
   // If the receiver can have the null value, exclude any method
   // that is actually valid on a null receiver.
   if (receiver_maybe_null) {
-#ifdef TARGET_ARCH_DBC
-    // TODO(ajcbik): DBC does not support null check at all yet.
-    return ToCheck::kCheckCid;
-#else
     const Class& null_class =
         Class::Handle(zone(), isolate()->object_store()->null_class());
     const Function& target = Function::Handle(
@@ -509,7 +505,6 @@
     if (!target.IsNull()) {
       return ToCheck::kCheckCid;
     }
-#endif
   }
 
   // Use CHA to determine if the method is not overridden by any subclass
@@ -1053,6 +1048,8 @@
       }
     }
 
+    const intptr_t var_length =
+        IsCompiledForOsr() ? osr_variable_count() : variable_count();
     while (!worklist.is_empty()) {
       BlockEntryInstr* current = worklist.RemoveLast();
       // Ensure a phi for each block in the dominance frontier of current.
@@ -1063,7 +1060,7 @@
           BlockEntryInstr* block = preorder[index];
           ASSERT(block->IsJoinEntry());
           PhiInstr* phi =
-              block->AsJoinEntry()->InsertPhi(var_index, variable_count());
+              block->AsJoinEntry()->InsertPhi(var_index, var_length);
           if (always_live) {
             phi->mark_alive();
             live_phis->Add(phi);
@@ -1079,17 +1076,26 @@
   }
 }
 
+void FlowGraph::CreateCommonConstants() {
+  constant_null_ = GetConstant(Object::ZoneHandle());
+  constant_dead_ = GetConstant(Symbols::OptimizedOut());
+}
+
 void FlowGraph::Rename(GrowableArray<PhiInstr*>* live_phis,
                        VariableLivenessAnalysis* variable_liveness,
                        ZoneGrowableArray<Definition*>* inlining_parameters) {
   GraphEntryInstr* entry = graph_entry();
 
   // Add global constants to the initial definitions.
-  constant_null_ = GetConstant(Object::ZoneHandle());
-  constant_dead_ = GetConstant(Symbols::OptimizedOut());
+  CreateCommonConstants();
 
+  // During regular execution, only the direct parameters appear in
+  // the fixed part of the environment. During OSR, however, all
+  // variables and possibly a non-empty stack are passed as
+  // parameters. The latter mimics the incoming expression stack
+  // that was set up prior to triggering OSR.
   const intptr_t parameter_count =
-      IsCompiledForOsr() ? variable_count() : num_direct_parameters_;
+      IsCompiledForOsr() ? osr_variable_count() : num_direct_parameters_;
 
   // Initial renaming environment.
   GrowableArray<Definition*> env(parameter_count + num_stack_locals());
@@ -1107,7 +1113,6 @@
     ASSERT(entry->unchecked_entry() != nullptr ? entry->SuccessorCount() == 2
                                                : entry->SuccessorCount() == 1);
   }
-
   RenameRecursive(entry, &env, live_phis, variable_liveness,
                   inlining_parameters);
 }
@@ -1125,6 +1130,7 @@
   const intptr_t inlined_type_args_param =
       ((inlining_parameters != NULL) && function().IsGeneric()) ? 1 : 0;
 
+  ASSERT(parameter_count <= env->length());
   for (intptr_t i = 0; i < parameter_count; i++) {
     ParameterInstr* param = new (zone()) ParameterInstr(i, function_entry);
     param->set_ssa_temp_index(alloc_ssa_temp_index());
@@ -1182,13 +1188,26 @@
     OsrEntryInstr* osr_entry,
     GrowableArray<Definition*>* env) {
   ASSERT(IsCompiledForOsr());
-  const intptr_t parameter_count = variable_count();
+  const intptr_t parameter_count = osr_variable_count();
+  // Initialize the initial enviroment.
+  ASSERT(parameter_count <= env->length());
   for (intptr_t i = 0; i < parameter_count; i++) {
     ParameterInstr* param = new (zone()) ParameterInstr(i, osr_entry);
     param->set_ssa_temp_index(alloc_ssa_temp_index());
     AddToInitialDefinitions(osr_entry, param);
     (*env)[i] = param;
   }
+  // For OSR on a non-emtpy stack, insert synthetic phis on the joining entry.
+  // These phis are synthetic since they are not driven by live variable
+  // analysis, but merely serve the purpose of merging stack slots from
+  // parameters and other predecessors at the block in which OSR occurred.
+  JoinEntryInstr* join =
+      osr_entry->last_instruction()->SuccessorAt(0)->AsJoinEntry();
+  ASSERT(join != nullptr);
+  for (intptr_t i = variable_count(); i < parameter_count; i++) {
+    PhiInstr* phi = join->InsertPhi(i, parameter_count);
+    phi->mark_alive();
+  }
 }
 
 void FlowGraph::PopulateEnvironmentFromCatchEntry(
@@ -1204,7 +1223,8 @@
           : -1;
 
   // Add real definitions for all locals and parameters.
-  for (intptr_t i = 0; i < variable_count(); ++i) {
+  ASSERT(variable_count() <= env->length());
+  for (intptr_t i = 0, n = variable_count(); i < n; ++i) {
     // Replace usages of the raw exception/stacktrace variables with
     // [SpecialParameterInstr]s.
     Definition* param = nullptr;
@@ -1247,10 +1267,13 @@
     ZoneGrowableArray<Definition*>* inlining_parameters) {
   // 1. Process phis first.
   if (auto join = block_entry->AsJoinEntry()) {
-    if (join->phis() != NULL) {
-      for (intptr_t i = 0; i < join->phis()->length(); ++i) {
+    if (join->phis() != nullptr) {
+      const intptr_t var_length =
+          IsCompiledForOsr() ? osr_variable_count() : variable_count();
+      ASSERT(join->phis()->length() == var_length);
+      for (intptr_t i = 0; i < var_length; ++i) {
         PhiInstr* phi = (*join->phis())[i];
-        if (phi != NULL) {
+        if (phi != nullptr) {
           (*env)[i] = phi;
           AllocateSSAIndexes(phi);  // New SSA temp.
           if (block_entry->InsideTryBlock() && !phi->is_alive()) {
@@ -1290,7 +1313,6 @@
     }
   }
 
-
   // Attach environment to the block entry.
   AttachEnvironment(block_entry, env);
 
@@ -1334,7 +1356,6 @@
       Value* v = current->InputAt(i);
       // Update expression stack.
       ASSERT(env->length() > variable_count());
-
       Definition* reaching_defn = env->RemoveLast();
       Definition* input_defn = v->definition();
       if (input_defn != reaching_defn) {
@@ -1350,12 +1371,37 @@
       input_defn->AddInputUse(v);
     }
 
-    // Drop pushed arguments for calls.
-    for (intptr_t j = 0; j < current->ArgumentCount(); j++) {
-      env->RemoveLast();
+    // 2b. Handle arguments. Usually this just consists of popping
+    // all consumed parameters from the expression stack. However,
+    // during OSR with a non-empty stack, PushArguments may have
+    // been lost (since the defining value resides in the now
+    // removed original entry).
+    Instruction* insert_at = current;  // keeps push arguments in order
+    for (intptr_t i = current->ArgumentCount() - 1; i >= 0; --i) {
+      // Update expression stack.
+      ASSERT(env->length() > variable_count());
+      Definition* reaching_defn = env->RemoveLast();
+      if (reaching_defn->IsPushArgument()) {
+        insert_at = reaching_defn;
+      } else {
+        // We lost the PushArgument! This situation can only happen
+        // during OSR with a non-empty stack: replace the argument
+        // with the incoming parameter that mimics the stack slot.
+        ASSERT(IsCompiledForOsr());
+        PushArgumentInstr* push_arg = current->PushArgumentAt(i);
+        ASSERT(push_arg->IsPushArgument());
+        ASSERT(reaching_defn->ssa_temp_index() != -1);
+        ASSERT(reaching_defn->IsPhi());
+        push_arg->previous()->LinkTo(push_arg->next());
+        push_arg->set_previous(nullptr);
+        push_arg->set_next(nullptr);
+        push_arg->value()->set_definition(reaching_defn);
+        InsertBefore(insert_at, push_arg, nullptr, FlowGraph::kEffect);
+        insert_at = push_arg;
+      }
     }
 
-    // 2b. Handle LoadLocal/StoreLocal/MakeTemp/DropTemps/Constant and
+    // 2c. Handle LoadLocal/StoreLocal/MakeTemp/DropTemps/Constant and
     // PushArgument specially. Other definitions are just pushed
     // to the environment directly.
     Definition* result = NULL;
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 48f4ff0..67f47ce 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -120,6 +120,13 @@
     return num_direct_parameters_ + parsed_function_.num_stack_locals();
   }
 
+  // The number of variables during OSR, which may include stack slots
+  // that pass in initial contents for the expression stack.
+  intptr_t osr_variable_count() const {
+    ASSERT(IsCompiledForOsr());
+    return variable_count() + graph_entry()->osr_entry()->stack_depth();
+  }
+
   // The number of variables (or boxes) inside the functions frame - meaning
   // below the frame pointer.  This does not include the expression stack.
   intptr_t num_stack_locals() const {
@@ -415,6 +422,8 @@
   // SSA transformation methods and fields.
   void ComputeDominators(GrowableArray<BitVector*>* dominance_frontier);
 
+  void CreateCommonConstants();
+
  private:
   friend class FlowGraphCompiler;  // TODO(ajcbik): restructure
   friend class FlowGraphChecker;
diff --git a/runtime/vm/compiler/backend/flow_graph_checker.cc b/runtime/vm/compiler/backend/flow_graph_checker.cc
index a07ed6d..3b9481f 100644
--- a/runtime/vm/compiler/backend/flow_graph_checker.cc
+++ b/runtime/vm/compiler/backend/flow_graph_checker.cc
@@ -119,6 +119,7 @@
   }
   // Visit regular instructions.
   Instruction* last = block->last_instruction();
+  ASSERT((last == block) == block->IsGraphEntry());
   Instruction* prev = block;
   ASSERT(prev->previous() == nullptr);
   for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 54f1e50..9e5377b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -81,7 +81,8 @@
         it.CurrentValue()->definition()->IsPushArgument()) {
       it.SetCurrentLocation(Location::StackSlot(
           compiler::target::frame_layout.FrameSlotForVariableIndex(
-              -*stack_height)));
+              -*stack_height),
+          FPREG));
       (*stack_height)++;
     }
   }
@@ -559,6 +560,14 @@
     StatsEnd(entry);
     pending_deoptimization_env_ = NULL;
     EndCodeSourceRange(entry->token_pos());
+
+    // The function was fully intrinsified, so there's no need to generate any
+    // more code.
+    if (fully_intrinsified_) {
+      ASSERT(entry == flow_graph().graph_entry()->normal_entry());
+      break;
+    }
+
     // Compile all successors until an exit, branch, or a block entry.
     for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
       Instruction* instr = it.Current();
@@ -614,6 +623,14 @@
   }
 }
 
+intptr_t FlowGraphCompiler::ExtraStackSlotsOnOsrEntry() const {
+  ASSERT(flow_graph().IsCompiledForOsr());
+  const intptr_t stack_depth =
+      flow_graph().graph_entry()->osr_entry()->stack_depth();
+  const intptr_t num_stack_locals = flow_graph().num_stack_locals();
+  return StackSize() - stack_depth - num_stack_locals;
+}
+
 Label* FlowGraphCompiler::GetJumpLabel(BlockEntryInstr* block_entry) const {
   const intptr_t block_index = block_entry->postorder_number();
   return block_info_[block_index]->jump_label();
@@ -952,8 +969,8 @@
   for (Environment::DeepIterator it(env); !it.Done(); it.Advance()) {
     Location loc = it.CurrentLocation();
     Value* value = it.CurrentValue();
-    it.SetCurrentLocation(loc.RemapForSlowPath(value->definition(),
-                                               cpu_reg_slots, fpu_reg_slots));
+    it.SetCurrentLocation(LocationRemapForSlowPath(
+        loc, value->definition(), cpu_reg_slots, fpu_reg_slots));
   }
 
   return env;
@@ -1154,6 +1171,14 @@
 
 // Returns 'true' if regular code generation should be skipped.
 bool FlowGraphCompiler::TryIntrinsify() {
+  if (TryIntrinsifyHelper()) {
+    fully_intrinsified_ = true;
+    return true;
+  }
+  return false;
+}
+
+bool FlowGraphCompiler::TryIntrinsifyHelper() {
   Label exit;
   set_intrinsic_slow_path_label(&exit);
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 8cfee57..56046747 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -243,8 +243,6 @@
   }
 };
 
-#if !defined(TARGET_ARCH_DBC)
-
 // Slow path code which calls runtime entry to throw an exception.
 class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
  public:
@@ -298,8 +296,6 @@
   }
 };
 
-#endif  // !defined(TARGET_ARCH_DBC)
-
 class FlowGraphCompiler : public ValueObject {
  private:
   class BlockInfo : public ZoneAllocated {
@@ -639,8 +635,15 @@
 
   void EmitComment(Instruction* instr);
 
+  // Returns stack size (number of variables on stack for unoptimized
+  // code, or number of spill slots for optimized code).
   intptr_t StackSize() const;
 
+  // Returns the number of extra stack slots used during an Osr entry
+  // (values for all [ParameterInstr]s, representing local variables
+  // and expression stack values, are already on the stack).
+  intptr_t ExtraStackSlotsOnOsrEntry() const;
+
   // Returns assembler label associated with the given block entry.
   Label* GetJumpLabel(BlockEntryInstr* block_entry) const;
   bool WasCompacted(BlockEntryInstr* block_entry) const;
@@ -814,6 +817,7 @@
 
   void EmitFrameEntry();
 
+  bool TryIntrinsifyHelper();
   void AddPcRelativeCallTarget(const Function& function,
                                Code::EntryKind entry_kind);
   void AddPcRelativeCallStubTarget(const Code& stub_code);
@@ -1027,6 +1031,7 @@
   // True while emitting intrinsic code.
   bool intrinsic_mode_;
   Label* intrinsic_slow_path_label_ = nullptr;
+  bool fully_intrinsified_ = false;
   CodeStatistics* stats_;
 
   const Class& double_class_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 47ba86e..04a4a85 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -886,7 +886,7 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
+    const intptr_t extra_slots = ExtraStackSlotsOnOsrEntry();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -943,8 +943,11 @@
   VisitBlocks();
 
   __ bkpt(0);
-  ASSERT(assembler()->constant_pool_allowed());
-  GenerateDeferredCode();
+
+  if (!fully_intrinsified_) {
+    ASSERT(assembler()->constant_pool_allowed());
+    GenerateDeferredCode();
+  }
 }
 
 void FlowGraphCompiler::GenerateCall(TokenPosition token_pos,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index fe52d41..943aaec 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -870,7 +870,7 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
+    const intptr_t extra_slots = ExtraStackSlotsOnOsrEntry();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize, new_pp);
   } else {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index 09c490bd..892cdb5 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -113,7 +113,8 @@
         NULL,
         Location::StackSlot(
             compiler::target::frame_layout.FrameSlotForVariableIndex(
-                -stack_height)),
+                -stack_height),
+            FPREG),
         slot_ix++);
   }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index b1c4671..dfa2fc7 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -727,7 +727,7 @@
       __ PushObject(value.constant());
     } else {
       ASSERT(value.IsStackSlot());
-      __ pushl(value.ToStackSlotAddress());
+      __ pushl(LocationToStackSlotAddress(value));
     }
   }
 }
@@ -779,7 +779,7 @@
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
+    intptr_t extra_slots = ExtraStackSlotsOnOsrEntry();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -990,8 +990,8 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id, token_pos,
-                         RawPcDescriptors::kOther, locs, function);
+  GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
+                         function);
   __ Drop(count_with_type_args);
 }
 
@@ -1182,15 +1182,15 @@
       __ movl(destination.reg(), source.reg());
     } else {
       ASSERT(destination.IsStackSlot());
-      __ movl(destination.ToStackSlotAddress(), source.reg());
+      __ movl(LocationToStackSlotAddress(destination), source.reg());
     }
   } else if (source.IsStackSlot()) {
     if (destination.IsRegister()) {
-      __ movl(destination.reg(), source.ToStackSlotAddress());
+      __ movl(destination.reg(), LocationToStackSlotAddress(source));
     } else {
       ASSERT(destination.IsStackSlot());
-      MoveMemoryToMemory(destination.ToStackSlotAddress(),
-                         source.ToStackSlotAddress());
+      MoveMemoryToMemory(LocationToStackSlotAddress(destination),
+                         LocationToStackSlotAddress(source));
     }
   } else if (source.IsFpuRegister()) {
     if (destination.IsFpuRegister()) {
@@ -1199,27 +1199,27 @@
       __ movaps(destination.fpu_reg(), source.fpu_reg());
     } else {
       if (destination.IsDoubleStackSlot()) {
-        __ movsd(destination.ToStackSlotAddress(), source.fpu_reg());
+        __ movsd(LocationToStackSlotAddress(destination), source.fpu_reg());
       } else {
         ASSERT(destination.IsQuadStackSlot());
-        __ movups(destination.ToStackSlotAddress(), source.fpu_reg());
+        __ movups(LocationToStackSlotAddress(destination), source.fpu_reg());
       }
     }
   } else if (source.IsDoubleStackSlot()) {
     if (destination.IsFpuRegister()) {
-      __ movsd(destination.fpu_reg(), source.ToStackSlotAddress());
+      __ movsd(destination.fpu_reg(), LocationToStackSlotAddress(source));
     } else {
       ASSERT(destination.IsDoubleStackSlot());
-      __ movsd(XMM0, source.ToStackSlotAddress());
-      __ movsd(destination.ToStackSlotAddress(), XMM0);
+      __ movsd(XMM0, LocationToStackSlotAddress(source));
+      __ movsd(LocationToStackSlotAddress(destination), XMM0);
     }
   } else if (source.IsQuadStackSlot()) {
     if (destination.IsFpuRegister()) {
-      __ movups(destination.fpu_reg(), source.ToStackSlotAddress());
+      __ movups(destination.fpu_reg(), LocationToStackSlotAddress(source));
     } else {
       ASSERT(destination.IsQuadStackSlot());
-      __ movups(XMM0, source.ToStackSlotAddress());
-      __ movups(destination.ToStackSlotAddress(), XMM0);
+      __ movups(XMM0, LocationToStackSlotAddress(source));
+      __ movups(LocationToStackSlotAddress(destination), XMM0);
     }
   } else {
     ASSERT(source.IsConstant());
@@ -1237,11 +1237,12 @@
   if (source.IsRegister() && destination.IsRegister()) {
     __ xchgl(destination.reg(), source.reg());
   } else if (source.IsRegister() && destination.IsStackSlot()) {
-    Exchange(source.reg(), destination.ToStackSlotAddress());
+    Exchange(source.reg(), LocationToStackSlotAddress(destination));
   } else if (source.IsStackSlot() && destination.IsRegister()) {
-    Exchange(destination.reg(), source.ToStackSlotAddress());
+    Exchange(destination.reg(), LocationToStackSlotAddress(source));
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
-    Exchange(destination.ToStackSlotAddress(), source.ToStackSlotAddress());
+    Exchange(LocationToStackSlotAddress(destination),
+             LocationToStackSlotAddress(source));
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
     __ movaps(XMM0, source.fpu_reg());
     __ movaps(source.fpu_reg(), destination.fpu_reg());
@@ -1254,8 +1255,8 @@
     XmmRegister reg =
         source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
     const Address& slot_address = source.IsFpuRegister()
-                                      ? destination.ToStackSlotAddress()
-                                      : source.ToStackSlotAddress();
+                                      ? LocationToStackSlotAddress(destination)
+                                      : LocationToStackSlotAddress(source);
 
     if (double_width) {
       __ movsd(XMM0, slot_address);
@@ -1266,8 +1267,9 @@
     }
     __ movaps(reg, XMM0);
   } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
-    const Address& source_slot_address = source.ToStackSlotAddress();
-    const Address& destination_slot_address = destination.ToStackSlotAddress();
+    const Address& source_slot_address = LocationToStackSlotAddress(source);
+    const Address& destination_slot_address =
+        LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, XMM0);
     __ movsd(XMM0, source_slot_address);
@@ -1275,8 +1277,9 @@
     __ movsd(destination_slot_address, XMM0);
     __ movsd(source_slot_address, ensure_scratch.reg());
   } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
-    const Address& source_slot_address = source.ToStackSlotAddress();
-    const Address& destination_slot_address = destination.ToStackSlotAddress();
+    const Address& source_slot_address = LocationToStackSlotAddress(source);
+    const Address& destination_slot_address =
+        LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, XMM0);
     __ movups(XMM0, source_slot_address);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 1a1a007..192a903 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -648,11 +648,11 @@
   Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
-    __ PushObject(Object::null_object());       // Make room for the result.
-    __ pushq(RAX);                              // Push the instance.
-    __ PushObject(type);                        // Push the type.
-    __ pushq(RDX);                              // Instantiator type arguments.
-    __ pushq(RCX);                              // Function type arguments.
+    __ PushObject(Object::null_object());  // Make room for the result.
+    __ pushq(RAX);                         // Push the instance.
+    __ PushObject(type);                   // Push the type.
+    __ pushq(RDX);                         // Instantiator type arguments.
+    __ pushq(RCX);                         // Function type arguments.
     __ LoadUniqueObject(RAX, test_cache);
     __ pushq(RAX);
     GenerateRuntimeCall(token_pos, deopt_id, kInstanceofRuntimeEntry, 5, locs);
@@ -787,7 +787,7 @@
       __ PushObject(value.constant());
     } else {
       ASSERT(value.IsStackSlot());
-      __ pushq(value.ToStackSlotAddress());
+      __ pushq(LocationToStackSlotAddress(value));
     }
   }
 }
@@ -854,7 +854,7 @@
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
   if (flow_graph().IsCompiledForOsr()) {
-    intptr_t extra_slots = StackSize() - flow_graph().num_stack_locals();
+    const intptr_t extra_slots = ExtraStackSlotsOnOsrEntry();
     ASSERT(extra_slots >= 0);
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
@@ -932,8 +932,11 @@
   VisitBlocks();
 
   __ int3();
-  ASSERT(assembler()->constant_pool_allowed());
-  GenerateDeferredCode();
+
+  if (!fully_intrinsified_) {
+    ASSERT(assembler()->constant_pool_allowed());
+    GenerateDeferredCode();
+  }
 }
 
 void FlowGraphCompiler::GenerateCall(TokenPosition token_pos,
@@ -1151,8 +1154,8 @@
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
-  GenerateStaticDartCall(deopt_id, token_pos,
-                         RawPcDescriptors::kOther, locs, function, entry_kind);
+  GenerateStaticDartCall(deopt_id, token_pos, RawPcDescriptors::kOther, locs,
+                         function, entry_kind);
   __ Drop(count_with_type_args, RCX);
 }
 
@@ -1308,18 +1311,18 @@
       ASSERT((destination.base_reg() != FPREG) ||
              ((-compiler::target::frame_layout.VariableIndexForFrameSlot(
                   destination.stack_index())) < compiler_->StackSize()));
-      __ movq(destination.ToStackSlotAddress(), source.reg());
+      __ movq(LocationToStackSlotAddress(destination), source.reg());
     }
   } else if (source.IsStackSlot()) {
     ASSERT((source.base_reg() != FPREG) ||
            ((-compiler::target::frame_layout.VariableIndexForFrameSlot(
                 source.stack_index())) < compiler_->StackSize()));
     if (destination.IsRegister()) {
-      __ movq(destination.reg(), source.ToStackSlotAddress());
+      __ movq(destination.reg(), LocationToStackSlotAddress(source));
     } else {
       ASSERT(destination.IsStackSlot());
-      MoveMemoryToMemory(destination.ToStackSlotAddress(),
-                         source.ToStackSlotAddress());
+      MoveMemoryToMemory(LocationToStackSlotAddress(destination),
+                         LocationToStackSlotAddress(source));
     }
   } else if (source.IsFpuRegister()) {
     if (destination.IsFpuRegister()) {
@@ -1328,27 +1331,27 @@
       __ movaps(destination.fpu_reg(), source.fpu_reg());
     } else {
       if (destination.IsDoubleStackSlot()) {
-        __ movsd(destination.ToStackSlotAddress(), source.fpu_reg());
+        __ movsd(LocationToStackSlotAddress(destination), source.fpu_reg());
       } else {
         ASSERT(destination.IsQuadStackSlot());
-        __ movups(destination.ToStackSlotAddress(), source.fpu_reg());
+        __ movups(LocationToStackSlotAddress(destination), source.fpu_reg());
       }
     }
   } else if (source.IsDoubleStackSlot()) {
     if (destination.IsFpuRegister()) {
-      __ movsd(destination.fpu_reg(), source.ToStackSlotAddress());
+      __ movsd(destination.fpu_reg(), LocationToStackSlotAddress(source));
     } else {
       ASSERT(destination.IsDoubleStackSlot());
-      __ movsd(XMM0, source.ToStackSlotAddress());
-      __ movsd(destination.ToStackSlotAddress(), XMM0);
+      __ movsd(XMM0, LocationToStackSlotAddress(source));
+      __ movsd(LocationToStackSlotAddress(destination), XMM0);
     }
   } else if (source.IsQuadStackSlot()) {
     if (destination.IsFpuRegister()) {
-      __ movups(destination.fpu_reg(), source.ToStackSlotAddress());
+      __ movups(destination.fpu_reg(), LocationToStackSlotAddress(source));
     } else {
       ASSERT(destination.IsQuadStackSlot());
-      __ movups(XMM0, source.ToStackSlotAddress());
-      __ movups(destination.ToStackSlotAddress(), XMM0);
+      __ movups(XMM0, LocationToStackSlotAddress(source));
+      __ movups(LocationToStackSlotAddress(destination), XMM0);
     }
   } else {
     ASSERT(source.IsConstant());
@@ -1372,11 +1375,12 @@
   if (source.IsRegister() && destination.IsRegister()) {
     __ xchgq(destination.reg(), source.reg());
   } else if (source.IsRegister() && destination.IsStackSlot()) {
-    Exchange(source.reg(), destination.ToStackSlotAddress());
+    Exchange(source.reg(), LocationToStackSlotAddress(destination));
   } else if (source.IsStackSlot() && destination.IsRegister()) {
-    Exchange(destination.reg(), source.ToStackSlotAddress());
+    Exchange(destination.reg(), LocationToStackSlotAddress(source));
   } else if (source.IsStackSlot() && destination.IsStackSlot()) {
-    Exchange(destination.ToStackSlotAddress(), source.ToStackSlotAddress());
+    Exchange(LocationToStackSlotAddress(destination),
+             LocationToStackSlotAddress(source));
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
     __ movaps(XMM0, source.fpu_reg());
     __ movaps(source.fpu_reg(), destination.fpu_reg());
@@ -1389,8 +1393,8 @@
     XmmRegister reg =
         source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
     Address slot_address = source.IsFpuRegister()
-                               ? destination.ToStackSlotAddress()
-                               : source.ToStackSlotAddress();
+                               ? LocationToStackSlotAddress(destination)
+                               : LocationToStackSlotAddress(source);
 
     if (double_width) {
       __ movsd(XMM0, slot_address);
@@ -1401,8 +1405,9 @@
     }
     __ movaps(reg, XMM0);
   } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
-    const Address& source_slot_address = source.ToStackSlotAddress();
-    const Address& destination_slot_address = destination.ToStackSlotAddress();
+    const Address& source_slot_address = LocationToStackSlotAddress(source);
+    const Address& destination_slot_address =
+        LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, XMM0);
     __ movsd(XMM0, source_slot_address);
@@ -1410,8 +1415,9 @@
     __ movsd(destination_slot_address, XMM0);
     __ movsd(source_slot_address, ensure_scratch.reg());
   } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
-    const Address& source_slot_address = source.ToStackSlotAddress();
-    const Address& destination_slot_address = destination.ToStackSlotAddress();
+    const Address& source_slot_address = LocationToStackSlotAddress(source);
+    const Address& destination_slot_address =
+        LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, XMM0);
     __ movups(XMM0, source_slot_address);
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 6c2c344..92b725f 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -494,24 +494,33 @@
 
 Definition* Definition::OriginalDefinition() {
   Definition* defn = this;
-  while (true) {
-    if (auto redefinition = defn->AsRedefinition()) {
-      defn = redefinition->value()->definition();
-    } else if (auto assert_assignable = defn->AsAssertAssignable()) {
-      defn = assert_assignable->value()->definition();
-    } else if (auto check_array_bound = defn->AsCheckArrayBound()) {
-      defn = check_array_bound->index()->definition();
-    } else if (auto check_bound = defn->AsGenericCheckBound()) {
-      defn = check_bound->index()->definition();
-    } else if (auto check_null = defn->AsCheckNull()) {
-      defn = check_null->value()->definition();
-    } else {
-      break;
-    }
+  Value* unwrapped;
+  while ((unwrapped = defn->RedefinedValue()) != nullptr) {
+    defn = unwrapped->definition();
   }
   return defn;
 }
 
+Value* Definition::RedefinedValue() const {
+  return nullptr;
+}
+
+Value* RedefinitionInstr::RedefinedValue() const {
+  return value();
+}
+
+Value* AssertAssignableInstr::RedefinedValue() const {
+  return value();
+}
+
+Value* CheckBoundBase::RedefinedValue() const {
+  return index();
+}
+
+Value* CheckNullInstr::RedefinedValue() const {
+  return value();
+}
+
 Definition* Definition::OriginalDefinitionIgnoreBoxingAndConstraints() {
   Definition* def = this;
   while (true) {
@@ -1514,10 +1523,11 @@
       // we can simply jump to the beginning of the block.
       ASSERT(instr->previous() == this);
 
+      const intptr_t stack_depth = instr->AsCheckStackOverflow()->stack_depth();
       auto normal_entry = graph_entry->normal_entry();
       auto osr_entry = new OsrEntryInstr(graph_entry, normal_entry->block_id(),
                                          normal_entry->try_index(),
-                                         normal_entry->deopt_id());
+                                         normal_entry->deopt_id(), stack_depth);
 
       auto goto_join = new GotoInstr(AsJoinEntry(),
                                      CompilerState::Current().GetNextDeoptId());
@@ -2407,13 +2417,21 @@
       } else if (rhs == 0) {
         return right()->definition();
       } else if (rhs == 2) {
+        const int64_t shift_1 = 1;
         ConstantInstr* constant_1 =
-            flow_graph->GetConstant(Smi::Handle(Smi::New(1)));
+            flow_graph->GetConstant(Smi::Handle(Smi::New(shift_1)));
         BinaryIntegerOpInstr* shift = BinaryIntegerOpInstr::Make(
             representation(), Token::kSHL, left()->CopyWithType(),
             new Value(constant_1), GetDeoptId(), can_overflow(),
             is_truncating(), range(), speculative_mode());
-        if (shift != NULL) {
+        if (shift != nullptr) {
+          // Assign a range to the shift factor, just in case range
+          // analysis no longer runs after this rewriting.
+          if (auto shift_with_range = shift->AsShiftIntegerOp()) {
+            shift_with_range->set_shift_range(
+                new Range(RangeBoundary::FromConstant(shift_1),
+                          RangeBoundary::FromConstant(shift_1)));
+          }
           flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue);
           return shift;
         }
@@ -2542,8 +2560,7 @@
   if (!HasUses() && !flow_graph->is_licm_allowed()) {
     return NULL;
   }
-  if ((constrained_type() != NULL) &&
-      Type()->IsEqualTo(value()->definition()->Type())) {
+  if ((constrained_type() != nullptr) && Type()->IsEqualTo(value()->Type())) {
     return value()->definition();
   }
   return this;
@@ -3765,14 +3782,11 @@
       compiler->SpecialStatsEnd(CombinedCodeStatistics::kTagCheckedEntry);
     }
   }
-  // NOTE: Because in JIT X64/ARM mode the graph can have multiple
-  // entrypoints, so we generate several times the same intrinsification &
-  // frame setup.  That's why we cannot rely on the constant pool being
-  // `false` when we come in here.
+  // NOTE: Because in X64/ARM mode the graph can have multiple entrypoints, we
+  // generate several times the same intrinsification & frame setup. That's why
+  // we cannot rely on the constant pool being `false` when we come in here.
   __ set_constant_pool_allowed(false);
-  // TODO(#34162): Don't emit more code if 'TryIntrinsify' returns 'true'
-  // (meaning the function was fully intrinsified).
-  compiler->TryIntrinsify();
+  if (compiler->TryIntrinsify()) return;
   compiler->EmitPrologue();
   ASSERT(__ constant_pool_allowed());
 #endif
@@ -3951,8 +3965,8 @@
   registers_remapped_ = true;
 
   for (intptr_t i = 0; i < InputCount(); i++) {
-    locations_[i] = LocationAt(i).RemapForSlowPath(
-        InputAt(i)->definition(), cpu_reg_slots, fpu_reg_slots);
+    locations_[i] = LocationRemapForSlowPath(
+        LocationAt(i), InputAt(i)->definition(), cpu_reg_slots, fpu_reg_slots);
   }
 }
 
@@ -4600,7 +4614,8 @@
   return locs;
 }
 
-#if !defined(TARGET_ARCH_DBC)
+#endif  // !defined(TARGET_ARCH_DBC)
+
 void CheckNullInstr::AddMetadataForRuntimeCall(CheckNullInstr* check_null,
                                                FlowGraphCompiler* compiler) {
   const String& function_name = check_null->function_name();
@@ -4609,7 +4624,8 @@
   compiler->AddNullCheck(compiler->assembler()->CodeSize(),
                          check_null->token_pos(), name_index);
 }
-#endif  // !defined(TARGET_ARCH_DBC)
+
+#if !defined(TARGET_ARCH_DBC)
 
 void UnboxInstr::EmitLoadFromBoxWithDeopt(FlowGraphCompiler* compiler) {
   const intptr_t box_cid = BoxCid();
@@ -5199,8 +5215,19 @@
   set_native_c_function(native_function);
 }
 
-#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64) ||                  \
-    defined(TARGET_ARCH_IA32)
+#if !defined(TARGET_ARCH_ARM)
+
+LocationSummary* BitCastInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  UNREACHABLE();
+}
+
+void BitCastInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNREACHABLE();
+}
+
+#endif  // defined(TARGET_ARCH_ARM)
+
+#if !defined(TARGET_ARCH_DBC)
 
 #define Z zone_
 
@@ -5219,7 +5246,8 @@
   ASSERT(((1 << CallingConventions::kFirstCalleeSavedCpuReg) &
           CallingConventions::kArgumentRegisters) == 0);
 
-#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_IA32)
+#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_IA32) ||                 \
+    defined(TARGET_ARCH_ARM)
   constexpr intptr_t kNumTemps = 2;
 #else
   constexpr intptr_t kNumTemps = 1;
@@ -5234,7 +5262,8 @@
                       CallingConventions::kFirstNonArgumentRegister));
   summary->set_temp(0, Location::RegisterLocation(
                            CallingConventions::kSecondNonArgumentRegister));
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM64)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM64) ||                 \
+    defined(TARGET_ARCH_ARM)
   summary->set_temp(1, Location::RegisterLocation(
                            CallingConventions::kFirstCalleeSavedCpuReg));
 #endif
@@ -5246,8 +5275,15 @@
     // register or a contiguous 64-bit slot on the stack. Unboxed 64-bit integer
     // values, in contrast, can be split between any two registers on a 32-bit
     // system.
+    //
+    // There is an exception for iOS and Android 32-bit ARM, where
+    // floating-point values are treated as integers as far as the calling
+    // convention is concerned. However, the representation of these arguments
+    // are set to kUnboxedInt32 or kUnboxedInt64 already, so we don't have to
+    // account for that here.
     const bool is_atomic = arg_representations_[i] == kUnboxedFloat ||
                            arg_representations_[i] == kUnboxedDouble;
+
     // Since we have to move this input down to the stack, there's no point in
     // pinning it to any specific register.
     summary->set_in(i, UnallocateStackSlots(arg_locations_[i], is_atomic));
@@ -5293,7 +5329,7 @@
   UNREACHABLE();
 }
 
-#endif
+#endif  // !defined(TARGET_ARCH_DBC)
 
 // SIMD
 
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 3440130..3ce025c 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -453,6 +453,7 @@
   M(BoxInt32, _)                                                               \
   M(UnboxInt32, kNoGC)                                                         \
   M(IntConverter, _)                                                           \
+  M(BitCast, _)                                                                \
   M(UnboxedWidthExtender, _)                                                   \
   M(Deoptimize, kNoGC)                                                         \
   M(SimdOp, kNoGC)
@@ -1621,8 +1622,10 @@
   OsrEntryInstr(GraphEntryInstr* graph_entry,
                 intptr_t block_id,
                 intptr_t try_index,
-                intptr_t deopt_id)
+                intptr_t deopt_id,
+                intptr_t stack_depth)
       : BlockEntryWithInitialDefs(block_id, try_index, deopt_id),
+        stack_depth_(stack_depth),
         graph_entry_(graph_entry) {}
 
   DECLARE_INSTRUCTION(OsrEntry)
@@ -1635,6 +1638,7 @@
     return graph_entry_;
   }
 
+  intptr_t stack_depth() const { return stack_depth_; }
   GraphEntryInstr* graph_entry() const { return graph_entry_; }
 
   PRINT_TO_SUPPORT
@@ -1646,6 +1650,7 @@
     graph_entry_ = predecessor->AsGraphEntry();
   }
 
+  const intptr_t stack_depth_;
   GraphEntryInstr* graph_entry_;
 
   DISALLOW_COPY_AND_ASSIGN(OsrEntryInstr);
@@ -1959,6 +1964,12 @@
   // redefinition and check instructions.
   Definition* OriginalDefinition();
 
+  // If this definition is a redefinition (in a broad sense, this includes
+  // CheckArrayBound and CheckNull instructions) return [Value] corresponding
+  // to the input which is being redefined.
+  // Otherwise return [nullptr].
+  virtual Value* RedefinedValue() const;
+
   // Find the original definition of [this].
   //
   // This is an extension of [OriginalDefinition] which also follows through any
@@ -2801,6 +2812,8 @@
   virtual bool ComputeCanDeoptimize() const { return false; }
   virtual bool HasUnknownSideEffects() const { return false; }
 
+  virtual Value* RedefinedValue() const;
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -3026,6 +3039,8 @@
 
   virtual bool AttributesEqual(Instruction* other) const;
 
+  virtual Value* RedefinedValue() const;
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -5120,7 +5135,11 @@
     if (!length.IsSmi()) return false;
     const intptr_t value = Smi::Cast(length).Value();
     if (value < 0) return false;
-    return !Array::UseCardMarkingForAllocation(value);
+    return WillAllocateNewOrRemembered(value);
+  }
+
+  static bool WillAllocateNewOrRemembered(const intptr_t length) {
+    return !Array::UseCardMarkingForAllocation(length);
   }
 
  private:
@@ -6606,6 +6625,9 @@
 
   Range* shift_range() const { return shift_range_; }
 
+  // Set the range directly (takes ownership).
+  void set_shift_range(Range* shift_range) { shift_range_ = shift_range; }
+
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   DEFINE_INSTRUCTION_TYPE_CHECK(ShiftIntegerOp)
@@ -6806,11 +6828,13 @@
   };
 
   CheckStackOverflowInstr(TokenPosition token_pos,
+                          intptr_t stack_depth,
                           intptr_t loop_depth,
                           intptr_t deopt_id,
-                          Kind kind = kOsrAndPreemption)
+                          Kind kind)
       : TemplateInstruction(deopt_id),
         token_pos_(token_pos),
+        stack_depth_(stack_depth),
         loop_depth_(loop_depth),
         kind_(kind) {
     ASSERT(kind != kOsrOnly || loop_depth > 0);
@@ -6818,6 +6842,7 @@
 
   virtual TokenPosition token_pos() const { return token_pos_; }
   bool in_loop() const { return loop_depth_ > 0; }
+  intptr_t stack_depth() const { return stack_depth_; }
   intptr_t loop_depth() const { return loop_depth_; }
 
   DECLARE_INSTRUCTION(CheckStackOverflow)
@@ -6836,6 +6861,7 @@
 
  private:
   const TokenPosition token_pos_;
+  const intptr_t stack_depth_;
   const intptr_t loop_depth_;
   const Kind kind_;
 
@@ -7381,6 +7407,8 @@
   static void AddMetadataForRuntimeCall(CheckNullInstr* check_null,
                                         FlowGraphCompiler* compiler);
 
+  virtual Value* RedefinedValue() const;
+
  private:
   const TokenPosition token_pos_;
   const String& function_name_;
@@ -7434,6 +7462,7 @@
 
   virtual bool IsCheckBoundBase() { return true; }
   virtual CheckBoundBase* AsCheckBoundBase() { return this; }
+  virtual Value* RedefinedValue() const;
 
   // Give a name to the location/input indices.
   enum { kLengthPos = 0, kIndexPos = 1 };
@@ -7621,6 +7650,56 @@
   DISALLOW_COPY_AND_ASSIGN(IntConverterInstr);
 };
 
+// Moves a floating-point value between CPU and FPU registers. Used to implement
+// "softfp" calling conventions, where FPU arguments/return values are passed in
+// normal CPU registers.
+class BitCastInstr : public TemplateDefinition<1, NoThrow, Pure> {
+ public:
+  BitCastInstr(Representation from, Representation to, Value* value)
+      : TemplateDefinition(DeoptId::kNone),
+        from_representation_(from),
+        to_representation_(to) {
+    ASSERT(from != to);
+    ASSERT(to == kUnboxedInt32 && from == kUnboxedFloat ||
+           to == kUnboxedFloat && from == kUnboxedInt32 ||
+           to == kUnboxedInt64 && from == kUnboxedDouble ||
+           to == kUnboxedDouble && from == kUnboxedInt64);
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  Representation from() const { return from_representation_; }
+  Representation to() const { return to_representation_; }
+
+  virtual bool ComputeCanDeoptimize() const { return false; }
+
+  virtual Representation representation() const { return to(); }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return from();
+  }
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    ASSERT(other->IsBitCast());
+    BitCastInstr* converter = other->AsBitCast();
+    return converter->from() == from() && converter->to() == to();
+  }
+
+  virtual CompileType ComputeType() const { return CompileType::Dynamic(); }
+
+  DECLARE_INSTRUCTION(BitCast);
+
+  PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+  const Representation from_representation_;
+  const Representation to_representation_;
+
+  DISALLOW_COPY_AND_ASSIGN(BitCastInstr);
+};
+
 // Sign- or zero-extends an integer in unboxed 32-bit representation.
 //
 // The choice between sign- and zero- extension is made based on the whether the
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index dd332867..d7dc61d 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -79,7 +79,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::AnyOrConstant(value()));
+  locs->set_in(0, LocationAnyOrConstant(value()));
   return locs;
 }
 
@@ -558,12 +558,12 @@
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RegisterOrConstant(left()));
+    locs->set_in(0, LocationRegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : LocationRegisterOrConstant(right()));
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -794,7 +794,7 @@
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_in(1, LocationRegisterOrConstant(right()));
   return locs;
 }
 
@@ -894,12 +894,12 @@
   ASSERT(operation_cid() == kSmiCid);
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RegisterOrConstant(left()));
+  summary->set_in(0, LocationRegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
   summary->set_in(1, summary->in(0).IsConstant()
                          ? Location::RequiresRegister()
-                         : Location::RegisterOrConstant(right()));
+                         : LocationRegisterOrConstant(right()));
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -983,7 +983,97 @@
 }
 
 void FfiCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNREACHABLE();
+  const Register saved_fp = locs()->temp(0).reg();
+  const Register branch = locs()->in(TargetAddressIndex()).reg();
+
+  // Save frame pointer because we're going to update it when we enter the exit
+  // frame.
+  __ mov(saved_fp, Operand(FPREG));
+
+  // Make a space to put the return address.
+  __ PushImmediate(0);
+
+  // We need to create a dummy "exit frame". It will have a null code object.
+  __ LoadObject(CODE_REG, Object::null_object());
+  __ set_constant_pool_allowed(false);
+  __ EnterDartFrame(0, /*load_pool_pointer=*/false);
+
+  // Reserve space for arguments and align frame before entering C++ world.
+  __ ReserveAlignedFrameSpace(compiler::ffi::NumStackSlots(arg_locations_) *
+                              kWordSize);
+
+  // Load a 32-bit argument, or a 32-bit component of a 64-bit argument.
+  auto load_single_slot = [&](Location from, Location to) {
+    if (!to.IsStackSlot()) return;
+    if (from.IsRegister()) {
+      __ str(from.reg(), LocationToStackSlotAddress(to));
+    } else if (from.IsFpuRegister()) {
+      __ vstrs(EvenSRegisterOf(EvenDRegisterOf(from.fpu_reg())),
+               LocationToStackSlotAddress(to));
+    } else if (from.IsStackSlot() || from.IsDoubleStackSlot()) {
+      ASSERT(from.base_reg() == FPREG);
+      __ ldr(TMP, Address(saved_fp, from.ToStackSlotOffset()));
+      __ str(TMP, LocationToStackSlotAddress(to));
+    } else {
+      UNREACHABLE();
+    }
+  };
+
+  for (intptr_t i = 0, n = NativeArgCount(); i < n; ++i) {
+    Location origin = locs()->in(i);
+    Location target = arg_locations_[i];
+
+    if (target.IsStackSlot()) {
+      load_single_slot(origin, target);
+    } else if (target.IsDoubleStackSlot()) {
+      if (origin.IsFpuRegister()) {
+        __ vstrd(EvenDRegisterOf(origin.fpu_reg()),
+                 LocationToStackSlotAddress(target));
+      } else {
+        ASSERT(origin.IsDoubleStackSlot() && origin.base_reg() == FPREG);
+        __ vldrd(DTMP, Address(saved_fp, origin.ToStackSlotOffset()));
+        __ vstrd(DTMP, LocationToStackSlotAddress(target));
+      }
+    } else if (target.IsPairLocation()) {
+      ASSERT(origin.IsPairLocation());
+      load_single_slot(origin.AsPairLocation()->At(0),
+                       target.AsPairLocation()->At(0));
+      load_single_slot(origin.AsPairLocation()->At(1),
+                       target.AsPairLocation()->At(1));
+    }
+  }
+
+  // We need to copy the return address up into the dummy stack frame so the
+  // stack walker will know which safepoint to use.
+  __ mov(TMP, Operand(PC));
+  __ str(TMP, Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize));
+
+  // For historical reasons, the PC on ARM points 8 bytes past the current
+  // instruction. Therefore we emit the metadata here, 8 bytes (2 instructions)
+  // after the original mov.
+  compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
+                                 RawPcDescriptors::Kind::kOther, locs());
+
+  // Update information in the thread object and enter a safepoint.
+  __ TransitionGeneratedToNative(branch, saved_fp, locs()->temp(1).reg());
+
+  __ blx(branch);
+
+  // Update information in the thread object and leave the safepoint.
+  __ TransitionNativeToGenerated(saved_fp, locs()->temp(1).reg());
+
+  // Restore the global object pool after returning from runtime (old space is
+  // moving, so the GOP could have been relocated).
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+  }
+
+  // Leave dummy exit frame.
+  __ LeaveDartFrame();
+  __ set_constant_pool_allowed(true);
+
+  // Instead of returning to the "fake" return address, we just pop it.
+  __ PopRegister(TMP);
 }
 
 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
@@ -1521,7 +1611,7 @@
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::RegisterLocation(kWriteBarrierValueReg)
-                          : Location::RegisterOrConstant(value()));
+                          : LocationRegisterOrConstant(value()));
       if (ShouldEmitStoreBarrier()) {
         locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
@@ -2210,7 +2300,7 @@
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::RegisterLocation(kWriteBarrierValueReg)
-                           : Location::RegisterOrConstant(value()));
+                           : LocationRegisterOrConstant(value()));
   }
   return summary;
 }
@@ -3524,7 +3614,7 @@
     return summary;
   }
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationRegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -3836,7 +3926,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationRegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5867,8 +5957,8 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
-  locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+  locs->set_in(kLengthPos, LocationRegisterOrSmiConstant(length()));
+  locs->set_in(kIndexPos, LocationRegisterOrSmiConstant(index()));
   return locs;
 }
 
@@ -6234,7 +6324,7 @@
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationWritableRegisterOrSmiConstant(right()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
                                      Location::RequiresRegister()));
   return summary;
@@ -6369,7 +6459,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationRegisterOrSmiConstant(right()));
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -6647,6 +6737,83 @@
   }
 }
 
+LocationSummary* BitCastInstr::MakeLocationSummary(Zone* zone, bool opt) const {
+  LocationSummary* summary =
+      new (zone) LocationSummary(zone, /*num_inputs=*/InputCount(),
+                                 /*num_temps=*/0, LocationSummary::kNoCall);
+  switch (from()) {
+    case kUnboxedInt32:
+      summary->set_in(0, Location::RequiresRegister());
+      break;
+    case kUnboxedInt64:
+      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                        Location::RequiresRegister()));
+      break;
+    case kUnboxedFloat:
+    case kUnboxedDouble:
+      summary->set_in(0, Location::RequiresFpuRegister());
+      break;
+    default:
+      UNREACHABLE();
+  }
+
+  switch (to()) {
+    case kUnboxedInt32:
+      summary->set_out(0, Location::RequiresRegister());
+      break;
+    case kUnboxedInt64:
+      summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                         Location::RequiresRegister()));
+      break;
+    case kUnboxedFloat:
+    case kUnboxedDouble:
+      summary->set_out(0, Location::RequiresFpuRegister());
+      break;
+    default:
+      UNREACHABLE();
+  }
+  return summary;
+}
+
+void BitCastInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  switch (from()) {
+    case kUnboxedInt32: {
+      ASSERT(to() == kUnboxedFloat);
+      const Register from_reg = locs()->in(0).reg();
+      const FpuRegister to_reg = locs()->out(0).fpu_reg();
+      __ vmovsr(EvenSRegisterOf(EvenDRegisterOf(to_reg)), from_reg);
+      break;
+    }
+    case kUnboxedFloat: {
+      ASSERT(to() == kUnboxedInt32);
+      const FpuRegister from_reg = locs()->in(0).fpu_reg();
+      const Register to_reg = locs()->out(0).reg();
+      __ vmovrs(to_reg, EvenSRegisterOf(EvenDRegisterOf(from_reg)));
+      break;
+    }
+    case kUnboxedInt64: {
+      ASSERT(to() == kUnboxedDouble);
+      const Register from_lo = locs()->in(0).AsPairLocation()->At(0).reg();
+      const Register from_hi = locs()->in(0).AsPairLocation()->At(1).reg();
+      const FpuRegister to_reg = locs()->out(0).fpu_reg();
+      __ vmovsr(EvenSRegisterOf(EvenDRegisterOf(to_reg)), from_lo);
+      __ vmovsr(OddSRegisterOf(EvenDRegisterOf(to_reg)), from_hi);
+      break;
+    }
+    case kUnboxedDouble: {
+      ASSERT(to() == kUnboxedInt64);
+      const FpuRegister from_reg = locs()->in(0).fpu_reg();
+      const Register to_lo = locs()->out(0).AsPairLocation()->At(0).reg();
+      const Register to_hi = locs()->out(0).AsPairLocation()->At(1).reg();
+      __ vmovrs(to_lo, EvenSRegisterOf(EvenDRegisterOf(from_reg)));
+      __ vmovrs(to_hi, OddSRegisterOf(EvenDRegisterOf(from_reg)));
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
 LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, bool opt) const {
   return new (zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
 }
@@ -6763,7 +6930,7 @@
   if ((constant != NULL) && !left()->IsSingleUse()) {
     locs->set_in(0, Location::RequiresRegister());
   } else {
-    locs->set_in(0, Location::RegisterOrConstant(left()));
+    locs->set_in(0, LocationRegisterOrConstant(left()));
   }
 
   constant = right()->definition()->AsConstant();
@@ -6774,7 +6941,7 @@
     // one is a constant.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : LocationRegisterOrConstant(right()));
   }
   locs->set_out(0, Location::RequiresRegister());
   return locs;
@@ -6875,10 +7042,14 @@
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#ifdef PRODUCT
+  UNREACHABLE();
+#else
   ASSERT(!compiler->is_optimizing());
   __ BranchLinkPatchable(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
+#endif
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 67e080b..5ba37ca 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -79,7 +79,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::AnyOrConstant(value()));
+  locs->set_in(0, LocationAnyOrConstant(value()));
   return locs;
 }
 
@@ -627,13 +627,13 @@
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RegisterOrConstant(left()));
+    locs->set_in(0, LocationRegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
     // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : LocationRegisterOrConstant(right()));
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -695,7 +695,7 @@
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_in(1, LocationRegisterOrConstant(right()));
   return locs;
 }
 
@@ -783,12 +783,12 @@
   if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RegisterOrConstant(left()));
+    summary->set_in(0, LocationRegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
     summary->set_in(1, summary->in(0).IsConstant()
                            ? Location::RequiresRegister()
-                           : Location::RegisterOrConstant(right()));
+                           : LocationRegisterOrConstant(right()));
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
@@ -887,10 +887,8 @@
   __ set_constant_pool_allowed(false);
   __ EnterDartFrame(0, PP);
 
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ StoreToOffset(FPREG, THR,
-                   compiler::target::Thread::top_exit_frame_info_offset());
+  // Save the stack limit address.
+  __ PushRegister(CSP);
 
   // Make space for arguments and align the frame.
   __ ReserveAlignedFrameSpace(compiler::ffi::NumStackSlots(arg_locations_) *
@@ -916,43 +914,29 @@
     }
   }
 
-  // Mark that the thread is executing VM code.
-  __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
-
-  // We need to copy the return address up into the dummy stack frame so the
+  // We need to copy a dummy return address up into the dummy stack frame so the
   // stack walker will know which safepoint to use.
-  const intptr_t call_sequence_start = __ CodeSize();
-
-  // 5 instructions, 4 bytes each.
-  constexpr intptr_t kCallSequenceLength = 5 * 4;
-
-  __ adr(temp, Immediate(kCallSequenceLength));
-  __ StoreToOffset(temp, FPREG, kSavedCallerPcSlotFromFp * kWordSize);
-
-  // We are entering runtime code, so the C stack pointer must be restored from
-  // the stack limit to the top of the stack. We cache the stack limit address
-  // in a callee-saved register.
-  __ mov(temp, CSP);
-  __ mov(CSP, SP);
-
-  __ blr(branch);
-
-  ASSERT(__ CodeSize() - call_sequence_start == kCallSequenceLength);
-
-  // Restore the Dart stack pointer and the saved C stack pointer.
-  __ mov(SP, CSP);
-  __ mov(CSP, temp);
-
+  __ adr(temp, Immediate(0));
   compiler->EmitCallsiteMetadata(token_pos(), DeoptId::kNone,
                                  RawPcDescriptors::Kind::kOther, locs());
 
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(temp, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(temp, THR, compiler::target::Thread::vm_tag_offset());
+  __ StoreToOffset(temp, FPREG, kSavedCallerPcSlotFromFp * kWordSize);
 
-  // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, THR,
-                   compiler::target::Thread::top_exit_frame_info_offset());
+  // We are entering runtime code, so the C stack pointer must be restored from
+  // the stack limit to the top of the stack.
+  __ mov(CSP, SP);
+
+  // Update information in the thread object and enter a safepoint.
+  __ TransitionGeneratedToNative(branch, temp);
+
+  __ blr(branch);
+
+  // Update information in the thread object and leave the safepoint.
+  __ TransitionNativeToGenerated(temp);
+
+  // Restore the Dart stack pointer and the saved C stack pointer.
+  __ mov(SP, CSP);
+  __ LoadFromOffset(CSP, FPREG, kFirstLocalSlotFromFp * kWordSize);
 
   // Refresh write barrier mask.
   __ ldr(BARRIER_MASK,
@@ -1465,7 +1449,7 @@
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::RegisterLocation(kWriteBarrierValueReg)
-                          : Location::RegisterOrConstant(value()));
+                          : LocationRegisterOrConstant(value()));
       if (ShouldEmitStoreBarrier()) {
         locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
@@ -2015,7 +1999,7 @@
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::RegisterLocation(kWriteBarrierValueReg)
-                           : Location::RegisterOrConstant(value()));
+                           : LocationRegisterOrConstant(value()));
   }
   return summary;
 }
@@ -3301,7 +3285,7 @@
     return summary;
   }
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationRegisterOrSmiConstant(right()));
   if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
@@ -5135,8 +5119,8 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
-  locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+  locs->set_in(kLengthPos, LocationRegisterOrSmiConstant(length()));
+  locs->set_in(kIndexPos, LocationRegisterOrSmiConstant(index()));
   return locs;
 }
 
@@ -5337,7 +5321,7 @@
       LocationSummary* summary = new (zone) LocationSummary(
           zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
       summary->set_in(0, Location::RequiresRegister());
-      summary->set_in(1, Location::RegisterOrConstant(right()));
+      summary->set_in(1, LocationRegisterOrConstant(right()));
       summary->set_out(0, Location::RequiresRegister());
       return summary;
     }
@@ -5553,7 +5537,7 @@
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, RangeUtils::IsPositive(shift_range())
-                         ? Location::RegisterOrConstant(right())
+                         ? LocationRegisterOrConstant(right())
                          : Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -5597,7 +5581,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationRegisterOrSmiConstant(right()));
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -5664,7 +5648,7 @@
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, RangeUtils::IsPositive(shift_range())
-                         ? Location::RegisterOrConstant(right())
+                         ? LocationRegisterOrConstant(right())
                          : Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -5710,7 +5694,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_in(1, LocationRegisterOrSmiConstant(right()));
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -6102,12 +6086,12 @@
   }
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(0, LocationRegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
   locs->set_in(1, locs->in(0).IsConstant()
                       ? Location::RequiresRegister()
-                      : Location::RegisterOrConstant(right()));
+                      : LocationRegisterOrConstant(right()));
   locs->set_out(0, Location::RequiresRegister());
   return locs;
 }
@@ -6201,10 +6185,14 @@
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#ifdef PRODUCT
+  UNREACHABLE();
+#else
   ASSERT(!compiler->is_optimizing());
   __ BranchLinkPatchable(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
+#endif
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index 421954b..e75bfef 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -58,7 +58,6 @@
 #define FOR_EACH_UNREACHABLE_INSTRUCTION(M)                                    \
   M(CaseInsensitiveCompareUC16)                                                \
   M(GenericCheckBound)                                                         \
-  M(CheckNull)                                                                 \
   M(IndirectGoto)                                                              \
   M(Int64ToDouble)                                                             \
   M(BinaryInt64Op)                                                             \
@@ -1318,8 +1317,12 @@
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#ifdef PRODUCT
+  UNREACHABLE();
+#else
   __ DebugStep();
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
+#endif
 }
 
 void GraphEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -1575,6 +1578,17 @@
                       licm_hoisted_ ? ICData::kHoisted : 0);
 }
 
+EMIT_NATIVE_CODE(CheckNull, 1) {
+  if (compiler->is_optimizing()) {
+    const Register value = locs()->in(0).reg();
+    __ IfEqNull(value);
+  } else {
+    __ IfEqNullTOS();
+  }
+  __ NullError();
+  CheckNullInstr::AddMetadataForRuntimeCall(this, compiler);
+}
+
 EMIT_NATIVE_CODE(BinarySmiOp, 2, Location::RequiresRegister()) {
   if (compiler->is_optimizing()) {
     const Register left = locs()->in(0).reg();
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 19983a1..88ce5ba 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -73,7 +73,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::AnyOrConstant(value()));
+  locs->set_in(0, LocationAnyOrConstant(value()));
   return locs;
 }
 
@@ -88,7 +88,7 @@
       __ PushObject(value.constant());
     } else {
       ASSERT(value.IsStackSlot());
-      __ pushl(value.ToStackSlotAddress());
+      __ pushl(LocationToStackSlotAddress(value));
     }
   }
 }
@@ -140,7 +140,7 @@
   const intptr_t stack_index =
       compiler::target::frame_layout.FrameSlotForVariable(&local());
   return LocationSummary::Make(zone, kNumInputs,
-                               Location::StackSlot(stack_index),
+                               Location::StackSlot(stack_index, FPREG),
                                LocationSummary::kNoCall);
 }
 
@@ -224,20 +224,20 @@
     } else {
       __ movsd(XMM0, Address::Absolute(addr));
     }
-    __ movsd(destination.ToStackSlotAddress(), XMM0);
+    __ movsd(LocationToStackSlotAddress(destination), XMM0);
   } else {
     ASSERT(destination.IsStackSlot());
     if (value_.IsSmi() && representation() == kUnboxedInt32) {
-      __ movl(destination.ToStackSlotAddress(),
+      __ movl(LocationToStackSlotAddress(destination),
               Immediate(Smi::Cast(value_).Value()));
     } else {
       if (Assembler::IsSafeSmi(value_) || value_.IsNull()) {
-        __ movl(destination.ToStackSlotAddress(),
+        __ movl(LocationToStackSlotAddress(destination),
                 Immediate(reinterpret_cast<int32_t>(value_.raw())));
       } else {
         __ pushl(EAX);
         __ LoadObjectSafely(EAX, value_);
-        __ movl(destination.ToStackSlotAddress(), EAX);
+        __ movl(LocationToStackSlotAddress(destination), EAX);
         __ popl(EAX);
       }
     }
@@ -381,13 +381,13 @@
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RegisterOrConstant(left()));
+    locs->set_in(0, LocationRegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
     // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : LocationRegisterOrConstant(right()));
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -507,7 +507,7 @@
   } else if (right.IsConstant()) {
     __ CompareObject(left.reg(), right.constant());
   } else if (right.IsStackSlot()) {
-    __ cmpl(left.reg(), right.ToStackSlotAddress());
+    __ cmpl(left.reg(), LocationToStackSlotAddress(right));
   } else {
     __ cmpl(left.reg(), right.reg());
   }
@@ -682,7 +682,7 @@
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_in(1, LocationRegisterOrConstant(right()));
   return locs;
 }
 
@@ -781,12 +781,12 @@
   ASSERT(operation_cid() == kSmiCid);
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RegisterOrConstant(left()));
+  summary->set_in(0, LocationRegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
   summary->set_in(1, summary->in(0).IsConstant()
                          ? Location::RequiresRegister()
-                         : Location::RegisterOrConstant(right()));
+                         : LocationRegisterOrConstant(right()));
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -846,9 +846,9 @@
 }
 
 void FfiCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register saved_fp = locs()->temp(0).reg();
+  Register saved_fp = locs()->temp(0).reg();  // volatile
   Register branch = locs()->in(TargetAddressIndex()).reg();
-  Register tmp = locs()->temp(1).reg();
+  Register tmp = locs()->temp(1).reg();  // callee-saved
 
   // Save frame pointer because we're going to update it when we enter the exit
   // frame.
@@ -861,10 +861,6 @@
   __ LoadObject(CODE_REG, Object::null_object());
   __ EnterDartFrame(compiler::ffi::NumStackSlots(arg_locations_) * kWordSize);
 
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ movl(Address(THR, Thread::top_exit_frame_info_offset()), FPREG);
-
   // Align frame before entering C++ world.
   if (OS::ActivationFrameAlignment() > 1) {
     __ andl(SPREG, Immediate(~(OS::ActivationFrameAlignment() - 1)));
@@ -874,13 +870,13 @@
   auto load_single_slot = [&](Location from, Location to) {
     ASSERT(to.IsStackSlot());
     if (from.IsRegister()) {
-      __ movl(to.ToStackSlotAddress(), from.reg());
+      __ movl(LocationToStackSlotAddress(to), from.reg());
     } else if (from.IsFpuRegister()) {
-      __ movss(to.ToStackSlotAddress(), from.fpu_reg());
+      __ movss(LocationToStackSlotAddress(to), from.fpu_reg());
     } else if (from.IsStackSlot() || from.IsDoubleStackSlot()) {
       ASSERT(from.base_reg() == FPREG);
       __ movl(tmp, Address(saved_fp, from.ToStackSlotOffset()));
-      __ movl(to.ToStackSlotAddress(), tmp);
+      __ movl(LocationToStackSlotAddress(to), tmp);
     } else {
       UNREACHABLE();
     }
@@ -894,11 +890,11 @@
       load_single_slot(origin, target);
     } else if (target.IsDoubleStackSlot()) {
       if (origin.IsFpuRegister()) {
-        __ movsd(target.ToStackSlotAddress(), origin.fpu_reg());
+        __ movsd(LocationToStackSlotAddress(target), origin.fpu_reg());
       } else {
         ASSERT(origin.IsDoubleStackSlot() && origin.base_reg() == FPREG);
         __ movl(tmp, Address(saved_fp, origin.ToStackSlotOffset()));
-        __ movl(target.ToStackSlotAddress(), tmp);
+        __ movl(LocationToStackSlotAddress(target), tmp);
         __ movl(tmp, Address(saved_fp, origin.ToStackSlotOffset() + 4));
         __ movl(Address(SPREG, target.ToStackSlotOffset() + 4), tmp);
       }
@@ -911,33 +907,34 @@
     }
   }
 
-  // Mark that the thread is executing VM code.
-  __ movl(Assembler::VMTagAddress(), branch);
-
-  // We need to copy the return address up into the dummy stack frame so the
+  // We need to copy a dummy return address up into the dummy stack frame so the
   // stack walker will know which safepoint to use. Unlike X64, there's no
   // PC-relative 'leaq' available, so we have do a trick with 'call'.
-  constexpr intptr_t kCallSequenceLength = 6;
-
   Label get_pc;
   __ call(&get_pc);
-  __ Bind(&get_pc);
-
-  const intptr_t call_sequence_start = __ CodeSize();
-
-  __ popl(tmp);
-  __ movl(Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), tmp);
-  __ call(branch);
-
-  ASSERT(__ CodeSize() - call_sequence_start == kCallSequenceLength);
-
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
                                  RawPcDescriptors::Kind::kOther, locs());
+  __ Bind(&get_pc);
+  __ popl(tmp);
+  __ movl(Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), tmp);
+
+  __ TransitionGeneratedToNative(branch, tmp);
+  __ call(branch);
 
   // The x86 calling convention requires floating point values to be returned on
   // the "floating-point stack" (aka. register ST0). We don't use the
   // floating-point stack in Dart, so we need to move the return value back into
   // an XMM register.
+  if (representation() == kUnboxedDouble || representation() == kUnboxedFloat) {
+    __ subl(SPREG, Immediate(8));
+    __ fstpl(Address(SPREG, 0));
+    __ TransitionNativeToGenerated(tmp);
+    __ fldl(Address(SPREG, 0));
+    __ addl(SPREG, Immediate(8));
+  } else {
+    __ TransitionNativeToGenerated(tmp);
+  }
+
   if (representation() == kUnboxedDouble) {
     __ subl(SPREG, Immediate(8));
     __ fstpl(Address(SPREG, 0));
@@ -948,12 +945,6 @@
     __ movss(XMM0, Address(SPREG, 0));
   }
 
-  // Mark that the thread is executing Dart code.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Reset exit frame information in Isolate structure.
-  __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
-
   // Leave dummy exit frame.
   __ LeaveFrame();
 
@@ -1392,7 +1383,7 @@
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::WritableRegister()
-                          : Location::RegisterOrConstant(value()));
+                          : LocationRegisterOrConstant(value()));
       if (ShouldEmitStoreBarrier()) {
         locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
@@ -1406,7 +1397,7 @@
     case kOneByteStringCid:
       // TODO(fschneider): Add location constraint for byte registers (EAX,
       // EBX, ECX, EDX) instead of using a fixed register.
-      locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), EAX));
+      locs->set_in(2, LocationFixedRegisterOrSmiConstant(value(), EAX));
       break;
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
@@ -1907,7 +1898,7 @@
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::WritableRegister()
-                           : Location::RegisterOrConstant(value()));
+                           : LocationRegisterOrConstant(value()));
   }
   return summary;
 }
@@ -2962,7 +2953,7 @@
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+    summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), ECX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
@@ -2974,7 +2965,7 @@
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+    summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), ECX));
     if (kNumTemps == 1) {
       summary->set_temp(0, Location::RequiresRegister());
     }
@@ -2987,7 +2978,7 @@
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
-      summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+      summary->set_in(1, LocationRegisterOrSmiConstant(right()));
     } else {
       summary->set_in(1, Location::PrefersRegister());
     }
@@ -3096,7 +3087,7 @@
   }  // if locs()->in(1).IsConstant()
 
   if (locs()->in(1).IsStackSlot()) {
-    const Address& right = locs()->in(1).ToStackSlotAddress();
+    const Address& right = LocationToStackSlotAddress(locs()->in(1));
     if (op_kind() == Token::kMUL) {
       __ SmiUntag(left);
     }
@@ -3243,7 +3234,7 @@
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+    summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), ECX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
@@ -3251,7 +3242,7 @@
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+    summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), ECX));
     if (can_overflow()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
@@ -3264,7 +3255,7 @@
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
-      summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+      summary->set_in(1, LocationRegisterOrSmiConstant(right()));
     } else {
       summary->set_in(1, Location::PrefersRegister());
     }
@@ -3353,7 +3344,7 @@
   }  // if locs()->in(1).IsConstant()
 
   if (locs()->in(1).IsStackSlot()) {
-    const Address& right = locs()->in(1).ToStackSlotAddress();
+    const Address& right = LocationToStackSlotAddress(locs()->in(1));
     EmitIntegerArithmetic(compiler, op_kind(), left, right, deopt);
     return;
   }  // if locs()->in(1).IsStackSlot.
@@ -5301,11 +5292,11 @@
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (length()->definition()->IsConstant()) {
-    locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
+    locs->set_in(kLengthPos, LocationRegisterOrSmiConstant(length()));
   } else {
     locs->set_in(kLengthPos, Location::PrefersRegister());
   }
-  locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+  locs->set_in(kIndexPos, LocationRegisterOrSmiConstant(index()));
   return locs;
 }
 
@@ -5345,7 +5336,7 @@
   } else if (index_loc.IsConstant()) {
     const Smi& index = Smi::Cast(index_loc.constant());
     if (length_loc.IsStackSlot()) {
-      const Address& length = length_loc.ToStackSlotAddress();
+      const Address& length = LocationToStackSlotAddress(length_loc);
       __ cmpl(length, Immediate(reinterpret_cast<int32_t>(index.raw())));
     } else {
       Register length = length_loc.reg();
@@ -5354,7 +5345,7 @@
     __ j(BELOW_EQUAL, deopt);
   } else if (length_loc.IsStackSlot()) {
     Register index = index_loc.reg();
-    const Address& length = length_loc.ToStackSlotAddress();
+    const Address& length = LocationToStackSlotAddress(length_loc);
     if (index_cid != kSmiCid) {
       __ BranchIfNotSmi(index, deopt);
     }
@@ -5722,7 +5713,7 @@
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+  summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), ECX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -5859,7 +5850,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+  summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), ECX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -6229,12 +6220,12 @@
   }
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(0, LocationRegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
   locs->set_in(1, locs->in(0).IsConstant()
                       ? Location::RequiresRegister()
-                      : Location::RegisterOrConstant(right()));
+                      : LocationRegisterOrConstant(right()));
   locs->set_out(0, Location::RequiresRegister());
   return locs;
 }
@@ -6393,10 +6384,14 @@
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#ifdef PRODUCT
+  UNREACHABLE();
+#else
   ASSERT(!compiler->is_optimizing());
   __ Call(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
+#endif
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 85d77dc..19b2aed 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -1006,6 +1006,12 @@
   Definition::PrintOperandsTo(f);
 }
 
+void BitCastInstr::PrintOperandsTo(BufferFormatter* f) const {
+  Definition::PrintOperandsTo(f);
+  f->Print(" (%s -> %s)", RepresentationToCString(from()),
+           RepresentationToCString(to()));
+}
+
 void ParameterInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%" Pd, index());
 }
@@ -1022,7 +1028,7 @@
 }
 
 void CheckStackOverflowInstr::PrintOperandsTo(BufferFormatter* f) const {
-  if (in_loop()) f->Print("depth %" Pd, loop_depth());
+  f->Print("stack=%" Pd ", loop=%" Pd, stack_depth(), loop_depth());
 }
 
 void TargetEntryInstr::PrintTo(BufferFormatter* f) const {
@@ -1039,7 +1045,8 @@
 }
 
 void OsrEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%" Pd "[osr entry]:%" Pd, block_id(), GetDeoptId());
+  f->Print("B%" Pd "[osr entry]:%" Pd " stack_depth=%" Pd, block_id(),
+           GetDeoptId(), stack_depth());
   if (HasParallelMove()) {
     f->Print("\n");
     parallel_move()->PrintTo(f);
@@ -1068,13 +1075,13 @@
 }
 
 void LoadIndexedUnsafeInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s[", Assembler::RegisterName(base_reg()));
+  f->Print("%s[", RegisterNames::RegisterName(base_reg()));
   index()->PrintTo(f);
   f->Print(" + %" Pd "]", offset());
 }
 
 void StoreIndexedUnsafeInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s[", Assembler::RegisterName(base_reg()));
+  f->Print("%s[", RegisterNames::RegisterName(base_reg()));
   index()->PrintTo(f);
   f->Print(" + %" Pd "], ", offset());
   value()->PrintTo(f);
diff --git a/runtime/vm/compiler/backend/il_test_helper.h b/runtime/vm/compiler/backend/il_test_helper.h
index 84d7acf..dc6385d 100644
--- a/runtime/vm/compiler/backend/il_test_helper.h
+++ b/runtime/vm/compiler/backend/il_test_helper.h
@@ -5,14 +5,17 @@
 #ifndef RUNTIME_VM_COMPILER_BACKEND_IL_TEST_HELPER_H_
 #define RUNTIME_VM_COMPILER_BACKEND_IL_TEST_HELPER_H_
 
+#include <utility>
 #include <vector>
 
 #include "include/dart_api.h"
 
 #include "platform/allocation.h"
+#include "vm/compiler/backend/flow_graph.h"
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/compiler_pass.h"
 #include "vm/compiler/compiler_state.h"
+#include "vm/compiler/jit/compiler.h"
 #include "vm/unit_test.h"
 
 // The helpers in this file make it easier to write C++ unit tests which assert
@@ -190,6 +193,127 @@
   bool trace_;
 };
 
+#if !defined(PRODUCT)
+#define ENTITY_TOCSTRING(v) ((v)->ToCString())
+#else
+#define ENTITY_TOCSTRING(v) "<?>"
+#endif
+
+// Helper to check various IL and object properties and informative error
+// messages if check fails. [entity] should be a pointer to a value.
+// [property] should be an expression which can refer to [entity] using
+// variable named [it].
+// [entity] is expected to have a ToCString() method in non-PRODUCT builds.
+#define EXPECT_PROPERTY(entity, property)                                      \
+  do {                                                                         \
+    auto& it = *entity;                                                        \
+    if (!(property)) {                                                         \
+      dart::Expect(__FILE__, __LINE__)                                         \
+          .Fail("expected " #property " for " #entity " which is %s.\n",       \
+                ENTITY_TOCSTRING(entity));                                     \
+    }                                                                          \
+  } while (0)
+
+class FlowGraphBuilderHelper {
+ public:
+  FlowGraphBuilderHelper()
+      : state_(CompilerState::Current()),
+        flow_graph_(MakeDummyGraph(Thread::Current())) {
+    flow_graph_.CreateCommonConstants();
+  }
+
+  TargetEntryInstr* TargetEntry(intptr_t try_index = kInvalidTryIndex) const {
+    return new TargetEntryInstr(flow_graph_.allocate_block_id(), try_index,
+                                state_.GetNextDeoptId());
+  }
+
+  JoinEntryInstr* JoinEntry(intptr_t try_index = kInvalidTryIndex) const {
+    return new JoinEntryInstr(flow_graph_.allocate_block_id(), try_index,
+                              state_.GetNextDeoptId());
+  }
+
+  ConstantInstr* IntConstant(int64_t value) const {
+    return flow_graph_.GetConstant(
+        Integer::Handle(Integer::New(value, Heap::kOld)));
+  }
+
+  ConstantInstr* DoubleConstant(double value) {
+    return flow_graph_.GetConstant(
+        Double::Handle(Double::New(value, Heap::kOld)));
+  }
+
+  PhiInstr* Phi(JoinEntryInstr* join,
+                std::initializer_list<std::pair<BlockEntryInstr*, Definition*>>
+                    incomming) {
+    auto phi = new PhiInstr(join, incomming.size());
+    for (size_t i = 0; i < incomming.size(); i++) {
+      auto input = new Value(flow_graph_.constant_dead());
+      phi->SetInputAt(i, input);
+      input->definition()->AddInputUse(input);
+    }
+    for (auto pair : incomming) {
+      pending_phis_.Add({phi, pair.first, pair.second});
+    }
+    return phi;
+  }
+
+  void FinishGraph() {
+    flow_graph_.DiscoverBlocks();
+    GrowableArray<BitVector*> dominance_frontier;
+    flow_graph_.ComputeDominators(&dominance_frontier);
+
+    for (auto& pending : pending_phis_) {
+      auto join = pending.phi->block();
+      EXPECT(pending.phi->InputCount() == join->PredecessorCount());
+      auto pred_index = join->IndexOfPredecessor(pending.pred);
+      EXPECT(pred_index != -1);
+      pending.phi->InputAt(pred_index)->BindTo(pending.defn);
+    }
+  }
+
+  FlowGraph* flow_graph() { return &flow_graph_; }
+
+ private:
+  static FlowGraph& MakeDummyGraph(Thread* thread) {
+    const Function& func = Function::ZoneHandle(Function::New(
+        String::Handle(Symbols::New(thread, "dummy")),
+        RawFunction::kRegularFunction,
+        /*is_static=*/true,
+        /*is_const=*/false,
+        /*is_abstract=*/false,
+        /*is_external=*/false,
+        /*is_native=*/true,
+        Class::Handle(thread->isolate()->object_store()->object_class()),
+        TokenPosition::kNoSource));
+
+    Zone* zone = thread->zone();
+    ParsedFunction* parsed_function = new (zone) ParsedFunction(thread, func);
+
+    parsed_function->SetNodeSequence(new SequenceNode(
+        TokenPosition::kNoSource, new LocalScope(nullptr, 0, 0)));
+
+    auto graph_entry =
+        new GraphEntryInstr(*parsed_function, Compiler::kNoOSRDeoptId);
+
+    const intptr_t block_id = 1;  // 0 is GraphEntry.
+    graph_entry->set_normal_entry(
+        new FunctionEntryInstr(graph_entry, block_id, kInvalidTryIndex,
+                               CompilerState::Current().GetNextDeoptId()));
+    return *new FlowGraph(*parsed_function, graph_entry, block_id,
+                          PrologueInfo{-1, -1});
+  }
+
+  CompilerState& state_;
+  FlowGraph& flow_graph_;
+
+  struct PendingPhiInput {
+    PhiInstr* phi;
+    BlockEntryInstr* pred;
+    Definition* defn;
+  };
+  GrowableArray<PendingPhiInput> pending_phis_;
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_BACKEND_IL_TEST_HELPER_H_
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 6947e3c..af182c4 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -74,7 +74,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::AnyOrConstant(value()));
+  locs->set_in(0, LocationAnyOrConstant(value()));
   return locs;
 }
 
@@ -89,7 +89,7 @@
       __ PushObject(value.constant());
     } else {
       ASSERT(value.IsStackSlot());
-      __ pushq(value.ToStackSlotAddress());
+      __ pushq(LocationToStackSlotAddress(value));
     }
   }
 }
@@ -243,7 +243,7 @@
   const intptr_t stack_index =
       compiler::target::frame_layout.FrameSlotForVariable(&local());
   return LocationSummary::Make(zone, kNumInputs,
-                               Location::StackSlot(stack_index),
+                               Location::StackSlot(stack_index, FPREG),
                                LocationSummary::kNoCall);
 }
 
@@ -321,16 +321,16 @@
       __ LoadObject(tmp, value_);
       __ movsd(XMM0, FieldAddress(tmp, Double::value_offset()));
     }
-    __ movsd(destination.ToStackSlotAddress(), XMM0);
+    __ movsd(LocationToStackSlotAddress(destination), XMM0);
   } else {
     ASSERT(destination.IsStackSlot());
     if (representation() == kUnboxedInt32 ||
         representation() == kUnboxedInt64) {
       const int64_t value = Integer::Cast(value_).AsInt64Value();
-      __ movq(destination.ToStackSlotAddress(), Immediate(value));
+      __ movq(LocationToStackSlotAddress(destination), Immediate(value));
     } else {
       ASSERT(representation() == kTagged);
-      __ StoreObject(destination.ToStackSlotAddress(), value_);
+      __ StoreObject(LocationToStackSlotAddress(destination), value_);
     }
   }
 }
@@ -525,13 +525,13 @@
     const intptr_t kNumTemps = 0;
     LocationSummary* locs = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RegisterOrConstant(left()));
+    locs->set_in(0, LocationRegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
     // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::RegisterOrConstant(right()));
+                        : LocationRegisterOrConstant(right()));
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -632,7 +632,7 @@
       __ CompareObject(left.reg(), right.constant());
     }
   } else if (right.IsStackSlot()) {
-    __ cmpq(left.reg(), right.ToStackSlotAddress());
+    __ cmpq(left.reg(), LocationToStackSlotAddress(right));
   } else {
     __ cmpq(left.reg(), right.reg());
   }
@@ -720,7 +720,7 @@
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
-  locs->set_in(1, Location::RegisterOrConstant(right()));
+  locs->set_in(1, LocationRegisterOrConstant(right()));
   return locs;
 }
 
@@ -808,12 +808,12 @@
   if (operation_cid() == kSmiCid || operation_cid() == kMintCid) {
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    summary->set_in(0, Location::RegisterOrConstant(left()));
+    summary->set_in(0, LocationRegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
     summary->set_in(1, summary->in(0).IsConstant()
                            ? Location::RequiresRegister()
-                           : Location::RegisterOrConstant(right()));
+                           : LocationRegisterOrConstant(right()));
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
@@ -897,10 +897,6 @@
   __ EnterDartFrame(compiler::ffi::NumStackSlots(arg_locations_) * kWordSize,
                     PP);
 
-  // Save exit frame information to enable stack walking as we are about to
-  // transition to Dart VM C++ code.
-  __ movq(Address(THR, Thread::top_exit_frame_info_offset()), FPREG);
-
   // Align frame before entering C++ world.
   if (OS::ActivationFrameAlignment() > 1) {
     __ andq(SPREG, Immediate(~(OS::ActivationFrameAlignment() - 1)));
@@ -912,50 +908,37 @@
 
     if (target.IsStackSlot()) {
       if (origin.IsRegister()) {
-        __ movq(target.ToStackSlotAddress(), origin.reg());
+        __ movq(LocationToStackSlotAddress(target), origin.reg());
       } else if (origin.IsFpuRegister()) {
         __ movq(TMP, origin.fpu_reg());
-        __ movq(target.ToStackSlotAddress(), TMP);
+        __ movq(LocationToStackSlotAddress(target), TMP);
       } else if (origin.IsStackSlot() || origin.IsDoubleStackSlot()) {
         // The base register cannot be SPREG because we've moved it.
         ASSERT(origin.base_reg() == FPREG);
         __ movq(TMP, Address(saved_fp, origin.ToStackSlotOffset()));
-        __ movq(target.ToStackSlotAddress(), TMP);
+        __ movq(LocationToStackSlotAddress(target), TMP);
       }
     } else {
       ASSERT(origin.Equals(target));
     }
   }
 
-  // Mark that the thread is executing VM code.
-  __ movq(Assembler::VMTagAddress(), target_address);
-
-// We need to copy the return address up into the dummy stack frame so the
-// stack walker will know which safepoint to use.
-#if defined(TARGET_OS_WINDOWS)
-  constexpr intptr_t kCallSequenceLength = 10;
-#else
-  constexpr intptr_t kCallSequenceLength = 6;
-#endif
-
-  // RIP points to the *next* instruction, so 'AddressRIPRelative' loads the
-  // address of the following 'movq'.
-  __ leaq(TMP, Address::AddressRIPRelative(kCallSequenceLength));
-
-  const intptr_t call_sequence_start = __ CodeSize();
-  __ movq(Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), TMP);
-  __ CallCFunction(target_address);
-
-  ASSERT(__ CodeSize() - call_sequence_start == kCallSequenceLength);
-
+  // We need to copy a dummy return address up into the dummy stack frame so the
+  // stack walker will know which safepoint to use. RIP points to the *next*
+  // instruction, so 'AddressRIPRelative' loads the address of the following
+  // 'movq'.
+  __ leaq(TMP, Address::AddressRIPRelative(0));
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
                                  RawPcDescriptors::Kind::kOther, locs());
+  __ movq(Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), TMP);
 
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  // Update information in the thread object and enter a safepoint.
+  __ TransitionGeneratedToNative(target_address);
 
-  // Reset exit frame information in Isolate structure.
-  __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
+  __ CallCFunction(target_address);
+
+  // Update information in the thread object and leave the safepoint.
+  __ TransitionNativeToGenerated();
 
   // Although PP is a callee-saved register, it may have been moved by the GC.
   __ LeaveDartFrame(compiler::kRestoreCallerPP);
@@ -1498,7 +1481,7 @@
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::RegisterLocation(kWriteBarrierValueReg)
-                          : Location::RegisterOrConstant(value()));
+                          : LocationRegisterOrConstant(value()));
       if (ShouldEmitStoreBarrier()) {
         locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
         locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
@@ -1512,7 +1495,7 @@
     case kOneByteStringCid:
       // TODO(fschneider): Add location constraint for byte registers (RAX,
       // RBX, RCX, RDX) instead of using a fixed register.
-      locs->set_in(2, Location::FixedRegisterOrSmiConstant(value(), RAX));
+      locs->set_in(2, LocationFixedRegisterOrSmiConstant(value(), RAX));
       break;
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
@@ -2019,7 +2002,7 @@
   } else {
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::RegisterLocation(kWriteBarrierValueReg)
-                           : Location::RegisterOrConstant(value()));
+                           : LocationRegisterOrConstant(value()));
   }
   return summary;
 }
@@ -3375,7 +3358,7 @@
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+    summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), RCX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
@@ -3386,7 +3369,7 @@
     LocationSummary* summary = new (zone)
         LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+    summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), RCX));
     if (kNumTemps == 1) {
       summary->set_temp(0, Location::RequiresRegister());
     }
@@ -3399,7 +3382,7 @@
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
-      summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+      summary->set_in(1, LocationRegisterOrSmiConstant(right()));
     } else {
       summary->set_in(1, Location::PrefersRegister());
     }
@@ -3499,7 +3482,7 @@
   }  // locs()->in(1).IsConstant().
 
   if (locs()->in(1).IsStackSlot()) {
-    const Address& right = locs()->in(1).ToStackSlotAddress();
+    const Address& right = LocationToStackSlotAddress(locs()->in(1));
     switch (op_kind()) {
       case Token::kADD: {
         __ addq(left, right);
@@ -5385,8 +5368,8 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
-  locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+  locs->set_in(kLengthPos, LocationRegisterOrSmiConstant(length()));
+  locs->set_in(kIndexPos, LocationRegisterOrSmiConstant(index()));
   return locs;
 }
 
@@ -5669,7 +5652,7 @@
       LocationSummary* summary = new (zone) LocationSummary(
           zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
       summary->set_in(0, Location::RequiresRegister());
-      summary->set_in(1, Location::RegisterOrConstant(right()));
+      summary->set_in(1, LocationRegisterOrConstant(right()));
       summary->set_out(0, Location::SameAsFirstInput());
       return summary;
     }
@@ -5856,7 +5839,7 @@
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, RangeUtils::IsPositive(shift_range())
-                         ? Location::FixedRegisterOrConstant(right(), RCX)
+                         ? LocationFixedRegisterOrConstant(right(), RCX)
                          : Location::RegisterLocation(RCX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -5902,7 +5885,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+  summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), RCX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -5976,7 +5959,7 @@
       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, RangeUtils::IsPositive(shift_range())
-                         ? Location::FixedRegisterOrConstant(right(), RCX)
+                         ? LocationFixedRegisterOrConstant(right(), RCX)
                          : Location::RegisterLocation(RCX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -6021,7 +6004,7 @@
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+  summary->set_in(1, LocationFixedRegisterOrSmiConstant(right(), RCX));
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
 }
@@ -6391,12 +6374,12 @@
   }
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RegisterOrConstant(left()));
+  locs->set_in(0, LocationRegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
   locs->set_in(1, locs->in(0).IsConstant()
                       ? Location::RequiresRegister()
-                      : Location::RegisterOrConstant(right()));
+                      : LocationRegisterOrConstant(right()));
   locs->set_out(0, Location::RequiresRegister());
   return locs;
 }
@@ -6498,10 +6481,14 @@
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#ifdef PRODUCT
+  UNREACHABLE();
+#else
   ASSERT(!compiler->is_optimizing());
   __ CallPatchable(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
+#endif
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 8d34ae8..8a7550f 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -10,6 +10,7 @@
 #include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/backend/block_scheduler.h"
 #include "vm/compiler/backend/branch_optimizer.h"
+#include "vm/compiler/backend/flow_graph_checker.h"
 #include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/type_propagator.h"
@@ -1062,6 +1063,10 @@
         {
           callee_graph = builder.BuildGraph();
 
+#if defined(DEBUG)
+          FlowGraphChecker(callee_graph).Check();
+#endif
+
           CalleeGraphValidator::Validate(callee_graph);
         }
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index 9c7d766..4f5473c 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -675,10 +675,10 @@
       Location loc;
       switch (param->kind()) {
         case SpecialParameterInstr::kException:
-          loc = Location::ExceptionLocation();
+          loc = LocationExceptionLocation();
           break;
         case SpecialParameterInstr::kStackTrace:
-          loc = Location::StackTraceLocation();
+          loc = LocationStackTraceLocation();
           break;
         default:
           UNREACHABLE();
@@ -764,7 +764,7 @@
     ASSERT(param->kind() == SpecialParameterInstr::kArgDescriptor);
     Location loc;
 #if defined(TARGET_ARCH_DBC)
-    loc = Location::ArgumentsDescriptorLocation();
+    loc = LocationArgumentsDescriptorLocation();
 #else
     loc = Location::RegisterLocation(ARGS_DESC_REG);
 #endif  // defined(TARGET_ARCH_DBC)
@@ -2049,7 +2049,7 @@
   if (register_kind_ == Location::kRegister) {
     const intptr_t slot_index =
         compiler::target::frame_layout.FrameSlotForVariableIndex(-idx);
-    range->set_spill_slot(Location::StackSlot(slot_index));
+    range->set_spill_slot(Location::StackSlot(slot_index, FPREG));
   } else {
     // We use the index of the slot with the lowest address as an index for the
     // FPU register spill slot. In terms of indexes this relation is inverted:
@@ -2064,11 +2064,11 @@
         (range->representation() == kUnboxedInt32x4) ||
         (range->representation() == kUnboxedFloat64x2)) {
       ASSERT(need_quad);
-      location = Location::QuadStackSlot(slot_idx);
+      location = Location::QuadStackSlot(slot_idx, FPREG);
     } else {
       ASSERT(range->representation() == kUnboxedFloat ||
              range->representation() == kUnboxedDouble);
-      location = Location::DoubleStackSlot(slot_idx);
+      location = Location::DoubleStackSlot(slot_idx, FPREG);
     }
     range->set_spill_slot(location);
   }
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index e549879..f705a15 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -27,7 +27,7 @@
   for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) {
     Register r = static_cast<Register>(i);
     if (ContainsRegister(r)) {
-      THR_Print("%s %s\n", Assembler::RegisterName(r),
+      THR_Print("%s %s\n", RegisterNames::RegisterName(r),
                 IsTagged(r) ? "tagged" : "untagged");
     }
   }
@@ -35,7 +35,7 @@
   for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) {
     FpuRegister r = static_cast<FpuRegister>(i);
     if (ContainsFpuRegister(r)) {
-      THR_Print("%s\n", Assembler::FpuRegisterName(r));
+      THR_Print("%s\n", RegisterNames::FpuRegisterName(r));
     }
   }
 }
@@ -70,56 +70,66 @@
   return summary;
 }
 
-Location Location::Pair(Location first, Location second) {
-  PairLocation* pair_location = new PairLocation();
+template <class Register, class FpuRegister>
+TemplateLocation<Register, FpuRegister>
+TemplateLocation<Register, FpuRegister>::Pair(
+    TemplateLocation<Register, FpuRegister> first,
+    TemplateLocation<Register, FpuRegister> second) {
+  TemplatePairLocation<TemplateLocation<Register, FpuRegister>>* pair_location =
+      new TemplatePairLocation<TemplateLocation<Register, FpuRegister>>();
   ASSERT((reinterpret_cast<intptr_t>(pair_location) & kLocationTagMask) == 0);
   pair_location->SetAt(0, first);
   pair_location->SetAt(1, second);
-  Location loc(reinterpret_cast<uword>(pair_location) | kPairLocationTag);
+  TemplateLocation<Register, FpuRegister> loc(
+      reinterpret_cast<uword>(pair_location) | kPairLocationTag);
   return loc;
 }
 
-PairLocation* Location::AsPairLocation() const {
+template <class Register, class FpuRegister>
+TemplatePairLocation<TemplateLocation<Register, FpuRegister>>*
+TemplateLocation<Register, FpuRegister>::AsPairLocation() const {
   ASSERT(IsPairLocation());
-  return reinterpret_cast<PairLocation*>(value_ & ~kLocationTagMask);
+  return reinterpret_cast<
+      TemplatePairLocation<TemplateLocation<Register, FpuRegister>>*>(
+      value_ & ~kLocationTagMask);
 }
 
-Location Location::RegisterOrConstant(Value* value) {
+Location LocationRegisterOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
              ? Location::Constant(constant)
              : Location::RequiresRegister();
 }
 
-Location Location::RegisterOrSmiConstant(Value* value) {
+Location LocationRegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
              ? Location::Constant(constant)
              : Location::RequiresRegister();
 }
 
-Location Location::WritableRegisterOrSmiConstant(Value* value) {
+Location LocationWritableRegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
              ? Location::Constant(constant)
              : Location::WritableRegister();
 }
 
-Location Location::FixedRegisterOrConstant(Value* value, Register reg) {
+Location LocationFixedRegisterOrConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
              ? Location::Constant(constant)
              : Location::RegisterLocation(reg);
 }
 
-Location Location::FixedRegisterOrSmiConstant(Value* value, Register reg) {
+Location LocationFixedRegisterOrSmiConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
              ? Location::Constant(constant)
              : Location::RegisterLocation(reg);
 }
 
-Location Location::AnyOrConstant(Value* value) {
+Location LocationAnyOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
              ? Location::Constant(constant)
@@ -128,27 +138,30 @@
 
 // DBC does not have an notion of 'address' in its instruction set.
 #if !defined(TARGET_ARCH_DBC)
-Address Location::ToStackSlotAddress() const {
-  return Address(base_reg(), ToStackSlotOffset());
+Address LocationToStackSlotAddress(Location loc) {
+  return Address(loc.base_reg(), loc.ToStackSlotOffset());
 }
 #endif
 
-intptr_t Location::ToStackSlotOffset() const {
+template <class Register, class FpuRegister>
+intptr_t TemplateLocation<Register, FpuRegister>::ToStackSlotOffset() const {
   return stack_index() * kWordSize;
 }
 
-const Object& Location::constant() const {
+template <class Register, class FpuRegister>
+const Object& TemplateLocation<Register, FpuRegister>::constant() const {
   return constant_instruction()->value();
 }
 
-const char* Location::Name() const {
+template <class Register, class FpuRegister>
+const char* TemplateLocation<Register, FpuRegister>::Name() const {
   switch (kind()) {
     case kInvalid:
       return "?";
     case kRegister:
-      return Assembler::RegisterName(reg());
+      return RegisterNames::RegisterName(reg());
     case kFpuRegister:
-      return Assembler::FpuRegisterName(fpu_reg());
+      return RegisterNames::FpuRegisterName(fpu_reg());
     case kStackSlot:
       return "S";
     case kDoubleStackSlot:
@@ -195,7 +208,9 @@
   return "?";
 }
 
-void Location::PrintTo(BufferFormatter* f) const {
+template <class Register, class FpuRegister>
+void TemplateLocation<Register, FpuRegister>::PrintTo(
+    BufferFormatter* f) const {
   if (!FLAG_support_il_printer) {
     return;
   }
@@ -216,14 +231,16 @@
   }
 }
 
-const char* Location::ToCString() const {
+template <class Register, class FpuRegister>
+const char* TemplateLocation<Register, FpuRegister>::ToCString() const {
   char buffer[1024];
   BufferFormatter bf(buffer, 1024);
   PrintTo(&bf);
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-void Location::Print() const {
+template <class Register, class FpuRegister>
+void TemplateLocation<Register, FpuRegister>::Print() const {
   if (kind() == kStackSlot) {
     THR_Print("S%+" Pd "", stack_index());
   } else {
@@ -231,46 +248,77 @@
   }
 }
 
-Location Location::Copy() const {
+template <class Register, class FpuRegister>
+TemplateLocation<Register, FpuRegister>
+TemplateLocation<Register, FpuRegister>::Copy() const {
   if (IsPairLocation()) {
-    PairLocation* pair = AsPairLocation();
+    TemplatePairLocation<TemplateLocation<Register, FpuRegister>>* pair =
+        AsPairLocation();
     ASSERT(!pair->At(0).IsPairLocation());
     ASSERT(!pair->At(1).IsPairLocation());
-    return Location::Pair(pair->At(0).Copy(), pair->At(1).Copy());
+    return TemplateLocation::Pair(pair->At(0).Copy(), pair->At(1).Copy());
   } else {
     // Copy by value.
     return *this;
   }
 }
 
-Location Location::RemapForSlowPath(Definition* def,
-                                    intptr_t* cpu_reg_slots,
-                                    intptr_t* fpu_reg_slots) const {
-  if (IsRegister()) {
-    intptr_t index = cpu_reg_slots[reg()];
+Location LocationArgumentsDescriptorLocation() {
+#ifdef TARGET_ARCH_DBC
+  return Location(Location::kSpecialDbcRegister, Location::kArgsDescriptorReg);
+#else
+  return Location::RegisterLocation(ARGS_DESC_REG);
+#endif
+}
+
+Location LocationExceptionLocation() {
+#ifdef TARGET_ARCH_DBC
+  return Location(Location::kSpecialDbcRegister, Location::kExceptionReg);
+#else
+  return Location::RegisterLocation(kExceptionObjectReg);
+#endif
+}
+
+Location LocationStackTraceLocation() {
+#ifdef TARGET_ARCH_DBC
+  return Location(Location::kSpecialDbcRegister, Location::kStackTraceReg);
+#else
+  return Location::RegisterLocation(kStackTraceObjectReg);
+#endif
+}
+
+Location LocationRemapForSlowPath(Location loc,
+                                  Definition* def,
+                                  intptr_t* cpu_reg_slots,
+                                  intptr_t* fpu_reg_slots) {
+  if (loc.IsRegister()) {
+    intptr_t index = cpu_reg_slots[loc.reg()];
     ASSERT(index >= 0);
     return Location::StackSlot(
-        compiler::target::frame_layout.FrameSlotForVariableIndex(-index));
-  } else if (IsFpuRegister()) {
-    intptr_t index = fpu_reg_slots[fpu_reg()];
+        compiler::target::frame_layout.FrameSlotForVariableIndex(-index),
+        FPREG);
+  } else if (loc.IsFpuRegister()) {
+    intptr_t index = fpu_reg_slots[loc.fpu_reg()];
     ASSERT(index >= 0);
     switch (def->representation()) {
       case kUnboxedDouble:
         return Location::DoubleStackSlot(
-            compiler::target::frame_layout.FrameSlotForVariableIndex(-index));
+            compiler::target::frame_layout.FrameSlotForVariableIndex(-index),
+            FPREG);
 
       case kUnboxedFloat32x4:
       case kUnboxedInt32x4:
       case kUnboxedFloat64x2:
         return Location::QuadStackSlot(
-            compiler::target::frame_layout.FrameSlotForVariableIndex(-index));
+            compiler::target::frame_layout.FrameSlotForVariableIndex(-index),
+            FPREG);
 
       default:
         UNREACHABLE();
     }
-  } else if (IsPairLocation()) {
+  } else if (loc.IsPairLocation()) {
     ASSERT(def->representation() == kUnboxedInt64);
-    PairLocation* value_pair = AsPairLocation();
+    PairLocation* value_pair = loc.AsPairLocation();
     intptr_t index_lo;
     intptr_t index_hi;
 
@@ -290,14 +338,14 @@
       index_hi = value_pair->At(1).stack_index();
     }
 
-    return Location::Pair(Location::StackSlot(index_lo),
-                          Location::StackSlot(index_hi));
-  } else if (IsInvalid() && def->IsMaterializeObject()) {
+    return Location::Pair(Location::StackSlot(index_lo, FPREG),
+                          Location::StackSlot(index_hi, FPREG));
+  } else if (loc.IsInvalid() && def->IsMaterializeObject()) {
     def->AsMaterializeObject()->RemapRegisters(cpu_reg_slots, fpu_reg_slots);
-    return *this;
+    return loc;
   }
 
-  return *this;
+  return loc;
 }
 
 void LocationSummary::PrintTo(BufferFormatter* f) const {
@@ -358,6 +406,14 @@
 }
 #endif
 
+template class TemplateLocation<dart::Register, dart::FpuRegister>;
+template class TemplatePairLocation<Location>;
+
+#if !defined(HOST_ARCH_EQUALS_TARGET_ARCH)
+template class TemplateLocation<dart::host::Register, dart::host::FpuRegister>;
+template class TemplatePairLocation<HostLocation>;
+#endif  // !defined(HOST_ARCH_EQUALS_TARGET_ARCH)
+
 }  // namespace dart
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index a14d8a0..513d61b 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -9,15 +9,18 @@
 #include "vm/bitfield.h"
 #include "vm/bitmap.h"
 #include "vm/compiler/assembler/assembler.h"
+#include "vm/constants.h"
 
 namespace dart {
 
 class BufferFormatter;
 class ConstantInstr;
 class Definition;
-class PairLocation;
 class Value;
 
+template <class Location>
+class TemplatePairLocation;
+
 enum Representation {
   kNoRepresentation,
   kTagged,
@@ -62,7 +65,8 @@
 // are bitwise unequal then these two locations are guaranteed to be disjoint.
 // Properties like representation belong to the value that is stored in
 // the location not to the location itself.
-class Location : public ValueObject {
+template <class Register, class FpuRegister>
+class TemplateLocation : public ValueObject {
  private:
   enum {
     // Number of bits required to encode Kind value.
@@ -128,7 +132,7 @@
 #endif
   };
 
-  Location() : value_(kInvalidLocation) {
+  TemplateLocation() : value_(kInvalidLocation) {
     // Verify that non-tagged location kinds do not interfere with location tags
     // (kConstantTag and kPairLocationTag).
     COMPILE_ASSERT((kInvalid & kLocationTagMask) != kConstantTag);
@@ -166,9 +170,10 @@
     ASSERT(IsInvalid());
   }
 
-  Location(const Location& other) : ValueObject(), value_(other.value_) {}
+  TemplateLocation(const TemplateLocation& other)
+      : ValueObject(), value_(other.value_) {}
 
-  Location& operator=(const Location& other) {
+  TemplateLocation& operator=(const TemplateLocation& other) {
     value_ = other.value_;
     return *this;
   }
@@ -180,8 +185,8 @@
     return (value_ & kLocationTagMask) == kConstantTag;
   }
 
-  static Location Constant(const ConstantInstr* obj) {
-    Location loc(reinterpret_cast<uword>(obj) | kConstantTag);
+  static TemplateLocation Constant(const ConstantInstr* obj) {
+    TemplateLocation loc(reinterpret_cast<uword>(obj) | kConstantTag);
     ASSERT(obj == loc.constant_instruction());
     return loc;
   }
@@ -197,9 +202,10 @@
     return (value_ & kLocationTagMask) == kPairLocationTag;
   }
 
-  static Location Pair(Location first, Location second);
+  static TemplateLocation Pair(TemplateLocation first, TemplateLocation second);
 
-  PairLocation* AsPairLocation() const;
+  TemplatePairLocation<TemplateLocation<Register, FpuRegister>>*
+  AsPairLocation() const;
 
   // Unallocated locations.
   enum Policy {
@@ -215,37 +221,37 @@
 
   bool IsRegisterBeneficial() { return !Equals(Any()); }
 
-  static Location UnallocatedLocation(Policy policy) {
-    return Location(kUnallocated, PolicyField::encode(policy));
+  static TemplateLocation UnallocatedLocation(Policy policy) {
+    return TemplateLocation(kUnallocated, PolicyField::encode(policy));
   }
 
   // Any free register is suitable to replace this unallocated location.
-  static Location Any() { return UnallocatedLocation(kAny); }
+  static TemplateLocation Any() { return UnallocatedLocation(kAny); }
 
-  static Location PrefersRegister() {
+  static TemplateLocation PrefersRegister() {
     return UnallocatedLocation(kPrefersRegister);
   }
 
-  static Location RequiresRegister() {
+  static TemplateLocation RequiresRegister() {
     return UnallocatedLocation(kRequiresRegister);
   }
 
-  static Location RequiresFpuRegister() {
+  static TemplateLocation RequiresFpuRegister() {
     return UnallocatedLocation(kRequiresFpuRegister);
   }
 
-  static Location WritableRegister() {
+  static TemplateLocation WritableRegister() {
     return UnallocatedLocation(kWritableRegister);
   }
 
   // The location of the first input to the instruction will be
   // used to replace this unallocated location.
-  static Location SameAsFirstInput() {
+  static TemplateLocation SameAsFirstInput() {
     return UnallocatedLocation(kSameAsFirstInput);
   }
 
   // Empty location. Used if there the location should be ignored.
-  static Location NoLocation() { return Location(); }
+  static TemplateLocation NoLocation() { return TemplateLocation(); }
 
   Policy policy() const {
     ASSERT(IsUnallocated());
@@ -253,8 +259,8 @@
   }
 
   // Register locations.
-  static Location RegisterLocation(Register reg) {
-    return Location(kRegister, reg);
+  static TemplateLocation RegisterLocation(Register reg) {
+    return TemplateLocation(kRegister, reg);
   }
 
   bool IsRegister() const { return kind() == kRegister; }
@@ -265,36 +271,12 @@
   }
 
   // FpuRegister locations.
-  static Location FpuRegisterLocation(FpuRegister reg) {
-    return Location(kFpuRegister, reg);
+  static TemplateLocation FpuRegisterLocation(FpuRegister reg) {
+    return TemplateLocation(kFpuRegister, reg);
   }
 
   bool IsFpuRegister() const { return kind() == kFpuRegister; }
 
-  static Location ArgumentsDescriptorLocation() {
-#ifdef TARGET_ARCH_DBC
-    return Location(kSpecialDbcRegister, kArgsDescriptorReg);
-#else
-    return Location::RegisterLocation(ARGS_DESC_REG);
-#endif
-  }
-
-  static Location ExceptionLocation() {
-#ifdef TARGET_ARCH_DBC
-    return Location(kSpecialDbcRegister, kExceptionReg);
-#else
-    return Location::RegisterLocation(kExceptionObjectReg);
-#endif
-  }
-
-  static Location StackTraceLocation() {
-#ifdef TARGET_ARCH_DBC
-    return Location(kSpecialDbcRegister, kStackTraceReg);
-#else
-    return Location::RegisterLocation(kStackTraceObjectReg);
-#endif
-  }
-
 #ifdef TARGET_ARCH_DBC
   bool IsArgsDescRegister() const {
     return IsSpecialDbcRegister(kArgsDescriptorReg);
@@ -320,7 +302,7 @@
     return (kind == kRegister) || (kind == kFpuRegister);
   }
 
-  static Location MachineRegisterLocation(Kind kind, intptr_t reg) {
+  static TemplateLocation MachineRegisterLocation(Kind kind, intptr_t reg) {
     if (kind == kRegister) {
       return RegisterLocation(static_cast<Register>(reg));
     } else {
@@ -342,10 +324,10 @@
     return static_cast<uword>(kStackIndexBias + stack_index);
   }
 
-  static Location StackSlot(intptr_t stack_index, Register base = FPREG) {
+  static TemplateLocation StackSlot(intptr_t stack_index, Register base) {
     uword payload = StackSlotBaseField::encode(base) |
                     StackIndexField::encode(EncodeStackIndex(stack_index));
-    Location loc(kStackSlot, payload);
+    TemplateLocation loc(kStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
@@ -353,10 +335,10 @@
 
   bool IsStackSlot() const { return kind() == kStackSlot; }
 
-  static Location DoubleStackSlot(intptr_t stack_index, Register base = FPREG) {
+  static TemplateLocation DoubleStackSlot(intptr_t stack_index, Register base) {
     uword payload = StackSlotBaseField::encode(base) |
                     StackIndexField::encode(EncodeStackIndex(stack_index));
-    Location loc(kDoubleStackSlot, payload);
+    TemplateLocation loc(kDoubleStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
@@ -364,10 +346,10 @@
 
   bool IsDoubleStackSlot() const { return kind() == kDoubleStackSlot; }
 
-  static Location QuadStackSlot(intptr_t stack_index) {
-    uword payload = StackSlotBaseField::encode(FPREG) |
+  static TemplateLocation QuadStackSlot(intptr_t stack_index, Register base) {
+    uword payload = StackSlotBaseField::encode(base) |
                     StackIndexField::encode(EncodeStackIndex(stack_index));
-    Location loc(kQuadStackSlot, payload);
+    TemplateLocation loc(kQuadStackSlot, payload);
     // Ensure that sign is preserved.
     ASSERT(loc.stack_index() == stack_index);
     return loc;
@@ -390,45 +372,27 @@
     return IsStackSlot() || IsDoubleStackSlot() || IsQuadStackSlot();
   }
 
-// DBC does not have an notion of 'address' in its instruction set.
-#if !defined(TARGET_ARCH_DBC)
-  // Return a memory operand for stack slot locations.
-  Address ToStackSlotAddress() const;
-#endif
-
   // Returns the offset from the frame pointer for stack slot locations.
   intptr_t ToStackSlotOffset() const;
 
-  // Constants.
-  static Location RegisterOrConstant(Value* value);
-  static Location RegisterOrSmiConstant(Value* value);
-  static Location WritableRegisterOrSmiConstant(Value* value);
-  static Location FixedRegisterOrConstant(Value* value, Register reg);
-  static Location FixedRegisterOrSmiConstant(Value* value, Register reg);
-  static Location AnyOrConstant(Value* value);
-
   const char* Name() const;
   void PrintTo(BufferFormatter* f) const;
   void Print() const;
   const char* ToCString() const;
 
   // Compare two locations.
-  bool Equals(Location other) const { return value_ == other.value_; }
+  bool Equals(TemplateLocation other) const { return value_ == other.value_; }
 
   // If current location is constant might return something that
   // is not equal to any Kind.
   Kind kind() const { return KindField::decode(value_); }
 
-  Location Copy() const;
-
-  Location RemapForSlowPath(Definition* def,
-                            intptr_t* cpu_reg_slots,
-                            intptr_t* fpu_reg_slots) const;
+  TemplateLocation Copy() const;
 
  private:
-  explicit Location(uword value) : value_(value) {}
+  explicit TemplateLocation(uword value) : value_(value) {}
 
-  Location(Kind kind, uword payload)
+  TemplateLocation(Kind kind, uword payload)
       : value_(KindField::encode(kind) | PayloadField::encode(payload)) {}
 
   uword payload() const { return PayloadField::decode(value_); }
@@ -462,11 +426,48 @@
   // a constant locations. Values of enumeration Kind are selected in such a
   // way that none of them can be interpreted as a kConstant tag.
   uword value_;
+
+  // The following functions are only defined for Location, not for
+  // HostLocation, but they do need access to private fields or constructors.
+  friend TemplateLocation<dart::Register, dart::FpuRegister>
+  LocationArgumentsDescriptorLocation();
+  friend TemplateLocation<dart::Register, dart::FpuRegister>
+  LocationExceptionLocation();
+  friend TemplateLocation<dart::Register, dart::FpuRegister>
+  LocationStackTraceLocation();
 };
 
-class PairLocation : public ZoneAllocated {
+using Location = TemplateLocation<dart::Register, dart::FpuRegister>;
+using HostLocation =
+    TemplateLocation<dart::host::Register, dart::host::FpuRegister>;
+
+// The following functions are only defined for Location, not for HostLocation.
+Location LocationArgumentsDescriptorLocation();
+Location LocationExceptionLocation();
+Location LocationStackTraceLocation();
+// Constants.
+Location LocationRegisterOrConstant(Value* value);
+Location LocationRegisterOrSmiConstant(Value* value);
+Location LocationWritableRegisterOrSmiConstant(Value* value);
+Location LocationFixedRegisterOrConstant(Value* value, Register reg);
+Location LocationFixedRegisterOrSmiConstant(Value* value, Register reg);
+Location LocationAnyOrConstant(Value* value);
+
+Location LocationRemapForSlowPath(Location loc,
+                                  Definition* def,
+                                  intptr_t* cpu_reg_slots,
+                                  intptr_t* fpu_reg_slots);
+
+// DBC does not have an notion of 'address' in its instruction set.
+#if !defined(TARGET_ARCH_DBC)
+// Return a memory operand for stack slot locations.
+Address LocationToStackSlotAddress(Location loc);
+#endif
+
+template <class Location>
+class TemplatePairLocation : public ZoneAllocated {
  public:
-  PairLocation() {
+  TemplatePairLocation() {
     for (intptr_t i = 0; i < kPairLength; i++) {
       ASSERT(locations_[i].IsInvalid());
     }
@@ -497,6 +498,9 @@
   Location locations_[kPairLength];
 };
 
+using PairLocation = TemplatePairLocation<Location>;
+using HostPairLocation = TemplatePairLocation<HostLocation>;
+
 template <typename T>
 class SmallSet {
  public:
@@ -544,6 +548,25 @@
     }
   }
 
+  // Adds all registers which don't have a special purpose (e.g. FP, SP, PC,
+  // CSP, etc.).
+  void AddAllGeneralRegisters() {
+    for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; --i) {
+      Register reg = static_cast<Register>(i);
+      if (reg == FPREG || reg == SPREG) continue;
+#if defined(TARGET_ARCH_ARM)
+      if (reg == PC) continue;
+#elif defined(TARGET_ARCH_ARM64)
+      if (reg == R31) continue;
+#endif
+      Add(Location::RegisterLocation(reg));
+    }
+
+    for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
+      Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
+    }
+  }
+
   void Add(Location loc, Representation rep = kTagged) {
     if (loc.IsRegister()) {
       cpu_registers_.Add(loc.reg());
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index abb9f5a..f29815c 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -951,8 +951,8 @@
     for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
       Instruction* instr = use->instruction();
-      if ((instr->IsRedefinition() || instr->IsAssertAssignable()) &&
-          HasLoadsFromPlace(instr->AsDefinition(), place)) {
+      if (UseIsARedefinition(use) &&
+          HasLoadsFromPlace(instr->Cast<Definition>(), place)) {
         return true;
       }
       bool is_load = false, is_store;
@@ -966,6 +966,14 @@
     return false;
   }
 
+  // Returns true if the given [use] is a redefinition (e.g. RedefinitionInstr,
+  // CheckNull, CheckArrayBound, etc).
+  static bool UseIsARedefinition(Value* use) {
+    Instruction* instr = use->instruction();
+    return instr->IsDefinition() &&
+           (instr->Cast<Definition>()->RedefinedValue() == use);
+  }
+
   // Check if any use of the definition can create an alias.
   // Can add more objects into aliasing_worklist_.
   bool AnyUseCreatesAlias(Definition* defn) {
@@ -978,8 +986,8 @@
            (use->use_index() == StoreIndexedInstr::kValuePos)) ||
           instr->IsStoreStaticField() || instr->IsPhi()) {
         return true;
-      } else if ((instr->IsAssertAssignable() || instr->IsRedefinition()) &&
-                 AnyUseCreatesAlias(instr->AsDefinition())) {
+      } else if (UseIsARedefinition(use) &&
+                 AnyUseCreatesAlias(instr->Cast<Definition>())) {
         return true;
       } else if ((instr->IsStoreInstanceField() &&
                   (use->use_index() !=
@@ -1017,15 +1025,14 @@
     // Find all stores into this object.
     for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
-      if (use->instruction()->IsRedefinition() ||
-          use->instruction()->IsAssertAssignable()) {
-        MarkStoredValuesEscaping(use->instruction()->AsDefinition());
+      auto instr = use->instruction();
+      if (UseIsARedefinition(use)) {
+        MarkStoredValuesEscaping(instr->AsDefinition());
         continue;
       }
       if ((use->use_index() == StoreInstanceFieldInstr::kInstancePos) &&
-          use->instruction()->IsStoreInstanceField()) {
-        StoreInstanceFieldInstr* store =
-            use->instruction()->AsStoreInstanceField();
+          instr->IsStoreInstanceField()) {
+        StoreInstanceFieldInstr* store = instr->AsStoreInstanceField();
         Definition* value = store->value()->definition()->OriginalDefinition();
         if (value->Identity().IsNotAliased()) {
           value->SetIdentity(AliasIdentity::Aliased());
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index 21e63d8..e06aca3 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -3,6 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/compiler/backend/redundancy_elimination.h"
+
+#include <functional>
+
+#include "vm/compiler/backend/block_builder.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/il_test_helper.h"
 #include "vm/compiler/backend/inliner.h"
@@ -194,4 +198,357 @@
   TryCatchOptimizerTest(thread, script_chars, /*synchronized=*/{"a", "b", "i"});
 }
 
+// LoadOptimizer tests
+
+// This family of tests verifies behavior of load forwarding when alias for an
+// allocation A is created by creating a redefinition for it and then
+// letting redefinition escape.
+static void TestAliasingViaRedefinition(
+    Thread* thread,
+    bool make_it_escape,
+    std::function<Definition*(CompilerState* S, FlowGraph*, Definition*)>
+        make_redefinition) {
+  const char* script_chars = R"(
+    dynamic blackhole([a, b, c, d, e, f]) native 'BlackholeNative';
+    class K {
+      var field;
+    }
+  )";
+  const Library& lib =
+      Library::Handle(LoadTestScript(script_chars, NoopNativeLookup));
+
+  const Class& cls = Class::Handle(
+      lib.LookupLocalClass(String::Handle(Symbols::New(thread, "K"))));
+  const Error& err = Error::Handle(cls.EnsureIsFinalized(thread));
+  EXPECT(err.IsNull());
+
+  const Field& field = Field::Handle(
+      cls.LookupField(String::Handle(Symbols::New(thread, "field"))));
+  EXPECT(!field.IsNull());
+
+  const Function& blackhole =
+      Function::ZoneHandle(GetFunction(lib, "blackhole"));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread);
+  FlowGraphBuilderHelper H;
+
+  // We are going to build the following graph:
+  //
+  // B0[graph_entry]
+  // B1[function_entry]:
+  //   v0 <- AllocateObject(class K)
+  //   v1 <- LoadField(v0, K.field)
+  //   v2 <- make_redefinition(v0)
+  //   PushArgument(v1)
+  // #if make_it_escape
+  //   PushArgument(v2)
+  // #endif
+  //   v3 <- StaticCall(blackhole, v1, v2)
+  //   v4 <- LoadField(v2, K.field)
+  //   Return v4
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+  AllocateObjectInstr* v0;
+  LoadFieldInstr* v1;
+  PushArgumentInstr* push_v1;
+  LoadFieldInstr* v4;
+  ReturnInstr* ret;
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto& slot = Slot::Get(field, &H.flow_graph()->parsed_function());
+    v0 = builder.AddDefinition(new AllocateObjectInstr(
+        TokenPosition::kNoSource, cls, new PushArgumentsArray(0)));
+    v1 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(v0), slot, TokenPosition::kNoSource));
+    auto v2 = builder.AddDefinition(make_redefinition(&S, H.flow_graph(), v0));
+    auto args = new PushArgumentsArray(2);
+    push_v1 = builder.AddInstruction(new PushArgumentInstr(new Value(v1)));
+    args->Add(push_v1);
+    if (make_it_escape) {
+      auto push_v2 =
+          builder.AddInstruction(new PushArgumentInstr(new Value(v2)));
+      args->Add(push_v2);
+    }
+    builder.AddInstruction(new StaticCallInstr(
+        TokenPosition::kNoSource, blackhole, 0, Array::empty_array(), args,
+        S.GetNextDeoptId(), 0, ICData::RebindRule::kStatic));
+    v4 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(v2), slot, TokenPosition::kNoSource));
+    ret = builder.AddInstruction(new ReturnInstr(
+        TokenPosition::kNoSource, new Value(v4), S.GetNextDeoptId()));
+  }
+  H.FinishGraph();
+  DominatorBasedCSE::Optimize(H.flow_graph());
+
+  if (make_it_escape) {
+    // Allocation must be considered aliased.
+    EXPECT_PROPERTY(v0, !it.Identity().IsNotAliased());
+  } else {
+    // Allocation must be considered not-aliased.
+    EXPECT_PROPERTY(v0, it.Identity().IsNotAliased());
+  }
+
+  // v1 should have been removed from the graph and replaced with constant_null.
+  EXPECT_PROPERTY(v1, it.next() == nullptr && it.previous() == nullptr);
+  EXPECT_PROPERTY(push_v1,
+                  it.value()->definition() == H.flow_graph()->constant_null());
+
+  if (make_it_escape) {
+    // v4 however should not be removed from the graph, because v0 escapes into
+    // blackhole.
+    EXPECT_PROPERTY(v4, it.next() != nullptr && it.previous() != nullptr);
+    EXPECT_PROPERTY(ret, it.value()->definition() == v4);
+  } else {
+    // If v0 it not aliased then v4 should also be removed from the graph.
+    EXPECT_PROPERTY(v4, it.next() == nullptr && it.previous() == nullptr);
+    EXPECT_PROPERTY(
+        ret, it.value()->definition() == H.flow_graph()->constant_null());
+  }
+}
+
+static Definition* MakeCheckNull(CompilerState* S,
+                                 FlowGraph* flow_graph,
+                                 Definition* defn) {
+  return new CheckNullInstr(new Value(defn), String::ZoneHandle(),
+                            S->GetNextDeoptId(), TokenPosition::kNoSource);
+}
+
+static Definition* MakeRedefinition(CompilerState* S,
+                                    FlowGraph* flow_graph,
+                                    Definition* defn) {
+  return new RedefinitionInstr(new Value(defn));
+}
+
+static Definition* MakeAssertAssignable(CompilerState* S,
+                                        FlowGraph* flow_graph,
+                                        Definition* defn) {
+  return new AssertAssignableInstr(TokenPosition::kNoSource, new Value(defn),
+                                   new Value(flow_graph->constant_null()),
+                                   new Value(flow_graph->constant_null()),
+                                   AbstractType::ZoneHandle(Type::ObjectType()),
+                                   Symbols::Empty(), S->GetNextDeoptId());
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_RedefinitionAliasing_CheckNull_NoEscape) {
+  TestAliasingViaRedefinition(thread, /*make_it_escape=*/false, MakeCheckNull);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_RedefinitionAliasing_CheckNull_Escape) {
+  TestAliasingViaRedefinition(thread, /*make_it_escape=*/true, MakeCheckNull);
+}
+
+ISOLATE_UNIT_TEST_CASE(
+    LoadOptimizer_RedefinitionAliasing_Redefinition_NoEscape) {
+  TestAliasingViaRedefinition(thread, /*make_it_escape=*/false,
+                              MakeRedefinition);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_RedefinitionAliasing_Redefinition_Escape) {
+  TestAliasingViaRedefinition(thread, /*make_it_escape=*/true,
+                              MakeRedefinition);
+}
+
+ISOLATE_UNIT_TEST_CASE(
+    LoadOptimizer_RedefinitionAliasing_AssertAssignable_NoEscape) {
+  TestAliasingViaRedefinition(thread, /*make_it_escape=*/false,
+                              MakeAssertAssignable);
+}
+
+ISOLATE_UNIT_TEST_CASE(
+    LoadOptimizer_RedefinitionAliasing_AssertAssignable_Escape) {
+  TestAliasingViaRedefinition(thread, /*make_it_escape=*/true,
+                              MakeAssertAssignable);
+}
+
+// This family of tests verifies behavior of load forwarding when alias for an
+// allocation A is created by storing it into another object B and then
+// either loaded from it ([make_it_escape] is true) or object B itself
+// escapes ([make_host_escape] is true).
+// We insert redefinition for object B to check that use list traversal
+// correctly discovers all loads and stores from B.
+static void TestAliasingViaStore(
+    Thread* thread,
+    bool make_it_escape,
+    bool make_host_escape,
+    std::function<Definition*(CompilerState* S, FlowGraph*, Definition*)>
+        make_redefinition) {
+  const char* script_chars = R"(
+    dynamic blackhole([a, b, c, d, e, f]) native 'BlackholeNative';
+    class K {
+      var field;
+    }
+  )";
+  const Library& lib =
+      Library::Handle(LoadTestScript(script_chars, NoopNativeLookup));
+
+  const Class& cls = Class::Handle(
+      lib.LookupLocalClass(String::Handle(Symbols::New(thread, "K"))));
+  const Error& err = Error::Handle(cls.EnsureIsFinalized(thread));
+  EXPECT(err.IsNull());
+
+  const Field& field = Field::Handle(
+      cls.LookupField(String::Handle(Symbols::New(thread, "field"))));
+  EXPECT(!field.IsNull());
+
+  const Function& blackhole =
+      Function::ZoneHandle(GetFunction(lib, "blackhole"));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread);
+  FlowGraphBuilderHelper H;
+
+  // We are going to build the following graph:
+  //
+  // B0[graph_entry]
+  // B1[function_entry]:
+  //   v0 <- AllocateObject(class K)
+  //   v5 <- AllocateObject(class K)
+  // #if !make_host_escape
+  //   StoreField(v5 . K.field = v0)
+  // #endif
+  //   v1 <- LoadField(v0, K.field)
+  //   v2 <- REDEFINITION(v5)
+  //   PushArgument(v1)
+  // #if make_it_escape
+  //   v6 <- LoadField(v2, K.field)
+  //   PushArgument(v6)
+  // #elif make_host_escape
+  //   StoreField(v2 . K.field = v0)
+  //   PushArgument(v5)
+  // #endif
+  //   v3 <- StaticCall(blackhole, v1, v6)
+  //   v4 <- LoadField(v0, K.field)
+  //   Return v4
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+  AllocateObjectInstr* v0;
+  AllocateObjectInstr* v5;
+  LoadFieldInstr* v1;
+  PushArgumentInstr* push_v1;
+  LoadFieldInstr* v4;
+  ReturnInstr* ret;
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto& slot = Slot::Get(field, &H.flow_graph()->parsed_function());
+    v0 = builder.AddDefinition(new AllocateObjectInstr(
+        TokenPosition::kNoSource, cls, new PushArgumentsArray(0)));
+    v5 = builder.AddDefinition(new AllocateObjectInstr(
+        TokenPosition::kNoSource, cls, new PushArgumentsArray(0)));
+    if (!make_host_escape) {
+      builder.AddInstruction(new StoreInstanceFieldInstr(
+          slot, new Value(v5), new Value(v0), kEmitStoreBarrier,
+          TokenPosition::kNoSource));
+    }
+    v1 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(v0), slot, TokenPosition::kNoSource));
+    auto v2 = builder.AddDefinition(make_redefinition(&S, H.flow_graph(), v5));
+    push_v1 = builder.AddInstruction(new PushArgumentInstr(new Value(v1)));
+    auto args = new PushArgumentsArray(2);
+    args->Add(push_v1);
+    if (make_it_escape) {
+      auto v6 = builder.AddDefinition(
+          new LoadFieldInstr(new Value(v2), slot, TokenPosition::kNoSource));
+      auto push_v6 =
+          builder.AddInstruction(new PushArgumentInstr(new Value(v6)));
+      args->Add(push_v6);
+    } else if (make_host_escape) {
+      builder.AddInstruction(new StoreInstanceFieldInstr(
+          slot, new Value(v2), new Value(v0), kEmitStoreBarrier,
+          TokenPosition::kNoSource));
+      args->Add(builder.AddInstruction(new PushArgumentInstr(new Value(v5))));
+    }
+    builder.AddInstruction(new StaticCallInstr(
+        TokenPosition::kNoSource, blackhole, 0, Array::empty_array(), args,
+        S.GetNextDeoptId(), 0, ICData::RebindRule::kStatic));
+    v4 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(v0), slot, TokenPosition::kNoSource));
+    ret = builder.AddInstruction(new ReturnInstr(
+        TokenPosition::kNoSource, new Value(v4), S.GetNextDeoptId()));
+  }
+  H.FinishGraph();
+  DominatorBasedCSE::Optimize(H.flow_graph());
+
+  if (make_it_escape || make_host_escape) {
+    // Allocation must be considered aliased.
+    EXPECT_PROPERTY(v0, !it.Identity().IsNotAliased());
+  } else {
+    // Allocation must not be considered aliased.
+    EXPECT_PROPERTY(v0, it.Identity().IsNotAliased());
+  }
+
+  if (make_host_escape) {
+    EXPECT_PROPERTY(v5, !it.Identity().IsNotAliased());
+  } else {
+    EXPECT_PROPERTY(v5, it.Identity().IsNotAliased());
+  }
+
+  // v1 should have been removed from the graph and replaced with constant_null.
+  EXPECT_PROPERTY(v1, it.next() == nullptr && it.previous() == nullptr);
+  EXPECT_PROPERTY(push_v1,
+                  it.value()->definition() == H.flow_graph()->constant_null());
+
+  if (make_it_escape || make_host_escape) {
+    // v4 however should not be removed from the graph, because v0 escapes into
+    // blackhole.
+    EXPECT_PROPERTY(v4, it.next() != nullptr && it.previous() != nullptr);
+    EXPECT_PROPERTY(ret, it.value()->definition() == v4);
+  } else {
+    // If v0 it not aliased then v4 should also be removed from the graph.
+    EXPECT_PROPERTY(v4, it.next() == nullptr && it.previous() == nullptr);
+    EXPECT_PROPERTY(
+        ret, it.value()->definition() == H.flow_graph()->constant_null());
+  }
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_AliasingViaStore_CheckNull_NoEscape) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/false,
+                       /* make_host_escape= */ false, MakeCheckNull);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_AliasingViaStore_CheckNull_Escape) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/true,
+                       /* make_host_escape= */ false, MakeCheckNull);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_AliasingViaStore_CheckNull_EscapeViaHost) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/false,
+                       /* make_host_escape= */ true, MakeCheckNull);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_AliasingViaStore_Redefinition_NoEscape) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/false,
+                       /* make_host_escape= */ false, MakeRedefinition);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_AliasingViaStore_Redefinition_Escape) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/true,
+                       /* make_host_escape= */ false, MakeRedefinition);
+}
+
+ISOLATE_UNIT_TEST_CASE(
+    LoadOptimizer_AliasingViaStore_Redefinition_EscapeViaHost) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/false,
+                       /* make_host_escape= */ true, MakeRedefinition);
+}
+
+ISOLATE_UNIT_TEST_CASE(
+    LoadOptimizer_AliasingViaStore_AssertAssignable_NoEscape) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/false,
+                       /* make_host_escape= */ false, MakeAssertAssignable);
+}
+
+ISOLATE_UNIT_TEST_CASE(LoadOptimizer_AliasingViaStore_AssertAssignable_Escape) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/true,
+                       /* make_host_escape= */ false, MakeAssertAssignable);
+}
+
+ISOLATE_UNIT_TEST_CASE(
+    LoadOptimizer_AliasingViaStore_AssertAssignable_EscapeViaHost) {
+  TestAliasingViaStore(thread, /*make_it_escape=*/false,
+                       /* make_host_escape= */ true, MakeAssertAssignable);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/type_propagator_test.cc b/runtime/vm/compiler/backend/type_propagator_test.cc
index ab6501bc..89bc20c 100644
--- a/runtime/vm/compiler/backend/type_propagator_test.cc
+++ b/runtime/vm/compiler/backend/type_propagator_test.cc
@@ -6,6 +6,7 @@
 
 #include "vm/compiler/backend/block_builder.h"
 #include "vm/compiler/backend/il_printer.h"
+#include "vm/compiler/backend/il_test_helper.h"
 #include "vm/compiler/backend/inliner.h"
 #include "vm/compiler/backend/loops.h"
 #include "vm/compiler/backend/redundancy_elimination.h"
@@ -22,129 +23,12 @@
 
 namespace dart {
 
-#if !defined(PRODUCT)
-#define TOCSTRING(v) ((v)->ToCString())
-#else
-#define TOCSTRING(v) "<?>"
-#endif
-
-#define EXPECT_PROPERTY(entity, property)                                      \
-  do {                                                                         \
-    auto& it = *entity;                                                        \
-    if (!(property)) {                                                         \
-      dart::Expect(__FILE__, __LINE__)                                         \
-          .Fail("expected " #property " for " #entity " which is %s.\n",       \
-                TOCSTRING(entity));                                            \
-    }                                                                          \
-  } while (0)
-
 using compiler::BlockBuilder;
 
-FlowGraph* MakeDummyGraph(Thread* thread) {
-  const Function& func = Function::ZoneHandle(Function::New(
-      String::Handle(Symbols::New(thread, "dummy")),
-      RawFunction::kRegularFunction,
-      /*is_static=*/true,
-      /*is_const=*/false,
-      /*is_abstract=*/false,
-      /*is_external=*/false,
-      /*is_native=*/true,
-      Class::Handle(thread->isolate()->object_store()->object_class()),
-      TokenPosition::kNoSource));
-
-  Zone* zone = thread->zone();
-  ParsedFunction* parsed_function = new (zone) ParsedFunction(thread, func);
-
-  parsed_function->SetNodeSequence(new SequenceNode(
-      TokenPosition::kNoSource, new LocalScope(nullptr, 0, 0)));
-
-  auto graph_entry =
-      new GraphEntryInstr(*parsed_function, Compiler::kNoOSRDeoptId);
-
-  intptr_t block_id = 1;  // 0 is GraphEntry.
-  graph_entry->set_normal_entry(
-      new FunctionEntryInstr(graph_entry, block_id, kInvalidTryIndex,
-                             CompilerState::Current().GetNextDeoptId()));
-  return new FlowGraph(*parsed_function, graph_entry, block_id,
-                       PrologueInfo{-1, -1});
-}
-
-namespace {
-class FlowGraphBuilderHelper {
- public:
-  explicit FlowGraphBuilderHelper(FlowGraph* flow_graph)
-      : state_(CompilerState::Current()),
-        flow_graph_(*flow_graph),
-        constant_dead_(flow_graph->GetConstant(Symbols::OptimizedOut())) {}
-
-  TargetEntryInstr* TargetEntry(intptr_t try_index = kInvalidTryIndex) const {
-    return new TargetEntryInstr(flow_graph_.allocate_block_id(), try_index,
-                                state_.GetNextDeoptId());
-  }
-
-  JoinEntryInstr* JoinEntry(intptr_t try_index = kInvalidTryIndex) const {
-    return new JoinEntryInstr(flow_graph_.allocate_block_id(), try_index,
-                              state_.GetNextDeoptId());
-  }
-
-  ConstantInstr* IntConstant(int64_t value) const {
-    return flow_graph_.GetConstant(
-        Integer::Handle(Integer::New(value, Heap::kOld)));
-  }
-
-  ConstantInstr* DoubleConstant(double value) {
-    return flow_graph_.GetConstant(
-        Double::Handle(Double::New(value, Heap::kOld)));
-  }
-
-  PhiInstr* Phi(JoinEntryInstr* join,
-                std::initializer_list<std::pair<BlockEntryInstr*, Definition*>>
-                    incomming) {
-    auto phi = new PhiInstr(join, incomming.size());
-    for (size_t i = 0; i < incomming.size(); i++) {
-      auto input = new Value(constant_dead_);
-      phi->SetInputAt(i, input);
-      input->definition()->AddInputUse(input);
-    }
-    for (auto pair : incomming) {
-      pending_phis_.Add({phi, pair.first, pair.second});
-    }
-    return phi;
-  }
-
-  void FinishGraph() {
-    flow_graph_.DiscoverBlocks();
-    GrowableArray<BitVector*> dominance_frontier;
-    flow_graph_.ComputeDominators(&dominance_frontier);
-
-    for (auto& pending : pending_phis_) {
-      auto join = pending.phi->block();
-      EXPECT(pending.phi->InputCount() == join->PredecessorCount());
-      auto pred_index = join->IndexOfPredecessor(pending.pred);
-      EXPECT(pred_index != -1);
-      pending.phi->InputAt(pred_index)->BindTo(pending.defn);
-    }
-  }
-
- private:
-  CompilerState& state_;
-  FlowGraph& flow_graph_;
-  ConstantInstr* constant_dead_;
-
-  struct PendingPhiInput {
-    PhiInstr* phi;
-    BlockEntryInstr* pred;
-    Definition* defn;
-  };
-  GrowableArray<PendingPhiInput> pending_phis_;
-};
-}  // namespace
-
 ISOLATE_UNIT_TEST_CASE(TypePropagator_RedefinitionAfterStrictCompareWithNull) {
   CompilerState S(thread);
 
-  FlowGraph* flow_graph = MakeDummyGraph(thread);
-  FlowGraphBuilderHelper H(flow_graph);
+  FlowGraphBuilderHelper H;
 
   // Add a variable into the scope which would provide static type for the
   // parameter.
@@ -153,9 +37,10 @@
                         String::Handle(Symbols::New(thread, "v0")),
                         AbstractType::ZoneHandle(Type::IntType()));
   v0_var->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
-  flow_graph->parsed_function().node_sequence()->scope()->AddVariable(v0_var);
+  H.flow_graph()->parsed_function().node_sequence()->scope()->AddVariable(
+      v0_var);
 
-  auto normal_entry = flow_graph->graph_entry()->normal_entry();
+  auto normal_entry = H.flow_graph()->graph_entry()->normal_entry();
 
   // We are going to build the following graph:
   //
@@ -173,29 +58,29 @@
   auto b3 = H.TargetEntry();
 
   {
-    BlockBuilder builder(flow_graph, normal_entry);
+    BlockBuilder builder(H.flow_graph(), normal_entry);
     v0 = builder.AddParameter(0, /*with_frame=*/true);
     builder.AddBranch(
         new StrictCompareInstr(
             TokenPosition::kNoSource, Token::kEQ_STRICT, new Value(v0),
-            new Value(flow_graph->GetConstant(Object::Handle())),
+            new Value(H.flow_graph()->GetConstant(Object::Handle())),
             /*needs_number_check=*/false, S.GetNextDeoptId()),
         b2, b3);
   }
 
   {
-    BlockBuilder builder(flow_graph, b2);
+    BlockBuilder builder(H.flow_graph(), b2);
     builder.AddReturn(new Value(v0));
   }
 
   {
-    BlockBuilder builder(flow_graph, b3);
+    BlockBuilder builder(H.flow_graph(), b3);
     builder.AddReturn(new Value(v0));
   }
 
   H.FinishGraph();
 
-  FlowGraphTypePropagator::Propagate(flow_graph);
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
 
   // We expect that v0 is inferred to be nullable int because that is what
   // static type of an associated variable tells us.
@@ -219,8 +104,7 @@
     TypePropagator_RedefinitionAfterStrictCompareWithLoadClassId) {
   CompilerState S(thread);
 
-  FlowGraph* flow_graph = MakeDummyGraph(thread);
-  FlowGraphBuilderHelper H(flow_graph);
+  FlowGraphBuilderHelper H;
 
   // We are going to build the following graph:
   //
@@ -235,12 +119,12 @@
   //   Return(v0)
 
   Definition* v0;
-  auto b1 = flow_graph->graph_entry()->normal_entry();
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
   auto b2 = H.TargetEntry();
   auto b3 = H.TargetEntry();
 
   {
-    BlockBuilder builder(flow_graph, b1);
+    BlockBuilder builder(H.flow_graph(), b1);
     v0 = builder.AddParameter(0, /*with_frame=*/true);
     auto load_cid = builder.AddDefinition(new LoadClassIdInstr(new Value(v0)));
     builder.AddBranch(
@@ -252,18 +136,18 @@
   }
 
   {
-    BlockBuilder builder(flow_graph, b2);
+    BlockBuilder builder(H.flow_graph(), b2);
     builder.AddReturn(new Value(v0));
   }
 
   {
-    BlockBuilder builder(flow_graph, b3);
+    BlockBuilder builder(H.flow_graph(), b3);
     builder.AddReturn(new Value(v0));
   }
 
   H.FinishGraph();
 
-  FlowGraphTypePropagator::Propagate(flow_graph);
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
 
   // There should be no information available about the incoming type of
   // the parameter either on entry or in B3.
@@ -304,8 +188,7 @@
                  /*is_reflectable=*/true, object_class, Object::dynamic_type(),
                  TokenPosition::kNoSource, TokenPosition::kNoSource));
 
-  FlowGraph* flow_graph = MakeDummyGraph(thread);
-  FlowGraphBuilderHelper H(flow_graph);
+  FlowGraphBuilderHelper H;
 
   // We are going to build the following graph:
   //
@@ -326,13 +209,13 @@
   Definition* v0;
   Definition* v2;
   PhiInstr* v3;
-  auto b1 = flow_graph->graph_entry()->normal_entry();
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
   auto b2 = H.TargetEntry();
   auto b3 = H.TargetEntry();
   auto b4 = H.JoinEntry();
 
   {
-    BlockBuilder builder(flow_graph, b1);
+    BlockBuilder builder(H.flow_graph(), b1);
     v0 = builder.AddParameter(0, /*with_frame=*/true);
     builder.AddBranch(new StrictCompareInstr(
                           TokenPosition::kNoSource, Token::kEQ_STRICT,
@@ -342,7 +225,7 @@
   }
 
   {
-    BlockBuilder builder(flow_graph, b2);
+    BlockBuilder builder(H.flow_graph(), b2);
     v2 = builder.AddDefinition(
         new StaticCallInstr(TokenPosition::kNoSource, target_func,
                             /*type_args_len=*/0,
@@ -353,30 +236,30 @@
   }
 
   {
-    BlockBuilder builder(flow_graph, b3);
+    BlockBuilder builder(H.flow_graph(), b3);
     builder.AddInstruction(new GotoInstr(b4, S.GetNextDeoptId()));
   }
 
   {
-    BlockBuilder builder(flow_graph, b4);
+    BlockBuilder builder(H.flow_graph(), b4);
     v3 = H.Phi(b4, {{b2, v2}, {b3, H.IntConstant(0)}});
     builder.AddPhi(v3);
     builder.AddReturn(new Value(v3));
   }
 
   H.FinishGraph();
-  FlowGraphTypePropagator::Propagate(flow_graph);
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
 
   EXPECT_PROPERTY(v2->Type(), it.IsNullableInt());
   EXPECT_PROPERTY(v3->Type(), it.IsNullableInt());
 
-  auto v4 = new LoadStaticFieldInstr(new Value(flow_graph->GetConstant(field)),
-                                     TokenPosition::kNoSource);
-  flow_graph->InsertBefore(v2, v4, nullptr, FlowGraph::kValue);
+  auto v4 = new LoadStaticFieldInstr(
+      new Value(H.flow_graph()->GetConstant(field)), TokenPosition::kNoSource);
+  H.flow_graph()->InsertBefore(v2, v4, nullptr, FlowGraph::kValue);
   v2->ReplaceUsesWith(v4);
   v2->RemoveFromGraph();
 
-  FlowGraphTypePropagator::Propagate(flow_graph);
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
 
   EXPECT_PROPERTY(v3->Type(), it.IsNullableInt());
 }
@@ -385,9 +268,7 @@
 // as reaching types after inference.
 ISOLATE_UNIT_TEST_CASE(TypePropagator_Regress36156) {
   CompilerState S(thread);
-
-  FlowGraph* flow_graph = MakeDummyGraph(thread);
-  FlowGraphBuilderHelper H(flow_graph);
+  FlowGraphBuilderHelper H;
 
   // We are going to build the following graph:
   //
@@ -416,7 +297,7 @@
   Definition* v0;
   PhiInstr* v3;
   PhiInstr* v5;
-  auto b1 = flow_graph->graph_entry()->normal_entry();
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
   auto b2 = H.TargetEntry();
   auto b3 = H.TargetEntry();
   auto b4 = H.TargetEntry();
@@ -425,7 +306,7 @@
   auto b7 = H.JoinEntry();
 
   {
-    BlockBuilder builder(flow_graph, b1);
+    BlockBuilder builder(H.flow_graph(), b1);
     v0 = builder.AddParameter(0, /*with_frame=*/true);
     builder.AddBranch(new StrictCompareInstr(
                           TokenPosition::kNoSource, Token::kEQ_STRICT,
@@ -435,7 +316,7 @@
   }
 
   {
-    BlockBuilder builder(flow_graph, b2);
+    BlockBuilder builder(H.flow_graph(), b2);
     builder.AddBranch(new StrictCompareInstr(
                           TokenPosition::kNoSource, Token::kEQ_STRICT,
                           new Value(v0), new Value(H.IntConstant(2)),
@@ -444,29 +325,29 @@
   }
 
   {
-    BlockBuilder builder(flow_graph, b3);
+    BlockBuilder builder(H.flow_graph(), b3);
     builder.AddInstruction(new GotoInstr(b5, S.GetNextDeoptId()));
   }
 
   {
-    BlockBuilder builder(flow_graph, b4);
+    BlockBuilder builder(H.flow_graph(), b4);
     builder.AddInstruction(new GotoInstr(b5, S.GetNextDeoptId()));
   }
 
   {
-    BlockBuilder builder(flow_graph, b5);
+    BlockBuilder builder(H.flow_graph(), b5);
     v3 = H.Phi(b5, {{b3, H.IntConstant(42)}, {b4, H.IntConstant(24)}});
     builder.AddPhi(v3);
     builder.AddInstruction(new GotoInstr(b7, S.GetNextDeoptId()));
   }
 
   {
-    BlockBuilder builder(flow_graph, b6);
+    BlockBuilder builder(H.flow_graph(), b6);
     builder.AddInstruction(new GotoInstr(b7, S.GetNextDeoptId()));
   }
 
   {
-    BlockBuilder builder(flow_graph, b7);
+    BlockBuilder builder(H.flow_graph(), b7);
     v5 = H.Phi(b7, {{b5, v3}, {b6, H.DoubleConstant(1.0)}});
     builder.AddPhi(v5);
     builder.AddInstruction(new ReturnInstr(TokenPosition::kNoSource,
@@ -475,7 +356,7 @@
 
   H.FinishGraph();
 
-  FlowGraphTypePropagator::Propagate(flow_graph);
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
 
   // We expect that v3 has an integer type, and v5 is either T{Object} or
   // T{num}.
@@ -492,7 +373,7 @@
       auto unbox =
           new UnboxInt64Instr(input->CopyWithType(), S.GetNextDeoptId(),
                               Instruction::kNotSpeculative);
-      flow_graph->InsertBefore(
+      H.flow_graph()->InsertBefore(
           v3->block()->PredecessorAt(i)->last_instruction(), unbox, nullptr,
           FlowGraph::kValue);
       input->BindTo(unbox);
@@ -500,12 +381,12 @@
 
     auto box = new BoxInt64Instr(new Value(v3));
     v3->ReplaceUsesWith(box);
-    flow_graph->InsertBefore(b4->last_instruction(), box, nullptr,
-                             FlowGraph::kValue);
+    H.flow_graph()->InsertBefore(b4->last_instruction(), box, nullptr,
+                                 FlowGraph::kValue);
   }
 
   // Run type propagation again.
-  FlowGraphTypePropagator::Propagate(flow_graph);
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
 
   // If CompileType of v3 would be cached as a reaching type at its use in
   // v5 then we will be incorrect type propagation results.
diff --git a/runtime/vm/compiler/ffi.cc b/runtime/vm/compiler/ffi.cc
index d63e1f7..8d8d136 100644
--- a/runtime/vm/compiler/ffi.cc
+++ b/runtime/vm/compiler/ffi.cc
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/compiler/ffi.h"
+#include <algorithm>
+#include "platform/globals.h"
 #include "vm/compiler/runtime_api.h"
 
 namespace dart {
@@ -11,8 +13,7 @@
 
 namespace ffi {
 
-#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64) ||                  \
-    defined(TARGET_ARCH_IA32)
+#if !defined(TARGET_ARCH_DBC)
 
 static const size_t kSizeUnknown = 0;
 
@@ -106,7 +107,13 @@
   for (intptr_t i = 0; i < num_arguments; i++) {
     AbstractType& arg_type =
         AbstractType::Handle(signature.ParameterTypeAt(i + 1));
-    result->Add(TypeRepresentation(arg_type));
+    Representation rep = TypeRepresentation(arg_type);
+    if (rep == kUnboxedFloat && CallingConventions::kAbiSoftFP) {
+      rep = kUnboxedInt32;
+    } else if (rep == kUnboxedDouble && CallingConventions::kAbiSoftFP) {
+      rep = kUnboxedInt64;
+    }
+    result->Add(rep);
   }
   return result;
 }
@@ -118,51 +125,100 @@
  public:
   Location AllocateArgument(Representation rep) {
     switch (rep) {
+      case kUnboxedFloat:
+      case kUnboxedDouble: {
+        Location result = AllocateFpuRegister();
+        if (!result.IsUnallocated()) return result;
+        break;
+      }
       case kUnboxedInt64:
       case kUnboxedUint32:
-      case kUnboxedInt32:
-        if (rep == kUnboxedInt64) {
-          ASSERT(compiler::target::kWordSize == 8);
-        }
-        if (cpu_regs_used < CallingConventions::kNumArgRegs) {
-          Location result = Location::RegisterLocation(
-              CallingConventions::ArgumentRegisters[cpu_regs_used]);
-          cpu_regs_used++;
-          if (CallingConventions::kArgumentIntRegXorFpuReg) {
-            fpu_regs_used++;
-          }
-          return result;
-        }
+      case kUnboxedInt32: {
+        Location result =
+            rep == kUnboxedInt64 && compiler::target::kWordSize == 4
+                ? AllocateAlignedRegisterPair()
+                : AllocateCpuRegister();
+        if (!result.IsUnallocated()) return result;
         break;
-      case kUnboxedFloat:
-      case kUnboxedDouble:
-        if (fpu_regs_used < CallingConventions::kNumFpuArgRegs) {
-          Location result = Location::FpuRegisterLocation(
-              CallingConventions::FpuArgumentRegisters[fpu_regs_used]);
-          fpu_regs_used++;
-          if (CallingConventions::kArgumentIntRegXorFpuReg) {
-            cpu_regs_used++;
-          }
-          return result;
-        }
-        break;
+      }
       default:
         UNREACHABLE();
     }
 
     // Argument must be spilled.
-    const intptr_t stack_slots_needed =
-        rep == kUnboxedDouble || rep == kUnboxedInt64
-            ? 8 / compiler::target::kWordSize
-            : 1;
-    Location result =
-        stack_slots_needed == 1
-            ? Location::StackSlot(stack_height_in_slots, SPREG)
-            : Location::DoubleStackSlot(stack_height_in_slots, SPREG);
-    stack_height_in_slots += stack_slots_needed;
+    if ((rep == kUnboxedInt64 || rep == kUnboxedDouble) &&
+        compiler::target::kWordSize == 4) {
+      return AllocateAlignedStackSlots(rep);
+    } else {
+      return AllocateStackSlot();
+    }
+  }
+
+ private:
+  Location AllocateStackSlot() {
+    return Location::StackSlot(stack_height_in_slots++, SPREG);
+  }
+
+  // Allocates a pair of stack slots where the first stack slot is aligned to an
+  // 8-byte boundary, if necessary.
+  Location AllocateAlignedStackSlots(Representation rep) {
+    if (CallingConventions::kAlignArguments &&
+        compiler::target::kWordSize == 4) {
+      stack_height_in_slots += stack_height_in_slots % 2;
+    }
+
+    Location result;
+    if (rep == kUnboxedDouble) {
+      result = Location::DoubleStackSlot(stack_height_in_slots, SPREG);
+      stack_height_in_slots += 2;
+    } else {
+      const Location low = AllocateStackSlot();
+      const Location high = AllocateStackSlot();
+      result = Location::Pair(low, high);
+    }
     return result;
   }
 
+  Location AllocateFpuRegister() {
+    if (fpu_regs_used == CallingConventions::kNumFpuArgRegs) {
+      return Location::RequiresFpuRegister();
+    }
+
+    const Location result = Location::FpuRegisterLocation(
+        CallingConventions::FpuArgumentRegisters[fpu_regs_used]);
+    fpu_regs_used++;
+    if (CallingConventions::kArgumentIntRegXorFpuReg) {
+      cpu_regs_used++;
+    }
+    return result;
+  }
+
+  Location AllocateCpuRegister() {
+    if (cpu_regs_used == CallingConventions::kNumArgRegs) {
+      return Location::RequiresRegister();
+    }
+
+    const Location result = Location::RegisterLocation(
+        CallingConventions::ArgumentRegisters[cpu_regs_used]);
+    cpu_regs_used++;
+    if (CallingConventions::kArgumentIntRegXorFpuReg) {
+      fpu_regs_used++;
+    }
+    return result;
+  }
+
+  // Allocates a pair of registers where the first register index is even, if
+  // necessary.
+  Location AllocateAlignedRegisterPair() {
+    if (CallingConventions::kAlignArguments) {
+      cpu_regs_used += cpu_regs_used % 2;
+    }
+    if (cpu_regs_used > CallingConventions::kNumArgRegs - 2) {
+      return Location::Any();
+    }
+    return Location::Pair(AllocateCpuRegister(), AllocateCpuRegister());
+  }
+
   intptr_t cpu_regs_used = 0;
   intptr_t fpu_regs_used = 0;
   intptr_t stack_height_in_slots = 0;
@@ -179,25 +235,33 @@
   ArgumentFrameState frame_state;
   for (intptr_t i = 0; i < num_arguments; i++) {
     Representation rep = arg_reps[i];
-    if (rep == kUnboxedInt64 && compiler::target::kWordSize < 8) {
-      Location low_bits_loc = frame_state.AllocateArgument(kUnboxedInt32);
-      Location high_bits_loc = frame_state.AllocateArgument(kUnboxedInt32);
-      ASSERT(low_bits_loc.IsStackSlot() == high_bits_loc.IsStackSlot());
-      result->Add(Location::Pair(low_bits_loc, high_bits_loc));
-    } else {
-      result->Add(frame_state.AllocateArgument(rep));
-    }
+    result->Add(frame_state.AllocateArgument(rep));
   }
   return result;
 }
 
 Representation ResultRepresentation(const Function& signature) {
   AbstractType& arg_type = AbstractType::Handle(signature.result_type());
-  return TypeRepresentation(arg_type);
+  Representation rep = TypeRepresentation(arg_type);
+  if (rep == kUnboxedFloat && CallingConventions::kAbiSoftFP) {
+    rep = kUnboxedInt32;
+  } else if (rep == kUnboxedDouble && CallingConventions::kAbiSoftFP) {
+    rep = kUnboxedInt64;
+  }
+  return rep;
 }
 
 Location ResultLocation(Representation result_rep) {
   switch (result_rep) {
+    case kUnboxedFloat:
+    case kUnboxedDouble:
+#if defined(TARGET_ARCH_IA32)
+      // The result is returned in ST0, but we don't allocate ST registers, so
+      // the FFI trampoline will move it to XMM0.
+      return Location::FpuRegisterLocation(XMM0);
+#else
+      return Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg);
+#endif
     case kUnboxedInt32:
     case kUnboxedUint32:
       return Location::RegisterLocation(CallingConventions::kReturnReg);
@@ -209,36 +273,30 @@
       } else {
         return Location::RegisterLocation(CallingConventions::kReturnReg);
       }
-    case kUnboxedFloat:
-    case kUnboxedDouble:
-#if defined(TARGET_ARCH_IA32)
-      // The result is returned in ST0, but we don't allocate ST registers, so
-      // the FFI trampoline will move it to XMM0.
-      return Location::FpuRegisterLocation(XMM0);
-#else
-      return Location::FpuRegisterLocation(CallingConventions::kReturnFpuReg);
-#endif
     default:
       UNREACHABLE();
   }
 }
 
+// Accounts for alignment, where some stack slots are used as padding.
 intptr_t NumStackSlots(const ZoneGrowableArray<Location>& locations) {
   intptr_t num_arguments = locations.length();
-  intptr_t num_stack_slots = 0;
+  intptr_t max_height_in_slots = 0;
   for (intptr_t i = 0; i < num_arguments; i++) {
+    intptr_t height = 0;
     if (locations.At(i).IsStackSlot()) {
-      num_stack_slots++;
+      height = locations.At(i).stack_index() + 1;
     } else if (locations.At(i).IsDoubleStackSlot()) {
-      num_stack_slots += 8 / compiler::target::kWordSize;
+      height = locations.At(i).stack_index() + 8 / compiler::target::kWordSize;
     } else if (locations.At(i).IsPairLocation()) {
-      num_stack_slots +=
-          locations.At(i).AsPairLocation()->At(0).IsStackSlot() ? 1 : 0;
-      num_stack_slots +=
-          locations.At(i).AsPairLocation()->At(1).IsStackSlot() ? 1 : 0;
+      const Location first = locations.At(i).AsPairLocation()->At(0);
+      const Location second = locations.At(i).AsPairLocation()->At(1);
+      height = std::max(first.IsStackSlot() ? first.stack_index() + 1 : 0,
+                        second.IsStackSlot() ? second.stack_index() + 1 : 0);
     }
+    max_height_in_slots = std::max(height, max_height_in_slots);
   }
-  return num_stack_slots;
+  return max_height_in_slots;
 }
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -249,7 +307,7 @@
   UNREACHABLE();
 }
 
-#endif  // defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_IA32)
+#endif  // !defined(TARGET_ARCH_DBC)
 
 }  // namespace ffi
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 0b6878c..07ac0b0 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -121,6 +121,17 @@
   return instructions;
 }
 
+Fragment BaseFlowGraphBuilder::StrictCompare(TokenPosition position,
+                                             Token::Kind kind,
+                                             bool number_check /* = false */) {
+  Value* right = Pop();
+  Value* left = Pop();
+  StrictCompareInstr* compare = new (Z) StrictCompareInstr(
+      position, kind, left, right, number_check, GetNextDeoptId());
+  Push(compare);
+  return Fragment(compare);
+}
+
 Fragment BaseFlowGraphBuilder::StrictCompare(Token::Kind kind,
                                              bool number_check /* = false */) {
   Value* right = Pop();
@@ -190,9 +201,11 @@
 }
 
 Fragment BaseFlowGraphBuilder::CheckStackOverflow(TokenPosition position,
+                                                  intptr_t stack_depth,
                                                   intptr_t loop_depth) {
-  return Fragment(
-      new (Z) CheckStackOverflowInstr(position, loop_depth, GetNextDeoptId()));
+  return Fragment(new (Z) CheckStackOverflowInstr(
+      position, stack_depth, loop_depth, GetNextDeoptId(),
+      CheckStackOverflowInstr::kOsrAndPreemption));
 }
 
 Fragment BaseFlowGraphBuilder::CheckStackOverflowInPrologue(
@@ -200,10 +213,10 @@
   if (IsInlining()) {
     // If we are inlining don't actually attach the stack check.  We must still
     // create the stack check in order to allocate a deopt id.
-    CheckStackOverflow(position, 0);
+    CheckStackOverflow(position, 0, 0);
     return Fragment();
   }
-  return CheckStackOverflow(position, 0);
+  return CheckStackOverflow(position, 0, 0);
 }
 
 Fragment BaseFlowGraphBuilder::Constant(const Object& value) {
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 5eb086b..a800743 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -205,6 +205,9 @@
   JoinEntryInstr* BuildJoinEntry();
   JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
 
+  Fragment StrictCompare(TokenPosition position,
+                         Token::Kind kind,
+                         bool number_check = false);
   Fragment StrictCompare(Token::Kind kind, bool number_check = false);
   Fragment Goto(JoinEntryInstr* destination);
   Fragment IntConstant(int64_t value);
@@ -226,7 +229,9 @@
   Fragment BranchIfStrictEqual(TargetEntryInstr** then_entry,
                                TargetEntryInstr** otherwise_entry);
   Fragment Return(TokenPosition position);
-  Fragment CheckStackOverflow(TokenPosition position, intptr_t loop_depth);
+  Fragment CheckStackOverflow(TokenPosition position,
+                              intptr_t stack_depth,
+                              intptr_t loop_depth);
   Fragment CheckStackOverflowInPrologue(TokenPosition position);
   Fragment ThrowException(TokenPosition position);
   Fragment TailCall(const Code& code);
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 03c8fc5..19b94e1 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -666,11 +666,8 @@
     ASSERT(IsStackEmpty());
     code_ += B->CheckStackOverflowInPrologue(position_);
   } else {
-    // Avoid OSR points inside block-expressions with pending stack slots.
-    // TODO(ajcbik): make sure OSR works for such cases too.
-    if (IsStackEmpty()) {
-      code_ += B->CheckStackOverflow(position_, loop_depth);
-    }
+    const intptr_t stack_depth = B->GetStackDepth();
+    code_ += B->CheckStackOverflow(position_, stack_depth, loop_depth);
   }
 }
 
@@ -783,7 +780,8 @@
   B->Push(call);
 }
 
-void BytecodeFlowGraphBuilder::BuildInterfaceCall() {
+void BytecodeFlowGraphBuilder::BuildInterfaceCallCommon(
+    bool is_unchecked_call) {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
   }
@@ -821,10 +819,22 @@
 
   // TODO(alexmarkov): add type info - call->SetResultType()
 
+  if (is_unchecked_call) {
+    call->set_entry_kind(Code::EntryKind::kUnchecked);
+  }
+
   code_ <<= call;
   B->Push(call);
 }
 
+void BytecodeFlowGraphBuilder::BuildInterfaceCall() {
+  BuildInterfaceCallCommon(/*is_unchecked_call=*/false);
+}
+
+void BytecodeFlowGraphBuilder::BuildUncheckedInterfaceCall() {
+  BuildInterfaceCallCommon(/*is_unchecked_call=*/true);
+}
+
 void BytecodeFlowGraphBuilder::BuildDynamicCall() {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
@@ -1551,9 +1561,11 @@
   code_ += B->LoadLocal(scratch_var_);
 }
 
-void BytecodeFlowGraphBuilder::BuildIntOp(const String& name,
-                                          Token::Kind token_kind,
-                                          int num_args) {
+void BytecodeFlowGraphBuilder::BuildPrimitiveOp(
+    const String& name,
+    Token::Kind token_kind,
+    const AbstractType& static_receiver_type,
+    int num_args) {
   ASSERT((num_args == 1) || (num_args == 2));
   ASSERT(MethodTokenRecognizer::RecognizeTokenKind(name) == token_kind);
 
@@ -1564,10 +1576,26 @@
       position_, name, token_kind, arguments, 0, Array::null_array(), num_args,
       *ic_data_array_, B->GetNextDeoptId());
 
+  call->set_receivers_static_type(&static_receiver_type);
+
   code_ <<= call;
   B->Push(call);
 }
 
+void BytecodeFlowGraphBuilder::BuildIntOp(const String& name,
+                                          Token::Kind token_kind,
+                                          int num_args) {
+  BuildPrimitiveOp(name, token_kind,
+                   AbstractType::ZoneHandle(Z, Type::IntType()), num_args);
+}
+
+void BytecodeFlowGraphBuilder::BuildDoubleOp(const String& name,
+                                             Token::Kind token_kind,
+                                             int num_args) {
+  BuildPrimitiveOp(name, token_kind,
+                   AbstractType::ZoneHandle(Z, Type::Double()), num_args);
+}
+
 void BytecodeFlowGraphBuilder::BuildNegateInt() {
   BuildIntOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
 }
@@ -1632,6 +1660,46 @@
   BuildIntOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
 }
 
+void BytecodeFlowGraphBuilder::BuildNegateDouble() {
+  BuildDoubleOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
+}
+
+void BytecodeFlowGraphBuilder::BuildAddDouble() {
+  BuildDoubleOp(Symbols::Plus(), Token::kADD, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildSubDouble() {
+  BuildDoubleOp(Symbols::Minus(), Token::kSUB, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildMulDouble() {
+  BuildDoubleOp(Symbols::Star(), Token::kMUL, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildDivDouble() {
+  BuildDoubleOp(Symbols::Slash(), Token::kDIV, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareDoubleEq() {
+  BuildDoubleOp(Symbols::EqualOperator(), Token::kEQ, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareDoubleGt() {
+  BuildDoubleOp(Symbols::RAngleBracket(), Token::kGT, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareDoubleLt() {
+  BuildDoubleOp(Symbols::LAngleBracket(), Token::kLT, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareDoubleGe() {
+  BuildDoubleOp(Symbols::GreaterEqualOperator(), Token::kGTE, 2);
+}
+
+void BytecodeFlowGraphBuilder::BuildCompareDoubleLe() {
+  BuildDoubleOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
+}
+
 void BytecodeFlowGraphBuilder::BuildAllocateClosure() {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
@@ -1740,6 +1808,13 @@
     if (KernelBytecode::IsJumpOpcode(instr)) {
       const intptr_t target = pc + KernelBytecode::DecodeT(instr);
       EnsureControlFlowJoin(descriptors, target);
+    } else if ((KernelBytecode::DecodeOpcode(instr) ==
+                KernelBytecode::kCheckStack) &&
+               (KernelBytecode::DecodeA(instr) != 0)) {
+      // (dartbug.com/36590) BlockEntryInstr::FindOsrEntryAndRelink assumes
+      // that CheckStackOverflow instruction is at the beginning of a join
+      // block.
+      EnsureControlFlowJoin(descriptors, pc);
     }
 
     if ((scratch_var_ == nullptr) && RequiresScratchVar(instr)) {
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
index 35f1cc5..c085374 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
@@ -132,7 +132,13 @@
   void PropagateStackState(intptr_t target_pc);
   void DropUnusedValuesFromStack();
   void BuildJumpIfStrictCompare(Token::Kind cmp_kind);
+  void BuildPrimitiveOp(const String& name,
+                        Token::Kind token_kind,
+                        const AbstractType& static_receiver_type,
+                        int num_args);
   void BuildIntOp(const String& name, Token::Kind token_kind, int num_args);
+  void BuildDoubleOp(const String& name, Token::Kind token_kind, int num_args);
+  void BuildInterfaceCallCommon(bool is_unchecked_call);
 
   void BuildInstruction(KernelBytecode::Opcode opcode);
 
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 6e53e13..c2a6590 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -58,6 +58,9 @@
     case RawFunction::kImplicitSetter:
       function.AttachBytecode(Object::implicit_setter_bytecode());
       return;
+    case RawFunction::kMethodExtractor:
+      function.AttachBytecode(Object::method_extractor_bytecode());
+      return;
     default: {
     }
   }
@@ -95,11 +98,12 @@
   ASSERT(function.is_declared_in_bytecode());
 
   // No parsing is needed if function has bytecode attached.
-  // With one exception: implicit getters and setters have artificial
-  // bytecodes, but they are still handled by shared flow graph builder
-  // which requires scopes/parsing.
-  if (function.HasBytecode() && !function.IsImplicitGetterFunction() &&
-      !function.IsImplicitSetterFunction()) {
+  // With one exception: implicit functions with artificial are still handled
+  // by shared flow graph builder which requires scopes/parsing.
+  if (function.HasBytecode() &&
+      (function.kind() != RawFunction::kImplicitGetter) &&
+      (function.kind() != RawFunction::kImplicitSetter) &&
+      (function.kind() != RawFunction::kMethodExtractor)) {
     return;
   }
 
@@ -338,7 +342,7 @@
   Object& parent = Object::Handle(Z, ReadObject());
   if (!parent.IsFunction()) {
     ASSERT(parent.IsField());
-    ASSERT(function.kind() == RawFunction::kImplicitStaticFinalGetter);
+    ASSERT(function.kind() == RawFunction::kStaticFieldInitializer);
     // Closure in a static field initializer, so use current function as parent.
     parent = function.raw();
   }
@@ -1896,13 +1900,19 @@
       break;
     case RawFunction::kImplicitGetter:
     case RawFunction::kImplicitSetter:
-    case RawFunction::kImplicitStaticFinalGetter:
-      if (IsBytecodeFieldInitializer(function, Z)) {
+      BytecodeScopeBuilder(parsed_function).BuildScopes();
+      break;
+    case RawFunction::kImplicitStaticFinalGetter: {
+      if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
         ReadCode(function, function.bytecode_offset());
       } else {
         BytecodeScopeBuilder(parsed_function).BuildScopes();
       }
       break;
+    }
+    case RawFunction::kStaticFieldInitializer:
+      ReadCode(function, function.bytecode_offset());
+      break;
     case RawFunction::kMethodExtractor:
       BytecodeScopeBuilder(parsed_function).BuildScopes();
       break;
@@ -2222,16 +2232,13 @@
       annotation_field.bytecode_offset());
 }
 
-bool IsBytecodeFieldInitializer(const Function& function, Zone* zone) {
-  if (IsFieldInitializer(function, zone)) {
-    return true;
-  }
-  if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
-    const auto& field = Field::Handle(zone, function.accessor_field());
-    return field.is_declared_in_bytecode() && field.is_const() &&
-           field.has_initializer();
-  }
-  return false;
+bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
+                                               Zone* zone) {
+  ASSERT(function.kind() == RawFunction::kImplicitStaticFinalGetter);
+
+  const auto& field = Field::Handle(zone, function.accessor_field());
+  return field.is_declared_in_bytecode() && field.is_const() &&
+         field.has_initializer();
 }
 
 }  // namespace kernel
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index c8859cd..bb858c3 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -303,10 +303,8 @@
   intptr_t cur_token_pos_;
 };
 
-// Returns [true] iff [function] body is a field initializer in bytecode.
-// This is [true] for ordinary static field initializers and getters of
-// const static fields.
-bool IsBytecodeFieldInitializer(const Function& function, Zone* zone);
+bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
+                                               Zone* zone);
 
 }  // namespace kernel
 }  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc b/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
index 5ff308b..5143ae9 100644
--- a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
@@ -4,7 +4,7 @@
 
 #include "vm/compiler/frontend/bytecode_scope_builder.h"
 
-#include "vm/compiler/frontend/bytecode_reader.h"  // For IsBytecodeFieldInitializer.
+#include "vm/compiler/frontend/bytecode_reader.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -107,7 +107,7 @@
       break;
     }
     case RawFunction::kImplicitStaticFinalGetter:
-      ASSERT(!IsBytecodeFieldInitializer(function, Z));
+      ASSERT(!IsStaticFieldGetterGeneratedAsInitializer(function, Z));
       break;
     case RawFunction::kDynamicInvocationForwarder: {
       // Create [this] variable.
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc
index 2aba84f..182e47d 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.cc
+++ b/runtime/vm/compiler/frontend/constant_evaluator.cc
@@ -101,7 +101,11 @@
         // These only occur inside unevaluated constants, so if we decide to
         // remove support for late evaluation of environment constants from
         // dill files in the VM, an implementation here will not be necessary.
-        UNIMPLEMENTED();
+        H.ReportError(
+            script_, TokenPosition::kNoSource,
+            "Unexpected unevaluated constant, All constant expressions"
+            " are expected to be evaluated at this point %s (%d)",
+            Reader::TagName(tag), tag);
         break;
       case kSymbolLiteral:
         EvaluateSymbolLiteral();
@@ -118,7 +122,10 @@
       case kConstSetLiteral:
         // Set literals are currently desugared in the frontend and will not
         // reach the VM. See http://dartbug.com/35124 for discussion.
-        UNREACHABLE();
+        H.ReportError(script_, TokenPosition::kNoSource,
+                      "Unexpected set literal constant, this constant"
+                      " is expected to be evaluated at this point %s (%d)",
+                      Reader::TagName(tag), tag);
         break;
       case kConstMapLiteral:
         EvaluateMapLiteralInternal();
@@ -161,7 +168,10 @@
         EvaluateNullLiteral();
         break;
       case kConstantExpression:
-        EvaluateConstantExpression();
+        EvaluateConstantExpression(tag);
+        break;
+      case kDeprecated_ConstantExpression:
+        EvaluateConstantExpression(tag);
         break;
       default:
         H.ReportError(
@@ -389,7 +399,6 @@
         field.SetStaticValue(Object::null_instance());
         H.ReportError(Error::Cast(value), script_, position,
                       "Not a constant expression.");
-        UNREACHABLE();
       }
       Thread* thread = H.thread();
       const Error& error =
@@ -397,7 +406,6 @@
       if (!error.IsNull()) {
         field.SetStaticValue(Object::null_instance());
         H.ReportError(error, script_, position, "Not a constant expression.");
-        UNREACHABLE();
       }
       ASSERT(value.IsNull() || value.IsInstance());
       field.SetStaticValue(value.IsNull() ? Instance::null_instance()
@@ -860,12 +868,16 @@
   result_ = Instance::null();
 }
 
-void ConstantEvaluator::EvaluateConstantExpression() {
+void ConstantEvaluator::EvaluateConstantExpression(Tag tag) {
   // Please note that this constants array is constructed exactly once, see
   // ReadConstantTable() and is immutable from that point on, so there is no
   // need to guard against concurrent access between mutator and background
   // compiler.
   KernelConstantsMap constant_map(H.constants().raw());
+  if (tag == kConstantExpression) {
+    helper_->ReadPosition();
+    helper_->SkipDartType();
+  }
   result_ ^= constant_map.GetOrDie(helper_->ReadUInt());
   ASSERT(constant_map.Release().raw() == H.constants().raw());
 }
@@ -1038,7 +1050,8 @@
   if (!IsBuildingFlowGraph()) return false;
 
   const Function& function = flow_graph_builder_->parsed_function_->function();
-  if (function.kind() == RawFunction::kImplicitStaticFinalGetter &&
+  if ((function.kind() == RawFunction::kImplicitStaticFinalGetter ||
+       function.kind() == RawFunction::kStaticFieldInitializer) &&
       !I->CanOptimizeImmediately()) {
     // Don't cache constants in initializer expressions. They get
     // evaluated only once.
@@ -1070,7 +1083,8 @@
   if (!IsBuildingFlowGraph()) return;
 
   const Function& function = flow_graph_builder_->parsed_function_->function();
-  if (function.kind() == RawFunction::kImplicitStaticFinalGetter &&
+  if ((function.kind() == RawFunction::kImplicitStaticFinalGetter ||
+       function.kind() == RawFunction::kStaticFieldInitializer) &&
       !I->CanOptimizeImmediately()) {
     // Don't cache constants in initializer expressions. They get
     // evaluated only once.
@@ -1218,7 +1232,10 @@
       case kSetConstant:
         // Set literals are currently desugared in the frontend and will not
         // reach the VM. See http://dartbug.com/35124 for discussion.
-        UNREACHABLE();
+        H.ReportError(script(), TokenPosition::kNoSource,
+                      "Unexpected set constant, this constant"
+                      " is expected to be evaluated at this point (%" Pd ")",
+                      constant_tag);
         break;
       case kInstanceConstant: {
         const NameIndex index = helper_.ReadCanonicalNameReference();
@@ -1278,6 +1295,7 @@
         for (intptr_t j = 0; j < number_of_type_arguments; ++j) {
           temp_type_arguments_.SetTypeAt(j, type_translator_.BuildType());
         }
+        temp_type_arguments_ = temp_type_arguments_.Canonicalize();
 
         // Make a copy of the old closure, with the delayed type arguments
         // set to [temp_type_arguments_].
@@ -1311,12 +1329,19 @@
       }
       case kMapConstant:
         // Note: This is already lowered to InstanceConstant/ListConstant.
-        UNREACHABLE();
+        H.ReportError(script(), TokenPosition::kNoSource,
+                      "Unexpected map constant, this constant"
+                      " is expected to be evaluated at this point (%" Pd ")",
+                      constant_tag);
         break;
       case kUnevaluatedConstant:
         // We should not see unevaluated constants in the constant table, they
         // should have been fully evaluated before we get them.
-        UNREACHABLE();
+        H.ReportError(
+            script(), TokenPosition::kNoSource,
+            "Unexpected unevaluated constant, All constant expressions"
+            " are expected to be evaluated at this point (%" Pd ")",
+            constant_tag);
         break;
       default:
         UNREACHABLE();
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.h b/runtime/vm/compiler/frontend/constant_evaluator.h
index f5fe543..0483baa 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.h
+++ b/runtime/vm/compiler/frontend/constant_evaluator.h
@@ -88,7 +88,7 @@
   void EvaluateDoubleLiteral();
   void EvaluateBoolLiteral(bool value);
   void EvaluateNullLiteral();
-  void EvaluateConstantExpression();
+  void EvaluateConstantExpression(Tag tag);
 
   void EvaluateGetStringLength(intptr_t expression_offset,
                                TokenPosition position);
@@ -156,6 +156,8 @@
   const Array& ReadConstantTable();
 
  private:
+  const Script& script() const { return helper_.script_; }
+
   void InstantiateTypeArguments(const Class& receiver_class,
                                 TypeArguments* type_arguments);
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 6f326e7..935ae39 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -9,7 +9,6 @@
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For dart::FlowGraphBuilder::SimpleInstanceOfType.
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
-#include "vm/kernel.h"  // For IsFieldInitializer.
 #include "vm/object_store.h"
 #include "vm/stack_frame.h"
 
@@ -936,11 +935,13 @@
         return B->BuildGraphOfImplicitClosureFunction(function);
       case RawFunction::kImplicitGetter:
       case RawFunction::kImplicitSetter:
-      case RawFunction::kImplicitStaticFinalGetter:
-        if (!IsBytecodeFieldInitializer(function, Z)) {
-          return B->BuildGraphOfFieldAccessor(function);
+        return B->BuildGraphOfFieldAccessor(function);
+      case RawFunction::kImplicitStaticFinalGetter: {
+        if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
+          break;
         }
-        break;
+        return B->BuildGraphOfFieldAccessor(function);
+      }
       case RawFunction::kDynamicInvocationForwarder:
         return B->BuildGraphOfDynamicInvocationForwarder(function);
       case RawFunction::kMethodExtractor:
@@ -966,7 +967,8 @@
     }
     if (function.HasBytecode() &&
         (function.kind() != RawFunction::kImplicitGetter) &&
-        (function.kind() != RawFunction::kImplicitSetter)) {
+        (function.kind() != RawFunction::kImplicitSetter) &&
+        (function.kind() != RawFunction::kMethodExtractor)) {
       BytecodeFlowGraphBuilder bytecode_compiler(
           flow_graph_builder_, parsed_function(),
           &(flow_graph_builder_->ic_data_array_));
@@ -991,15 +993,14 @@
     case RawFunction::kImplicitGetter:
     case RawFunction::kImplicitStaticFinalGetter:
     case RawFunction::kImplicitSetter: {
-      if (IsFieldInitializer(function, Z)) {
-        return BuildGraphOfFieldInitializer();
-      }
       const Field& field = Field::Handle(Z, function.accessor_field());
       if (field.is_const() && field.IsUninitialized()) {
         EvaluateConstFieldValue(field);
       }
       return B->BuildGraphOfFieldAccessor(function);
     }
+    case RawFunction::kStaticFieldInitializer:
+      return BuildGraphOfFieldInitializer();
     case RawFunction::kDynamicInvocationForwarder:
       return B->BuildGraphOfDynamicInvocationForwarder(function);
     case RawFunction::kMethodExtractor:
@@ -1054,6 +1055,7 @@
     case RawFunction::kImplicitGetter:
     case RawFunction::kImplicitStaticFinalGetter:
     case RawFunction::kImplicitSetter:
+    case RawFunction::kStaticFieldInitializer:
     case RawFunction::kMethodExtractor:
     case RawFunction::kNoSuchMethodDispatcher:
     case RawFunction::kInvokeFieldDispatcher:
@@ -1217,7 +1219,9 @@
     case kNullLiteral:
       return BuildNullLiteral(position);
     case kConstantExpression:
-      return BuildConstantExpression(position);
+      return BuildConstantExpression(position, tag);
+    case kDeprecated_ConstantExpression:
+      return BuildConstantExpression(position, tag);
     case kInstantiation:
       return BuildPartialTearoffInstantiation(position);
     case kLoadLibrary:
@@ -1614,9 +1618,10 @@
       type_arguments);
 }
 
-Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind,
+Fragment StreamingFlowGraphBuilder::StrictCompare(TokenPosition position,
+                                                  Token::Kind kind,
                                                   bool number_check) {
-  return flow_graph_builder_->StrictCompare(kind, number_check);
+  return flow_graph_builder_->StrictCompare(position, kind, number_check);
 }
 
 Fragment StreamingFlowGraphBuilder::AllocateObject(TokenPosition position,
@@ -1679,7 +1684,8 @@
 
 Fragment StreamingFlowGraphBuilder::CheckStackOverflow(TokenPosition position) {
   return flow_graph_builder_->CheckStackOverflow(
-      position, flow_graph_builder_->loop_depth_);
+      position, flow_graph_builder_->GetStackDepth(),
+      flow_graph_builder_->loop_depth_);
 }
 
 Fragment StreamingFlowGraphBuilder::CloneContext(
@@ -2610,7 +2616,6 @@
 
   bool is_unchecked_closure_call = false;
   bool is_unchecked_call = result_type.IsSkipCheck();
-#ifndef TARGET_ARCH_DBC
   if (call_site_attributes.receiver_type != nullptr) {
     if (call_site_attributes.receiver_type->IsFunctionType()) {
       AlternativeReadingScope alt(&reader_);
@@ -2623,7 +2628,6 @@
       is_unchecked_call = true;
     }
   }
-#endif
 
   Fragment instructions;
 
@@ -2677,7 +2681,7 @@
     Token::Kind strict_cmp_kind =
         token_kind == Token::kEQ ? Token::kEQ_STRICT : Token::kNE_STRICT;
     return instructions +
-           StrictCompare(strict_cmp_kind, /*number_check = */ true);
+           StrictCompare(position, strict_cmp_kind, /*number_check = */ true);
   }
 
   LocalVariable* receiver_temp = NULL;
@@ -2851,7 +2855,7 @@
     Token::Kind strict_cmp_kind =
         token_kind == Token::kEQ ? Token::kEQ_STRICT : Token::kNE_STRICT;
     return instructions +
-           StrictCompare(strict_cmp_kind, /*number_check = */ true);
+           StrictCompare(position, strict_cmp_kind, /*number_check = */ true);
   }
 
   instructions += PushArgument();  // push receiver as argument.
@@ -3118,7 +3122,8 @@
   // there.
   if (special_case_identical) {
     ASSERT(argument_count == 2);
-    instructions += StrictCompare(Token::kEQ_STRICT, /*number_check=*/true);
+    instructions +=
+        StrictCompare(position, Token::kEQ_STRICT, /*number_check=*/true);
   } else if (special_case_unchecked_cast) {
     // Simply do nothing: the result value is already pushed on the stack.
   } else {
@@ -3761,8 +3766,14 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildConstantExpression(
-    TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+    TokenPosition* position,
+    Tag tag) {
+  TokenPosition p = TokenPosition::kNoSource;
+  if (tag == kConstantExpression) {
+    p = ReadPosition();
+    SkipDartType();
+  }
+  if (position != nullptr) *position = p;
   const intptr_t constant_offset = ReadUInt();
   KernelConstantsMap constant_map(H.constants().raw());
   Fragment result =
@@ -4018,7 +4029,7 @@
 Fragment StreamingFlowGraphBuilder::BuildWhileStatement() {
   ASSERT(block_expression_depth() == 0);  // no while in block-expr
   loop_depth_inc();
-  const TokenPosition position = ReadPosition();  // read position.
+  const TokenPosition position = ReadPosition();            // read position.
   TestFragment condition = TranslateConditionForControl();  // read condition.
   const Fragment body = BuildStatement();                   // read body
 
@@ -4031,6 +4042,7 @@
     body_entry += Goto(join);
 
     Fragment loop(join);
+    ASSERT(B->GetStackDepth() == 0);
     loop += CheckStackOverflow(position);
     loop.current->LinkTo(condition.entry);
 
@@ -4059,6 +4071,7 @@
 
   JoinEntryInstr* join = BuildJoinEntry();
   Fragment loop(join);
+  ASSERT(B->GetStackDepth() == 0);
   loop += CheckStackOverflow(position);
   loop += body;
   loop <<= condition.entry;
@@ -4127,11 +4140,7 @@
     body += Goto(join);
 
     Fragment loop(join);
-
-    // Avoid OSR point inside block-expressions.
-    // TODO(ajcbik): make sure OSR works inside BE too
-    if (B->GetStackDepth() == 0) loop += CheckStackOverflow(position);
-
+    loop += CheckStackOverflow(position);  // may have non-empty stack
     if (condition.entry != nullptr) {
       loop <<= condition.entry;
     } else {
@@ -4158,7 +4167,7 @@
   intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
   const TokenPosition position = ReadPosition();  // read position.
-  TokenPosition body_position = ReadPosition();  // read body position.
+  TokenPosition body_position = ReadPosition();   // read body position.
   intptr_t variable_kernel_position = ReaderOffset() + data_program_offset_;
   SkipVariableDeclaration();  // read variable.
 
@@ -4204,11 +4213,7 @@
     body += Goto(join);
 
     Fragment loop(join);
-
-    // Avoid OSR point inside block-expressions.
-    // TODO(ajcbik): make sure OSR works inside BE too
-    if (B->GetStackDepth() == 0) loop += CheckStackOverflow(position);
-
+    loop += CheckStackOverflow(position);  // may have non-empty stack
     loop += condition;
   } else {
     instructions += condition;
@@ -4451,7 +4456,7 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildIfStatement() {
-  ReadPosition();                                       // read position.
+  ReadPosition();  // read position.
 
   TestFragment condition = TranslateConditionForControl();
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index ee76b40..edf29ea 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -202,7 +202,9 @@
   Fragment BooleanNegate();
   Fragment TranslateInstantiatedTypeArguments(
       const TypeArguments& type_arguments);
-  Fragment StrictCompare(Token::Kind kind, bool number_check = false);
+  Fragment StrictCompare(TokenPosition position,
+                         Token::Kind kind,
+                         bool number_check = false);
   Fragment AllocateObject(TokenPosition position,
                           const Class& klass,
                           intptr_t argument_count);
@@ -321,7 +323,7 @@
   Fragment BuildBoolLiteral(bool value, TokenPosition* position);
   Fragment BuildNullLiteral(TokenPosition* position);
   Fragment BuildFutureNullValue(TokenPosition* position);
-  Fragment BuildConstantExpression(TokenPosition* position);
+  Fragment BuildConstantExpression(TokenPosition* position, Tag tag);
   Fragment BuildPartialTearoffInstantiation(TokenPosition* position);
 
   Fragment BuildExpressionStatement();
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index be15d45..848365d 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -549,6 +549,11 @@
     case kNullLiteral:
       return;
     case kConstantExpression:
+      ReadPosition();
+      SkipDartType();
+      SkipConstantReference();
+      return;
+    case kDeprecated_ConstantExpression:
       SkipConstantReference();
       return;
     case kLoadLibrary:
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 713139f..ba7ab1b 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -738,7 +738,7 @@
   const MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
   bool omit_result_type_check = true;
   switch (kind) {
-    // On simdbc we fall back to natives.
+// On simdbc we fall back to natives.
 #if !defined(TARGET_ARCH_DBC)
     case MethodRecognizer::kTypedData_ByteDataView_factory:
       body += BuildTypedDataViewFactoryConstructor(function, kByteDataViewCid);
@@ -1142,8 +1142,12 @@
 }
 
 Fragment FlowGraphBuilder::DebugStepCheck(TokenPosition position) {
+#ifdef PRODUCT
+  return Fragment();
+#else
   return Fragment(new (Z) DebugStepCheckInstr(
       position, RawPcDescriptors::kRuntimeCall, GetNextDeoptId()));
+#endif
 }
 
 Fragment FlowGraphBuilder::EvaluateAssertion() {
@@ -2011,7 +2015,12 @@
   extra_entry += Drop();
   extra_entry += Goto(join_entry);
 
-  join_entry->LinkTo(prologue_start);
+  if (prologue_start != nullptr) {
+    join_entry->LinkTo(prologue_start);
+  } else {
+    // Prologue is empty.
+    shared_prologue_linked_in.current = join_entry;
+  }
 
   TargetEntryInstr *do_checks, *skip_checks;
   shared_prologue_linked_in +=
@@ -2486,12 +2495,15 @@
   return rest;
 }
 
+Fragment FlowGraphBuilder::BitCast(Representation from, Representation to) {
+  BitCastInstr* instr = new (Z) BitCastInstr(from, to, Pop());
+  Push(instr);
+  return Fragment(instr);
+}
+
 FlowGraph* FlowGraphBuilder::BuildGraphOfFfiTrampoline(
     const Function& function) {
-#if !defined(TARGET_ARCH_X64) && !defined(TARGET_ARCH_ARM64) &&                \
-    !defined(TARGET_ARCH_IA32)
-  UNREACHABLE();
-#else
+#if !defined(TARGET_ARCH_DBC)
   graph_entry_ =
       new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
 
@@ -2531,9 +2543,15 @@
       body += LoadAddressFromFfiPointer();
       body += UnboxTruncate(kUnboxedFfiIntPtr);
     } else {
-      Representation rep = arg_reps[pos - 1];
-      body += UnboxTruncate(rep);
-      body += FfiUnboxedExtend(rep, ffi_type);
+      Representation from_rep = compiler::ffi::TypeRepresentation(ffi_type);
+      body += UnboxTruncate(from_rep);
+
+      Representation to_rep = arg_reps[pos - 1];
+      if (from_rep != to_rep) {
+        body += BitCast(from_rep, to_rep);
+      } else {
+        body += FfiUnboxedExtend(from_rep, ffi_type);
+      }
     }
   }
 
@@ -2556,15 +2574,22 @@
     body += Drop();
     body += NullConstant();
   } else {
-    Representation rep = compiler::ffi::ResultRepresentation(signature);
-    body += FfiUnboxedExtend(rep, ffi_type);
-    body += Box(rep);
+    Representation from_rep = compiler::ffi::ResultRepresentation(signature);
+    Representation to_rep = compiler::ffi::TypeRepresentation(ffi_type);
+    if (from_rep != to_rep) {
+      body += BitCast(from_rep, to_rep);
+    } else {
+      body += FfiUnboxedExtend(from_rep, ffi_type);
+    }
+    body += Box(to_rep);
   }
 
   body += Return(TokenPosition::kNoSource);
 
   return new (Z) FlowGraph(*parsed_function_, graph_entry_, last_used_block_id_,
                            prologue_info);
+#else
+  UNREACHABLE();
 #endif
 }
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index c7fb8da..0b18641 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -233,6 +233,11 @@
   // the pointer.
   Fragment FfiPointerFromAddress(const Type& result_type);
 
+  // Bit-wise cast between representations.
+  // Pops the input and pushes the converted result.
+  // Currently only works with equal sizes and floating point <-> integer.
+  Fragment BitCast(Representation from, Representation to);
+
   LocalVariable* LookupVariable(intptr_t kernel_offset);
 
   // Build argument type checks for the current function.
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 971ac05..6f46ea7 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1313,74 +1313,7 @@
         helper_->SkipLibraryDependency();
       }
       if (++next_read_ == field) return;
-      FALL_THROUGH;
     }
-    case kAdditionalExports: {
-      intptr_t name_count = helper_->ReadUInt();
-      for (intptr_t i = 0; i < name_count; ++i) {
-        helper_->SkipCanonicalNameReference();
-      }
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    }
-    case kParts: {
-      intptr_t part_count = helper_->ReadUInt();  // read list length.
-      for (intptr_t i = 0; i < part_count; ++i) {
-        helper_->SkipLibraryPart();
-      }
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    }
-    case kTypedefs: {
-      intptr_t typedef_count = helper_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < typedef_count; i++) {
-        helper_->SkipLibraryTypedef();
-      }
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    }
-    case kClasses: {
-      class_count_ = helper_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < class_count_; ++i) {
-        ClassHelper class_helper(helper_);
-        class_helper.ReadUntilExcluding(ClassHelper::kEnd);
-      }
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    }
-    case kToplevelField: {
-      intptr_t field_count = helper_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < field_count; ++i) {
-        FieldHelper field_helper(helper_);
-        field_helper.ReadUntilExcluding(FieldHelper::kEnd);
-      }
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    }
-    case kToplevelProcedures: {
-      procedure_count_ = helper_->ReadListLength();  // read list length.
-      for (intptr_t i = 0; i < procedure_count_; ++i) {
-        ProcedureHelper procedure_helper(helper_);
-        procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
-      }
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    }
-    case kLibraryIndex:
-      // Read library index.
-      for (intptr_t i = 0; i < class_count_; ++i) {
-        helper_->reader_.ReadUInt32();
-      }
-      helper_->reader_.ReadUInt32();
-      helper_->reader_.ReadUInt32();
-      for (intptr_t i = 0; i < procedure_count_; ++i) {
-        helper_->reader_.ReadUInt32();
-      }
-      helper_->reader_.ReadUInt32();
-      helper_->reader_.ReadUInt32();
-      if (++next_read_ == field) return;
-      FALL_THROUGH;
-    case kEnd:
       return;
   }
 }
@@ -2332,6 +2265,11 @@
     case kNullLiteral:
       return;
     case kConstantExpression:
+      ReadPosition();  // read position.
+      SkipDartType();  // read type.
+      SkipConstantReference();
+      return;
+    case kDeprecated_ConstantExpression:
       SkipConstantReference();
       return;
     case kLoadLibrary:
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 745daa7..9508b70 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -708,14 +708,17 @@
     kProblemsAsJson,
     kAnnotations,
     kDependencies,
-    kAdditionalExports,
-    kParts,
-    kTypedefs,
-    kClasses,
-    kToplevelField,
-    kToplevelProcedures,
-    kLibraryIndex,
-    kEnd,
+    // There are other fields in a library:
+    // * kAdditionalExports
+    // * kParts
+    // * kTypedefs
+    // * kClasses
+    // * kToplevelField
+    // * kToplevelProcedures
+    // * kSourceReferences
+    // * kLibraryIndex
+    // but we never read them via this helper and it makes extending the format
+    // harder to keep the code around.
   };
 
   enum Flag {
@@ -742,8 +745,6 @@
   NameIndex canonical_name_;
   StringIndex name_index_;
   intptr_t source_uri_index_;
-  intptr_t class_count_;
-  intptr_t procedure_count_;
 
  private:
   KernelReaderHelper* helper_;
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index deb29dc..f0cb2cf 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -81,12 +81,13 @@
 
   // Always do this to preserve deoptid numbering.
   JoinEntryInstr* normal_code = BuildJoinEntry();
-  prologue += Goto(normal_code);
+  Fragment jump_to_normal_code = Goto(normal_code);
 
   if (is_empty_prologue) {
     *prologue_info = PrologueInfo(-1, -1);
     return entry;
   } else {
+    prologue += jump_to_normal_code;
     *prologue_info =
         PrologueInfo(previous_block_id, normal_code->block_id() - 1);
     return normal_code;
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index ea837d5..268e3d9 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -5,7 +5,6 @@
 #include "vm/compiler/frontend/scope_builder.h"
 
 #include "vm/compiler/backend/il.h"  // For CompileType.
-#include "vm/kernel.h"               // For IsFieldInitializer.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -313,12 +312,17 @@
       // In addition to static field initializers, scopes/local variables
       // are needed for implicit getters of static const fields, in order to
       // be able to evaluate their initializers in constant evaluator.
-      if (IsFieldInitializer(function, Z) ||
-          Field::Handle(Z, function.accessor_field()).is_const()) {
+      if (Field::Handle(Z, function.accessor_field()).is_const()) {
         VisitNode();
       }
       break;
     }
+    case RawFunction::kStaticFieldInitializer: {
+      ASSERT(helper_.PeekTag() == kField);
+      ASSERT(function.IsStaticFunction());
+      VisitNode();
+      break;
+    }
     case RawFunction::kDynamicInvocationForwarder: {
       if (helper_.PeekTag() == kField) {
 #ifdef DEBUG
@@ -883,7 +887,12 @@
       return;
     case kNullLiteral:
       return;
-    case kConstantExpression: {
+    case kConstantExpression:
+      helper_.ReadPosition();
+      helper_.SkipDartType();
+      helper_.SkipConstantReference();
+      return;
+    case kDeprecated_ConstantExpression: {
       helper_.SkipConstantReference();
       return;
     }
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index ae05577..8f927b8 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -214,6 +214,10 @@
   Thread::Current()->long_jump_base()->Jump(1, Object::branch_offset_error());
 }
 
+word RuntimeEntry::OffsetFromThread() const {
+  return dart::Thread::OffsetFromThread(runtime_entry_);
+}
+
 namespace target {
 
 const word kPageSize = dart::kPageSize;
@@ -495,6 +499,7 @@
   V(Thread, top_offset)                                                        \
   V(Thread, top_resource_offset)                                               \
   V(Thread, vm_tag_offset)                                                     \
+  V(Thread, safepoint_state_offset)                                            \
   V(TimelineStream, enabled_offset)                                            \
   V(TwoByteString, data_offset)                                                \
   V(Type, arguments_offset)                                                    \
@@ -513,6 +518,14 @@
 CLASS_NAME_LIST(DEFINE_FORWARDER)
 #undef DEFINE_FORWARDER
 
+uword Thread::safepoint_state_unacquired() {
+  return dart::Thread::safepoint_state_unacquired();
+}
+
+uword Thread::safepoint_state_acquired() {
+  return dart::Thread::safepoint_state_acquired();
+}
+
 const word HeapPage::kBytesPerCardLog2 = dart::HeapPage::kBytesPerCardLog2;
 
 const word String::kHashBits = dart::String::kHashBits;
@@ -641,6 +654,30 @@
   return dart::Thread::deoptimize_stub_offset();
 }
 
+word Thread::enter_safepoint_stub_offset() {
+  return dart::Thread::enter_safepoint_stub_offset();
+}
+
+word Thread::exit_safepoint_stub_offset() {
+  return dart::Thread::exit_safepoint_stub_offset();
+}
+
+word Thread::execution_state_offset() {
+  return dart::Thread::execution_state_offset();
+}
+
+uword Thread::native_execution_state() {
+  return dart::Thread::ExecutionState::kThreadInNative;
+}
+
+uword Thread::generated_execution_state() {
+  return dart::Thread::ExecutionState::kThreadInGenerated;
+}
+
+uword Thread::vm_tag_compiled_id() {
+  return dart::VMTag::kDartCompiledTagId;
+}
+
 #endif  // !defined(TARGET_ARCH_DBC)
 
 #define DECLARE_CONSTANT_OFFSET_GETTER(name)                                   \
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 825bbb1..d910575 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -218,6 +218,8 @@
     call_(runtime_entry_, assembler, argument_count);
   }
 
+  word OffsetFromThread() const;
+
  protected:
   RuntimeEntry(const dart::RuntimeEntry* runtime_entry,
                RuntimeEntryCallInternal call)
@@ -571,6 +573,15 @@
   static word array_write_barrier_entry_point_offset();
   static word write_barrier_entry_point_offset();
   static word vm_tag_offset();
+  static uword vm_tag_compiled_id();
+
+  static word safepoint_state_offset();
+  static uword safepoint_state_unacquired();
+  static uword safepoint_state_acquired();
+
+  static word execution_state_offset();
+  static uword native_execution_state();
+  static uword generated_execution_state();
 
 #if !defined(TARGET_ARCH_DBC)
   static word write_barrier_code_offset();
@@ -593,6 +604,8 @@
   static word lazy_deopt_from_return_stub_offset();
   static word lazy_deopt_from_throw_stub_offset();
   static word deoptimize_stub_offset();
+  static word enter_safepoint_stub_offset();
+  static word exit_safepoint_stub_offset();
 #endif  // !defined(TARGET_ARCH_DBC)
 
   static word no_scope_native_wrapper_entry_point_offset();
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index ce9321b..7024fd8 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -4,6 +4,9 @@
 
 #include "vm/globals.h"
 
+// For `AllocateObjectInstr::WillAllocateNewOrRemembered`
+#include "vm/compiler/backend/il.h"
+
 #define SHOULD_NOT_INCLUDE_RUNTIME
 
 #include "vm/compiler/stub_code_compiler.h"
@@ -32,6 +35,34 @@
 
 namespace compiler {
 
+// Ensures that [R0] is a new object, if not it will be added to the remembered
+// set via a leaf runtime call.
+//
+// WARNING: This might clobber all registers except for [R0], [THR] and [FP].
+// The caller should simply call LeaveStubFrame() and return.
+static void EnsureIsNewOrRemembered(Assembler* assembler,
+                                    bool preserve_registers = true) {
+  // If the object is not remembered we call a leaf-runtime to add it to the
+  // remembered set.
+  Label done;
+  __ tst(R0, Operand(1 << target::ObjectAlignment::kNewObjectBitPosition));
+  __ BranchIf(NOT_ZERO, &done);
+
+  if (preserve_registers) {
+    __ EnterCallRuntimeFrame(0);
+  } else {
+    __ ReserveAlignedFrameSpace(0);
+  }
+  // [R0] already contains first argument.
+  __ mov(R1, Operand(THR));
+  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  if (preserve_registers) {
+    __ LeaveCallRuntimeFrame();
+  }
+
+  __ Bind(&done);
+}
+
 // Input parameters:
 //   LR : return address.
 //   SP : address of last argument in argument array.
@@ -239,6 +270,26 @@
   __ Ret();
 }
 
+void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
+  RegisterSet all_registers;
+  all_registers.AddAllGeneralRegisters();
+  __ PushRegisters(all_registers);
+  __ ldr(R0, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
+  __ blx(R0);
+  __ PopRegisters(all_registers);
+  __ Ret();
+}
+
+void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
+  RegisterSet all_registers;
+  all_registers.AddAllGeneralRegisters();
+  __ PushRegisters(all_registers);
+  __ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
+  __ blx(R0);
+  __ PopRegisters(all_registers);
+  __ Ret();
+}
+
 void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
     Assembler* assembler) {
   GenerateSharedStub(
@@ -955,6 +1006,12 @@
   // Pop arguments; result is popped in IP.
   __ PopList((1 << R1) | (1 << R2) | (1 << IP));  // R2 is restored.
   __ mov(R0, Operand(IP));
+
+  // Write-barrier elimination might be enabled for this array (depending on the
+  // array length). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler);
+
   __ LeaveStubFrame();
   __ Ret();
 }
@@ -1349,6 +1406,12 @@
   __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ Drop(1);  // Pop number of context variables argument.
   __ Pop(R0);  // Pop the new context object.
+
+  // Write-barrier elimination might be enabled for this context (depending on
+  // the size). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+
   // R0: new object
   // Restore the frame pointer.
   __ LeaveStubFrame();
@@ -1677,6 +1740,14 @@
       kInstanceReg,
       Address(SP,
               2 * target::kWordSize));  // Pop result (newly allocated object).
+
+  ASSERT(kInstanceReg == R0);
+  if (AllocateObjectInstr::WillAllocateNewOrRemembered(cls)) {
+    // Write-barrier elimination is enabled for [cls] and we therefore need to
+    // ensure that the object is in new-space or has remembered bit set.
+    EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+  }
+
   __ LeaveDartFrameAndReturn();         // Restores correct SP.
 }
 
@@ -2252,6 +2323,9 @@
 
 // R9: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   __ LoadImmediate(R0, 0);
   // Preserve arguments descriptor and make room for result.
@@ -2261,9 +2335,13 @@
   __ LeaveStubFrame();
   __ mov(CODE_REG, Operand(R0));
   __ Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
+#endif  // defined(PRODUCT)
 }
 
 void StubCodeCompiler::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   __ LoadImmediate(R0, 0);
   // Make room for result.
@@ -2272,12 +2350,13 @@
   __ PopList((1 << CODE_REG));
   __ LeaveStubFrame();
   __ Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
+#endif  // defined(PRODUCT)
 }
 
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCodeCompiler::GenerateDebugStepCheckStub(Assembler* assembler) {
 #if defined(PRODUCT)
-  __ Ret();
+  __ Stop("No debugging in PRODUCT mode");
 #else
   // Check single stepping.
   Label stepping, done_stepping;
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 6b0d490..2205c2b 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -4,6 +4,9 @@
 
 #include "vm/globals.h"
 
+// For `AllocateObjectInstr::WillAllocateNewOrRemembered`
+#include "vm/compiler/backend/il.h"
+
 #define SHOULD_NOT_INCLUDE_RUNTIME
 
 #include "vm/compiler/stub_code_compiler.h"
@@ -32,6 +35,33 @@
 
 namespace compiler {
 
+// Ensures that [R0] is a new object, if not it will be added to the remembered
+// set via a leaf runtime call.
+//
+// WARNING: This might clobber all registers except for [R0], [THR] and [FP].
+// The caller should simply call LeaveStubFrame() and return.
+static void EnsureIsNewOrRemembered(Assembler* assembler,
+                                    bool preserve_registers = true) {
+  // If the object is not remembered we call a leaf-runtime to add it to the
+  // remembered set.
+  Label done;
+  __ tbnz(&done, R0, target::ObjectAlignment::kNewObjectBitPosition);
+
+  if (preserve_registers) {
+    __ EnterCallRuntimeFrame(0);
+  } else {
+    __ ReserveAlignedFrameSpace(0);
+  }
+  // [R0] already contains first argument.
+  __ mov(R1, THR);
+  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  if (preserve_registers) {
+    __ LeaveCallRuntimeFrame();
+  }
+
+  __ Bind(&done);
+}
+
 // Input parameters:
 //   LR : return address.
 //   SP : address of last argument in argument array.
@@ -175,6 +205,36 @@
   __ ret(LR);
 }
 
+void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
+  RegisterSet all_registers;
+  all_registers.AddAllGeneralRegisters();
+  __ PushRegisters(all_registers);
+  __ mov(CallingConventions::kFirstCalleeSavedCpuReg, SP);
+  __ ReserveAlignedFrameSpace(0);
+  __ mov(CSP, SP);
+  __ ldr(R0, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
+  __ blr(R0);
+  __ mov(SP, CallingConventions::kFirstCalleeSavedCpuReg);
+  __ PopRegisters(all_registers);
+  __ mov(CSP, SP);
+  __ Ret();
+}
+
+void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
+  RegisterSet all_registers;
+  all_registers.AddAllGeneralRegisters();
+  __ PushRegisters(all_registers);
+  __ mov(CallingConventions::kFirstCalleeSavedCpuReg, SP);
+  __ ReserveAlignedFrameSpace(0);
+  __ mov(CSP, SP);
+  __ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
+  __ blr(R0);
+  __ mov(SP, CallingConventions::kFirstCalleeSavedCpuReg);
+  __ PopRegisters(all_registers);
+  __ mov(CSP, SP);
+  __ Ret();
+}
+
 // R1: The extracted method.
 // R4: The type_arguments_field_offset (or 0)
 void StubCodeCompiler::GenerateBuildMethodExtractorStub(
@@ -1021,6 +1081,12 @@
   __ Pop(R1);
   __ Pop(R2);
   __ Pop(R0);
+
+  // Write-barrier elimination might be enabled for this array (depending on the
+  // array length). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler);
+
   __ LeaveStubFrame();
   __ ret();
 }
@@ -1432,6 +1498,12 @@
   __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ Drop(1);  // Pop number of context variables argument.
   __ Pop(R0);  // Pop the new context object.
+
+  // Write-barrier elimination might be enabled for this context (depending on
+  // the size). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+
   // R0: new object
   // Restore the frame pointer.
   __ LeaveStubFrame();
@@ -1727,6 +1799,13 @@
       kInstanceReg,
       Address(SP,
               2 * target::kWordSize));  // Pop result (newly allocated object).
+
+  ASSERT(kInstanceReg == R0);
+  if (AllocateObjectInstr::WillAllocateNewOrRemembered(cls)) {
+    // Write-barrier elimination is enabled for [cls] and we therefore need to
+    // ensure that the object is in new-space or has remembered bit set.
+    EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+  }
   __ LeaveStubFrame();                  // Restores correct SP.
   __ ret();
 }
@@ -2334,6 +2413,9 @@
 
 // R5: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   __ Push(R5);
   __ Push(ZR);  // Space for result.
@@ -2343,9 +2425,13 @@
   __ LeaveStubFrame();
   __ LoadFieldFromOffset(R0, CODE_REG, target::Code::entry_point_offset());
   __ br(R0);
+#endif  // defined(PRODUCT)
 }
 
 void StubCodeCompiler::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   __ Push(ZR);  // Space for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
@@ -2353,12 +2439,13 @@
   __ LeaveStubFrame();
   __ LoadFieldFromOffset(R0, CODE_REG, target::Code::entry_point_offset());
   __ br(R0);
+#endif  // defined(PRODUCT)
 }
 
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCodeCompiler::GenerateDebugStepCheckStub(Assembler* assembler) {
 #if defined(PRODUCT)
-  __ ret();
+  __ Stop("No debugging in PRODUCT mode");
 #else
   // Check single stepping.
   Label stepping, done_stepping;
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 86f75d6..12259cc 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -4,6 +4,9 @@
 
 #include "vm/globals.h"
 
+// For `AllocateObjectInstr::WillAllocateNewOrRemembered`
+#include "vm/compiler/backend/il.h"
+
 #define SHOULD_NOT_INCLUDE_RUNTIME
 
 #include "vm/compiler/stub_code_compiler.h"
@@ -31,6 +34,34 @@
 
 namespace compiler {
 
+// Ensures that [EAX] is a new object, if not it will be added to the remembered
+// set via a leaf runtime call.
+//
+// WARNING: This might clobber all registers except for [EAX], [THR] and [FP].
+// The caller should simply call LeaveFrame() and return.
+static void EnsureIsNewOrRemembered(Assembler* assembler,
+                                    bool preserve_registers = true) {
+  // If the object is not remembered we call a leaf-runtime to add it to the
+  // remembered set.
+  Label done;
+  __ testl(EAX, Immediate(1 << target::ObjectAlignment::kNewObjectBitPosition));
+  __ BranchIf(NOT_ZERO, &done);
+
+  if (preserve_registers) {
+    __ EnterCallRuntimeFrame(2 * target::kWordSize);
+  } else {
+    __ ReserveAlignedFrameSpace(2 * target::kWordSize);
+  }
+  __ movl(Address(ESP, 1 * target::kWordSize), THR);
+  __ movl(Address(ESP, 0 * target::kWordSize), EAX);
+  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  if (preserve_registers) {
+    __ LeaveCallRuntimeFrame();
+  }
+
+  __ Bind(&done);
+}
+
 // Input parameters:
 //   ESP : points to return address.
 //   ESP + 4 : address of last argument in argument array.
@@ -107,6 +138,22 @@
   __ ret();
 }
 
+void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
+  __ pushal();
+  __ movl(EAX, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
+  __ call(EAX);
+  __ popal();
+  __ ret();
+}
+
+void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
+  __ pushal();
+  __ movl(EAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
+  __ call(EAX);
+  __ popal();
+  __ ret();
+}
+
 void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
     Assembler* assembler) {
   __ Breakpoint();
@@ -757,6 +804,12 @@
   __ popl(EAX);  // Pop element type argument.
   __ popl(EDX);  // Pop array length argument (preserved).
   __ popl(EAX);  // Pop return value from return slot.
+
+  // Write-barrier elimination might be enabled for this array (depending on the
+  // array length). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler);
+
   __ LeaveFrame();
   __ ret();
 }
@@ -1115,6 +1168,12 @@
   __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ popl(EAX);  // Pop number of context variables argument.
   __ popl(EAX);  // Pop the new context object.
+
+  // Write-barrier elimination might be enabled for this context (depending on
+  // the size). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+
   // EAX: new object
   // Restore the frame pointer.
   __ LeaveFrame();
@@ -1381,6 +1440,13 @@
   __ popl(EAX);  // Pop argument (type arguments of object).
   __ popl(EAX);  // Pop argument (class of object).
   __ popl(EAX);  // Pop result (newly allocated object).
+
+  if (AllocateObjectInstr::WillAllocateNewOrRemembered(cls)) {
+    // Write-barrier elimination is enabled for [cls] and we therefore need to
+    // ensure that the object is in new-space or has remembered bit set.
+    EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+  }
+
   // EAX: new object
   // Restore the frame pointer.
   __ LeaveFrame();
@@ -1970,6 +2036,9 @@
 
 // ECX: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   // Save IC data.
   __ pushl(ECX);
@@ -1983,9 +2052,13 @@
   // Jump to original stub.
   __ movl(EAX, FieldAddress(EAX, target::Code::entry_point_offset()));
   __ jmp(EAX);
+#endif  // defined(PRODUCT)
 }
 
 void StubCodeCompiler::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   // Room for result. Debugger stub returns address of the
   // unpatched runtime stub.
@@ -1996,12 +2069,13 @@
   // Jump to original stub.
   __ movl(EAX, FieldAddress(EAX, target::Code::entry_point_offset()));
   __ jmp(EAX);
+#endif  // defined(PRODUCT)
 }
 
 // Called only from unoptimized code.
 void StubCodeCompiler::GenerateDebugStepCheckStub(Assembler* assembler) {
 #if defined(PRODUCT)
-  __ ret();
+  __ Stop("No debugging in PRODUCT mode");
 #else
   // Check single stepping.
   Label stepping, done_stepping;
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 2c5dd0a..0df3f7a 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -2,10 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "vm/compiler/runtime_api.h"
 #include "vm/globals.h"
 
+// For `AllocateObjectInstr::WillAllocateNewOrRemembered`
+#include "vm/compiler/backend/il.h"
+
 #define SHOULD_NOT_INCLUDE_RUNTIME
 
+#include "vm/compiler/backend/locations.h"
 #include "vm/compiler/stub_code_compiler.h"
 
 #if defined(TARGET_ARCH_X64) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -31,6 +36,34 @@
 
 namespace compiler {
 
+// Ensures that [RAX] is a new object, if not it will be added to the remembered
+// set via a leaf runtime call.
+//
+// WARNING: This might clobber all registers except for [RAX], [THR] and [FP].
+// The caller should simply call LeaveStubFrame() and return.
+static void EnsureIsNewOrRemembered(Assembler* assembler,
+                                    bool preserve_registers = true) {
+  // If the object is not remembered we call a leaf-runtime to add it to the
+  // remembered set.
+  Label done;
+  __ testq(RAX, Immediate(1 << target::ObjectAlignment::kNewObjectBitPosition));
+  __ BranchIf(NOT_ZERO, &done);
+
+  if (preserve_registers) {
+    __ EnterCallRuntimeFrame(0);
+  } else {
+    __ ReserveAlignedFrameSpace(0);
+  }
+  __ movq(CallingConventions::kArg1Reg, RAX);
+  __ movq(CallingConventions::kArg2Reg, THR);
+  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  if (preserve_registers) {
+    __ LeaveCallRuntimeFrame();
+  }
+
+  __ Bind(&done);
+}
+
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of last argument in argument array.
@@ -166,6 +199,28 @@
   __ ret();
 }
 
+void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
+  RegisterSet all_registers;
+  all_registers.AddAllGeneralRegisters();
+  __ PushRegisters(all_registers.cpu_registers(),
+                   all_registers.fpu_registers());
+  __ movq(RAX, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
+  __ CallCFunction(RAX);
+  __ PopRegisters(all_registers.cpu_registers(), all_registers.fpu_registers());
+  __ ret();
+}
+
+void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
+  RegisterSet all_registers;
+  all_registers.AddAllGeneralRegisters();
+  __ PushRegisters(all_registers.cpu_registers(),
+                   all_registers.fpu_registers());
+  __ movq(RAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
+  __ CallCFunction(RAX);
+  __ PopRegisters(all_registers.cpu_registers(), all_registers.fpu_registers());
+  __ ret();
+}
+
 // RBX: The extracted method.
 // RDX: The type_arguments_field_offset (or 0)
 void StubCodeCompiler::GenerateBuildMethodExtractorStub(
@@ -967,6 +1022,12 @@
   __ popq(RAX);  // Pop element type argument.
   __ popq(R10);  // Pop array length argument.
   __ popq(RAX);  // Pop return value from return slot.
+
+  // Write-barrier elimination might be enabled for this array (depending on the
+  // array length). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler);
+
   __ LeaveStubFrame();
   __ ret();
 }
@@ -1391,6 +1452,12 @@
   __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ popq(RAX);  // Pop number of context variables argument.
   __ popq(RAX);  // Pop the new context object.
+
+  // Write-barrier elimination might be enabled for this context (depending on
+  // the size). To be sure we will check if the allocated object is in old
+  // space and if so call a leaf runtime to add it to the remembered set.
+  EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+
   // RAX: new object
   // Restore the frame pointer.
   __ LeaveStubFrame();
@@ -1694,6 +1761,7 @@
   // RDX: new object type arguments.
   // Create a stub frame.
   __ EnterStubFrame();  // Uses PP to access class object.
+
   __ pushq(R9);         // Setup space on stack for return value.
   __ PushObject(
       CastHandle<Object>(cls));  // Push class of object to be allocated.
@@ -1706,6 +1774,13 @@
   __ popq(RAX);  // Pop argument (type arguments of object).
   __ popq(RAX);  // Pop argument (class of object).
   __ popq(RAX);  // Pop result (newly allocated object).
+
+  if (AllocateObjectInstr::WillAllocateNewOrRemembered(cls)) {
+    // Write-barrier elimination is enabled for [cls] and we therefore need to
+    // ensure that the object is in new-space or has remembered bit set.
+    EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
+  }
+
   // RAX: new object
   // Restore the frame pointer.
   __ LeaveStubFrame();
@@ -2354,6 +2429,9 @@
 // RBX: Contains an ICData.
 // TOS(0): return address (Dart code).
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   __ pushq(RBX);           // Preserve IC data.
   __ pushq(Immediate(0));  // Result slot.
@@ -2364,10 +2442,14 @@
 
   __ movq(RAX, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
   __ jmp(RAX);  // Jump to original stub.
+#endif  // defined(PRODUCT)
 }
 
 //  TOS(0): return address (Dart code).
 void StubCodeCompiler::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+#if defined(PRODUCT)
+  __ Stop("No debugging in PRODUCT mode");
+#else
   __ EnterStubFrame();
   __ pushq(Immediate(0));  // Result slot.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
@@ -2376,12 +2458,13 @@
 
   __ movq(RAX, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
   __ jmp(RAX);  // Jump to original stub.
+#endif  // defined(PRODUCT)
 }
 
 // Called only from unoptimized code.
 void StubCodeCompiler::GenerateDebugStepCheckStub(Assembler* assembler) {
 #if defined(PRODUCT)
-  __ Ret();
+  __ Stop("No debugging in PRODUCT mode");
 #else
   // Check single stepping.
   Label stepping, done_stepping;
diff --git a/runtime/vm/constants.h b/runtime/vm/constants.h
index 90137d3..7fe6c15 100644
--- a/runtime/vm/constants.h
+++ b/runtime/vm/constants.h
@@ -63,6 +63,28 @@
 
 }  // namespace host
 
+class RegisterNames {
+ public:
+  static const char* RegisterName(Register reg) {
+    ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
+    return cpu_reg_names[reg];
+  }
+  static const char* FpuRegisterName(FpuRegister reg) {
+    ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
+    return fpu_reg_names[reg];
+  }
+#if !defined(HOST_ARCH_EQUALS_TARGET_ARCH)
+  static const char* RegisterName(host::Register reg) {
+    ASSERT((0 <= reg) && (reg < host::kNumberOfCpuRegisters));
+    return host::cpu_reg_names[reg];
+  }
+  static const char* FpuRegisterName(host::FpuRegister reg) {
+    ASSERT((0 <= reg) && (reg < host::kNumberOfFpuRegisters));
+    return host::fpu_reg_names[reg];
+  }
+#endif  // !defined(HOST_ARCH_EQUALS_TARGET_ARCH)
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_CONSTANTS_H_
diff --git a/runtime/vm/constants_arm.cc b/runtime/vm/constants_arm.cc
new file mode 100644
index 0000000..0934c48
--- /dev/null
+++ b/runtime/vm/constants_arm.cc
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, 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.
+
+#define RUNTIME_VM_CONSTANTS_H_  // To work around include guard.
+#include "vm/constants_arm.h"
+
+namespace arch_arm {
+
+const Register CallingConventions::ArgumentRegisters[] = {R0, R1, R2, R3};
+
+// Although 'kFpuArgumentRegisters' is 0, we have to give this array at least
+// one element to appease MSVC.
+const FpuRegister CallingConventions::FpuArgumentRegisters[] = {Q0};
+
+}  // namespace arch_arm
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index fe2ffcc..afbcb92 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -265,6 +265,18 @@
 const int kNumberOfFpuRegisters = kNumberOfQRegisters;
 const FpuRegister kNoFpuRegister = kNoQRegister;
 
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+    "r0", "r1",  "r2", "r3", "r4", "r5", "r6", "r7",
+    "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc",
+};
+
+static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
+    "q0", "q1", "q2",  "q3",  "q4",  "q5",  "q6",  "q7",
+#if defined(VFPv3_D32)
+    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
+#endif
+};
+
 // Register aliases.
 const Register TMP = IP;            // Used as scratch register by assembler.
 const Register TMP2 = kNoRegister;  // There is no second assembler temporary.
@@ -332,6 +344,46 @@
 const QRegister kDartLastVolatileFpuReg = Q3;
 const int kDartVolatileFpuRegCount = 4;
 
+#define R(REG) (1 << REG)
+
+class CallingConventions {
+ public:
+  static const intptr_t kArgumentRegisters = kAbiArgumentCpuRegs;
+  static const Register ArgumentRegisters[];
+  static const intptr_t kNumArgRegs = 4;
+
+  static const FpuRegister FpuArgumentRegisters[];
+  static const intptr_t kFpuArgumentRegisters = 0;
+  static const intptr_t kNumFpuArgRegs = 0;
+
+  static constexpr bool kArgumentIntRegXorFpuReg = false;
+
+  // Whether floating-point values should be passed as integers ("softfp" vs
+  // "hardfp"). Android and iOS always use the "softfp" calling convention, even
+  // when hardfp support is present.
+#if defined(TARGET_OS_MACOS_IOS) || defined(TARGET_OS_ANDROID)
+  static constexpr bool kAbiSoftFP = true;
+#else
+  static constexpr bool kAbiSoftFP = false;
+#endif
+
+  // Whether 64-bit arguments must be aligned to an even register or 8-byte
+  // stack address. True for ARM 32-bit, see "Procedure Call Standard for the
+  // ARM Architecture".
+  static constexpr bool kAlignArguments = true;
+
+  static constexpr Register kReturnReg = R0;
+  static constexpr Register kSecondReturnReg = R1;
+  static constexpr FpuRegister kReturnFpuReg = kNoFpuRegister;
+
+  // We choose these to avoid overlap between themselves and reserved registers.
+  static constexpr Register kFirstNonArgumentRegister = R8;
+  static constexpr Register kSecondNonArgumentRegister = R9;
+  static constexpr Register kFirstCalleeSavedCpuReg = NOTFP;
+};
+
+#undef R
+
 // Values for the condition field as defined in section A3.2.
 enum Condition {
   kNoCondition = -1,
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 8dfabc8..9f3355a 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -108,6 +108,18 @@
 const int kNumberOfFpuRegisters = kNumberOfVRegisters;
 const FpuRegister kNoFpuRegister = kNoVRegister;
 
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
+    "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
+    "r22", "r23", "r24", "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "r31",
+};
+
+static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
+    "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",  "v8",  "v9",  "v10",
+    "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
+    "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
+};
+
 // Register aliases.
 const Register TMP = R16;  // Used as scratch register by assembler.
 const Register TMP2 = R17;
@@ -195,6 +207,14 @@
 
   static const bool kArgumentIntRegXorFpuReg = false;
 
+  // Whether floating-point values should be passed as integers ("softfp" vs
+  // "hardfp").
+  static constexpr bool kAbiSoftFP = false;
+
+  // Whether 64-bit arguments must be aligned to an even register or 8-byte
+  // stack address. Not relevant on X64 since the word size is 64-bits already.
+  static constexpr bool kAlignArguments = false;
+
   static constexpr Register kReturnReg = R0;
   static constexpr Register kSecondReturnReg = kNoRegister;
   static constexpr FpuRegister kReturnFpuReg = V0;
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index d0b7703..2eb202d 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -337,6 +337,7 @@
 //        Jump T         ;; jump if not equal
 //
 //  - If<Cond>Null rA
+//    If<Cond>NullTOS
 //
 //    Cond is Eq or Ne. Skips the next instruction unless the given condition
 //    holds.
@@ -723,6 +724,10 @@
 //    InstanceCall ... <- lazy deopt inside first call
 //    InstanceCall ... <- patches second call with Deopt
 //
+//  - NullError
+//
+//    Throws a NullError.
+//
 // BYTECODE LIST FORMAT
 //
 // Bytecode list below is specified using the following format:
@@ -862,6 +867,8 @@
   V(IfEqStrictNum,                       A_D, reg, reg, ___) \
   V(IfEqNull,                              A, reg, ___, ___) \
   V(IfNeNull,                              A, reg, ___, ___) \
+  V(IfEqNullTOS,                           0, ___, ___, ___) \
+  V(IfNeNullTOS,                           0, ___, ___, ___) \
   V(CreateArrayTOS,                        0, ___, ___, ___) \
   V(CreateArrayOpt,                    A_B_C, reg, reg, reg) \
   V(Allocate,                              D, lit, ___, ___) \
@@ -949,7 +956,8 @@
   V(DebugStep,                             0, ___, ___, ___) \
   V(DebugBreak,                            A, num, ___, ___) \
   V(Deopt,                               A_D, num, num, ___) \
-  V(DeoptRewind,                           0, ___, ___, ___)
+  V(DeoptRewind,                           0, ___, ___, ___) \
+  V(NullError,                             0, ___, ___, ___)
 
 // clang-format on
 
@@ -1103,6 +1111,21 @@
 const FpuRegister FpuTMP = kFakeFpuRegister;
 const intptr_t kNumberOfFpuRegisters = 1;
 
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+    "R0",  "R1",  "R2",  "R3",  "R4",  "R5",  "R6",  "R7",  "R8",  "R9",  "R10",
+    "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21",
+    "R22", "R23", "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31",
+#if defined(ARCH_IS_64_BIT)
+    "R32", "R33", "R34", "R35", "R36", "R37", "R38", "R39", "R40", "R41", "R42",
+    "R43", "R44", "R45", "R46", "R47", "R48", "R49", "R50", "R51", "R52", "R53",
+    "R54", "R55", "R56", "R57", "R58", "R59", "R60", "R61", "R62", "R63",
+#endif
+};
+
+static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
+    "F0",
+};
+
 // After a comparison, the condition NEXT_IS_TRUE means the following
 // instruction is executed if the comparison is true and skipped over overwise.
 // Condition NEXT_IS_FALSE means the following instruction is executed if the
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 16eeb4e..ce697b9 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -57,6 +57,12 @@
 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
 const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+    "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
+
+static const char* fpu_reg_names[kNumberOfXmmRegisters] = {
+    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7"};
+
 // Register aliases.
 const Register TMP = kNoRegister;   // No scratch register used by assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
@@ -135,6 +141,10 @@
 
   static const bool kArgumentIntRegXorFpuReg = false;
 
+  // Whether floating-point values should be passed as integers ("softfp" vs
+  // "hardfp").
+  static constexpr bool kAbiSoftFP = false;
+
   static constexpr Register kReturnReg = EAX;
   static constexpr Register kSecondReturnReg = EDX;
 
@@ -144,6 +154,11 @@
   static constexpr Register kFirstCalleeSavedCpuReg = EBX;
   static constexpr Register kFirstNonArgumentRegister = EAX;
   static constexpr Register kSecondNonArgumentRegister = ECX;
+
+  // Whether 64-bit arguments must be aligned to an even register or 8-byte
+  // stack address. On IA32, 64-bit integers and floating-point values do *not*
+  // need to be 8-byte aligned.
+  static constexpr bool kAlignArguments = false;
 };
 
 }  // namespace arch_ia32
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index d3b0f35..dc8e954 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -285,6 +285,11 @@
 //    interface method declaration.
 //    The ICData indicates whether the first argument is a type argument vector.
 //
+//  - UncheckedInterfaceCall ArgC, D
+//
+//    Same as InterfaceCall, but can omit type checks of generic-covariant
+//    parameters.
+//
 //  - DynamicCall ArgC, D
 //
 //    Lookup and invoke method using ICData in PP[D]
@@ -389,6 +394,25 @@
 //    Receiver and argument should have static type int.
 //    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
 //
+//  - NegateDouble
+//
+//    Equivalent to invocation of unary double operator-.
+//    Receiver should have static type double.
+//    Check SP[0] for null; SP[0] = -SP[0].
+//
+//  - AddDouble; SubDouble; MulDouble; DivDouble
+//
+//    Equivalent to invocation of binary int operator +, -, *, /.
+//    Receiver and argument should have static type double.
+//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0].
+//
+//  - CompareDoubleEq; CompareDoubleGt; CompareDoubleLt; CompareDoubleGe;
+//    CompareDoubleLe
+//
+//    Equivalent to invocation of binary double operator ==, >, <, >= or <=.
+//    Receiver and argument should have static type double.
+//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
+//
 //  - AllocateClosure D
 //
 //    Allocate closure object for closure function ConstantPool[D].
@@ -490,12 +514,24 @@
   V(CompareIntLe,                          0, ___, ___, ___)                   \
   V(DirectCall,                          A_D, num, num, ___)                   \
   V(AllocateClosure,                       D, lit, ___, ___)                   \
+  V(UncheckedInterfaceCall,              A_D, num, num, ___)                   \
+  V(NegateDouble,                          0, ___, ___, ___)                   \
+  V(AddDouble,                             0, ___, ___, ___)                   \
+  V(SubDouble,                             0, ___, ___, ___)                   \
+  V(MulDouble,                             0, ___, ___, ___)                   \
+  V(DivDouble,                             0, ___, ___, ___)                   \
+  V(CompareDoubleEq,                       0, ___, ___, ___)                   \
+  V(CompareDoubleGt,                       0, ___, ___, ___)                   \
+  V(CompareDoubleLt,                       0, ___, ___, ___)                   \
+  V(CompareDoubleGe,                       0, ___, ___, ___)                   \
+  V(CompareDoubleLe,                       0, ___, ___, ___)                   \
 
   // These bytecodes are only generated within the VM. Reassinging their
   // opcodes is not a breaking change.
 #define INTERNAL_KERNEL_BYTECODES_LIST(V)                                      \
   V(VMInternal_ImplicitGetter,             0, ___, ___, ___)                   \
   V(VMInternal_ImplicitSetter,             0, ___, ___, ___)                   \
+  V(VMInternal_MethodExtractor,            0, ___, ___, ___)                   \
 
 #define KERNEL_BYTECODES_LIST(V)                                               \
   PUBLIC_KERNEL_BYTECODES_LIST(V)                                              \
@@ -514,7 +550,7 @@
   // Maximum bytecode format version supported by VM.
   // The range of supported versions should include version produced by bytecode
   // generator (currentBytecodeFormatVersion in pkg/vm/lib/bytecode/dbc.dart).
-  static const intptr_t kMaxSupportedBytecodeFormatVersion = 4;
+  static const intptr_t kMaxSupportedBytecodeFormatVersion = 6;
 
   enum Opcode {
 #define DECLARE_BYTECODE(name, encoding, op1, op2, op3) k##name,
@@ -630,6 +666,7 @@
     switch (DecodeOpcode(instr)) {
       case KernelBytecode::kIndirectStaticCall:
       case KernelBytecode::kInterfaceCall:
+      case KernelBytecode::kUncheckedInterfaceCall:
       case KernelBytecode::kDynamicCall:
       case KernelBytecode::kDirectCall:
         return true;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 3d37645..c9eea38 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -94,6 +94,14 @@
 const int kNumberOfFpuRegisters = kNumberOfXmmRegisters;
 const FpuRegister kNoFpuRegister = kNoXmmRegister;
 
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+    "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
+    "r8",  "r9",  "r10", "r11", "r12", "r13", "thr", "pp"};
+
+static const char* fpu_reg_names[kNumberOfXmmRegisters] = {
+    "xmm0", "xmm1", "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",  "xmm7",
+    "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"};
+
 enum RexBits {
   REX_NONE = 0,
   REX_B = 1 << 0,
@@ -194,6 +202,14 @@
   static constexpr Register kReturnReg = RAX;
   static constexpr Register kSecondReturnReg = kNoRegister;
   static constexpr FpuRegister kReturnFpuReg = XMM0;
+
+  // Whether floating-point values should be passed as integers ("softfp" vs
+  // "hardfp").
+  static constexpr bool kAbiSoftFP = false;
+
+  // Whether 64-bit arguments must be aligned to an even register or 8-byte
+  // stack address. Not relevant on X64 since the word size is 64-bits already.
+  static constexpr bool kAlignArguments = false;
 #else
   static const Register kArg1Reg = RDI;
   static const Register kArg2Reg = RSI;
@@ -208,7 +224,7 @@
   static const intptr_t kNumArgRegs = 6;
 
   static const XmmRegister FpuArgumentRegisters[];
-  static const intptr_t kXmmArgumentRegisters = R(XMM0) | R(XMM1) | R(XMM2) |
+  static const intptr_t kFpuArgumentRegisters = R(XMM0) | R(XMM1) | R(XMM2) |
                                                 R(XMM3) | R(XMM4) | R(XMM5) |
                                                 R(XMM6) | R(XMM7);
   static const intptr_t kNumFpuArgRegs = 8;
@@ -238,6 +254,14 @@
   static constexpr Register kReturnReg = RAX;
   static constexpr Register kSecondReturnReg = kNoRegister;
   static constexpr FpuRegister kReturnFpuReg = XMM0;
+
+  // Whether floating-point values should be passed as integers ("softfp" vs
+  // "hardfp").
+  static constexpr bool kAbiSoftFP = false;
+
+  // Whether 64-bit arguments must be aligned to an even register or 8-byte
+  // stack address. Not relevant on X64 since the word size is 64-bits already.
+  static constexpr bool kAlignArguments = false;
 #endif
 
   COMPILE_ASSERT((kArgumentRegisters & kReservedCpuRegisters) == 0);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index b1f2ce4..0f50b62 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -820,8 +820,7 @@
   if (thread->top_exit_frame_info() == 0) {
     // There are no dart frames on the stack so it would be illegal to
     // propagate an error here.
-    FATAL1("No Dart frames on stack, cannot propagate error: %s",
-           Error::Cast(obj).ToErrorCString());
+    FATAL("No Dart frames on stack, cannot propagate error.");
   }
   // Unwind all the API scopes till the exit frame before propagating.
   const Error* error;
@@ -6342,4 +6341,8 @@
 #endif
 }
 
+DART_EXPORT void Dart_PrepareToAbort() {
+  OS::PrepareToAbort();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 202143e..f2cd2e8 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -297,16 +297,15 @@
 
   static bool IsFfiEnabled() {
     // dart:ffi is not implemented for the following configurations
-#if !defined(TARGET_ARCH_X64) && !defined(TARGET_ARCH_ARM64) &&                \
-    !defined(TARGET_ARCH_IA32)
-    // https://github.com/dart-lang/sdk/issues/35760 Arm32 && Android
-    // https://github.com/dart-lang/sdk/issues/35772 Arm64
+#if defined(TARGET_ARCH_DBC)
+    // https://github.com/dart-lang/sdk/issues/35773 DBC
+    return false;
+#elif defined(TARGET_ARCH_ARM) &&                                              \
+    !(defined(TARGET_OS_ANDROID) || defined(TARGET_OS_MACOS_IOS))
+    // TODO(36309): Support hardfp calling convention.
     return false;
 #elif !defined(TARGET_OS_LINUX) && !defined(TARGET_OS_MACOS) &&                \
     !defined(TARGET_OS_ANDROID) && !defined(TARGET_OS_WINDOWS)
-    // https://github.com/dart-lang/sdk/issues/35760 Arm32 && Android
-    // https://github.com/dart-lang/sdk/issues/35772 Arm64
-    // https://github.com/dart-lang/sdk/issues/35773 DBC
     return false;
 #else
     // dart:ffi is also not implemented for precompiled in which case
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 3759e0f..e117e1d 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -446,6 +446,7 @@
     case RawFunction::kImplicitGetter:
     case RawFunction::kImplicitSetter:
     case RawFunction::kImplicitStaticFinalGetter:
+    case RawFunction::kStaticFieldInitializer:
     case RawFunction::kMethodExtractor:
     case RawFunction::kNoSuchMethodDispatcher:
     case RawFunction::kInvokeFieldDispatcher:
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 9270768..3e5d46c 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -19,7 +19,6 @@
 
 namespace dart {
 
-class Location;
 class Value;
 class MaterializeObjectInstr;
 class StackFrame;
@@ -462,10 +461,12 @@
 
   RegisterType reg() const { return static_cast<RegisterType>(raw_index()); }
 
-  static const char* Name(Register reg) { return Assembler::RegisterName(reg); }
+  static const char* Name(Register reg) {
+    return RegisterNames::RegisterName(reg);
+  }
 
   static const char* Name(FpuRegister fpu_reg) {
-    return Assembler::FpuRegisterName(fpu_reg);
+    return RegisterNames::FpuRegisterName(fpu_reg);
   }
 
   const intptr_t source_index_;
@@ -601,7 +602,6 @@
   static const intptr_t kEntrySize = 3;
 };
 
-
 // Holds deopt information at one deoptimization point. The information consists
 // of two parts:
 //  - first a prefix consisting of kMaterializeObject instructions describing
@@ -638,7 +638,6 @@
                                   const Array& deopt_table,
                                   const TypedData& packed);
 
-
  private:
   static void UnpackInto(const Array& table,
                          const TypedData& packed,
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index c36b640..c72f6b0 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -117,6 +117,19 @@
                                : static_cast<intptr_t>(kSmiCid);
   }
 
+  DART_FORCE_INLINE static RawTypeArguments* GetTypeArguments(
+      Thread* thread,
+      RawInstance* instance) {
+    RawClass* instance_class =
+        thread->isolate()->class_table()->At(GetClassId(instance));
+    return instance_class->ptr()->num_type_arguments_ > 0
+               ? reinterpret_cast<RawTypeArguments**>(
+                     instance
+                         ->ptr())[instance_class->ptr()
+                                      ->type_arguments_field_offset_in_words_]
+               : TypeArguments::null();
+  }
+
   // The usage counter is actually a 'hotness' counter.
   // For an instance call, both the usage counters of the caller and of the
   // calle will get incremented, as well as the ICdata counter at the call site.
@@ -641,21 +654,6 @@
       *invoked = true;
       return true;
     }
-    case RawFunction::kMethodExtractor: {
-      ASSERT(InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) == 0);
-      call_top[1] = 0;                       // Result of runtime call.
-      call_top[2] = *call_base;              // Receiver.
-      call_top[3] = function->ptr()->data_;  // Method.
-      Exit(thread, *FP, call_top + 4, *pc);
-      NativeArguments native_args(thread, 2, call_top + 2, call_top + 1);
-      if (!InvokeRuntime(thread, this, DRT_ExtractMethod, native_args)) {
-        return false;
-      }
-      *SP = call_base;
-      **SP = call_top[1];
-      *invoked = true;
-      return true;
-    }
     case RawFunction::kInvokeFieldDispatcher: {
       const intptr_t type_args_len =
           InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
@@ -1119,62 +1117,11 @@
   USE(rD)
 #define DECODE_A_X rD = (static_cast<int32_t>(op) >> KernelBytecode::kDShift);
 
-
-// Exception handling helper. Gets handler FP and PC from the Interpreter where
-// they were stored by Interpreter::Longjmp and proceeds to execute the handler.
-// Corner case: handler PC can be a fake marker that marks entry frame, which
-// means exception was not handled in the Dart code. In this case we return
-// caught exception from Interpreter::Call.
-#if defined(DEBUG)
-
 #define HANDLE_EXCEPTION                                                       \
   do {                                                                         \
-    FP = fp_;                                                                  \
-    pc = pc_;                                                                  \
-    if (IsEntryFrameMarker(pc)) {                                              \
-      pp_ = reinterpret_cast<RawObjectPool*>(fp_[kKBCSavedPpSlotFromEntryFp]); \
-      argdesc_ =                                                               \
-          reinterpret_cast<RawArray*>(fp_[kKBCSavedArgDescSlotFromEntryFp]);   \
-      uword exit_fp =                                                          \
-          reinterpret_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);           \
-      thread->set_top_exit_frame_info(exit_fp);                                \
-      thread->set_top_resource(top_resource);                                  \
-      thread->set_vm_tag(vm_tag);                                              \
-      if (IsTracingExecution()) {                                              \
-        THR_Print("%" Pu64 " ", icount_);                                      \
-        THR_Print("Returning exception from interpreter 0x%" Px                \
-                  " at fp_ 0x%" Px " exit 0x%" Px "\n",                        \
-                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_), \
-                  exit_fp);                                                    \
-      }                                                                        \
-      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));                          \
-      return special_[KernelBytecode::kExceptionSpecialIndex];                 \
-    }                                                                          \
-    goto DispatchAfterException;                                               \
+    goto HandleException;                                                      \
   } while (0)
 
-#else  // !defined(DEBUG)
-
-#define HANDLE_EXCEPTION                                                       \
-  do {                                                                         \
-    FP = fp_;                                                                  \
-    pc = pc_;                                                                  \
-    if (IsEntryFrameMarker(pc)) {                                              \
-      pp_ = reinterpret_cast<RawObjectPool*>(fp_[kKBCSavedPpSlotFromEntryFp]); \
-      argdesc_ =                                                               \
-          reinterpret_cast<RawArray*>(fp_[kKBCSavedArgDescSlotFromEntryFp]);   \
-      uword exit_fp =                                                          \
-          reinterpret_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);           \
-      thread->set_top_exit_frame_info(exit_fp);                                \
-      thread->set_top_resource(top_resource);                                  \
-      thread->set_vm_tag(vm_tag);                                              \
-      return special_[KernelBytecode::kExceptionSpecialIndex];                 \
-    }                                                                          \
-    goto DispatchAfterException;                                               \
-  } while (0)
-
-#endif  // !defined(DEBUG)
-
 #define HANDLE_RETURN                                                          \
   do {                                                                         \
     pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;          \
@@ -1220,6 +1167,22 @@
   }                                                                            \
   ASSERT(Integer::GetInt64Value(RAW_CAST(Integer, SP[0])) == result);
 
+#define UNBOX_DOUBLE(value, obj, selector)                                     \
+  double value;                                                                \
+  {                                                                            \
+    if (UNLIKELY(obj == null_value)) {                                         \
+      SP[0] = selector.raw();                                                  \
+      goto ThrowNullError;                                                     \
+    }                                                                          \
+    value = Double::RawCast(obj)->ptr()->value_;                               \
+  }
+
+#define BOX_DOUBLE_RESULT(result)                                              \
+  if (!AllocateDouble(thread, result, pc, FP, SP)) {                           \
+    HANDLE_EXCEPTION;                                                          \
+  }                                                                            \
+  ASSERT(Utils::DoublesBitEqual(Double::RawCast(SP[0])->ptr()->value_, result));
+
 bool Interpreter::AssertAssignable(Thread* thread,
                                    uint32_t* pc,
                                    RawObject** FP,
@@ -1468,6 +1431,67 @@
   return InvokeRuntime(thread, this, DRT_AllocateArray, args);
 }
 
+// Allocate a _Context with the given length and put it into SP[0].
+// Returns false on exception.
+bool Interpreter::AllocateContext(Thread* thread,
+                                  intptr_t num_context_variables,
+                                  uint32_t* pc,
+                                  RawObject** FP,
+                                  RawObject** SP) {
+  const intptr_t instance_size = Context::InstanceSize(num_context_variables);
+  ASSERT(Utils::IsAligned(instance_size, kObjectAlignment));
+  const uword start = thread->top();
+  if (LIKELY((start + instance_size) < thread->end())) {
+    thread->set_top(start + instance_size);
+    RawContext* result =
+        Context::RawCast(InitializeHeader(start, kContextCid, instance_size));
+    result->ptr()->num_variables_ = num_context_variables;
+    RawObject* null_value = Object::null();
+    result->ptr()->parent_ = static_cast<RawContext*>(null_value);
+    for (intptr_t offset = sizeof(RawContext); offset < instance_size;
+         offset += kWordSize) {
+      *reinterpret_cast<RawObject**>(start + offset) = null_value;
+    }
+    SP[0] = result;
+    return true;
+  } else {
+    SP[0] = 0;  // Space for the result.
+    SP[1] = Smi::New(num_context_variables);
+    Exit(thread, FP, SP + 2, pc);
+    NativeArguments args(thread, 1, SP + 1, SP);
+    return InvokeRuntime(thread, this, DRT_AllocateContext, args);
+  }
+}
+
+// Allocate a _Closure and put it into SP[0].
+// Returns false on exception.
+bool Interpreter::AllocateClosure(Thread* thread,
+                                  uint32_t* pc,
+                                  RawObject** FP,
+                                  RawObject** SP) {
+  const intptr_t instance_size = Closure::InstanceSize();
+  const uword start = thread->top();
+  if (LIKELY((start + instance_size) < thread->end())) {
+    thread->set_top(start + instance_size);
+    RawClosure* result =
+        Closure::RawCast(InitializeHeader(start, kClosureCid, instance_size));
+    RawObject* null_value = Object::null();
+    for (intptr_t offset = sizeof(RawInstance); offset < instance_size;
+         offset += kWordSize) {
+      *reinterpret_cast<RawObject**>(start + offset) = null_value;
+    }
+    SP[0] = result;
+    return true;
+  } else {
+    SP[0] = 0;  // Space for the result.
+    SP[1] = thread->isolate()->object_store()->closure_class();
+    SP[2] = Object::null();  // Type arguments.
+    Exit(thread, FP, SP + 3, pc);
+    NativeArguments args(thread, 2, SP + 1, SP);
+    return InvokeRuntime(thread, this, DRT_AllocateObject, args);
+  }
+}
+
 RawObject* Interpreter::Call(RawFunction* function,
                              RawArray* argdesc,
                              intptr_t argc,
@@ -1540,7 +1564,7 @@
   FP[kKBCFunctionSlotFromFp] = function;
   FP[kKBCPcMarkerSlotFromFp] = bytecode;
   FP[kKBCSavedCallerPcSlotFromFp] =
-      reinterpret_cast<RawObject*>((arg_count << 2) | 2);
+      reinterpret_cast<RawObject*>(kEntryFramePcMarker);
   FP[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(fp_);
 
   // Load argument descriptor.
@@ -2056,6 +2080,38 @@
   }
 
   {
+    BYTECODE(UncheckedInterfaceCall, A_D);
+
+#ifndef PRODUCT
+    // Check if single stepping.
+    if (thread->isolate()->single_step()) {
+      Exit(thread, FP, SP + 1, pc);
+      NativeArguments args(thread, 0, NULL, NULL);
+      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
+    }
+#endif  // !PRODUCT
+
+    {
+      const uint16_t argc = rA;
+      const uint16_t kidx = rD;
+
+      RawObject** call_base = SP - argc + 1;
+      RawObject** call_top = SP + 1;
+
+      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
+      RawString* target_name =
+          static_cast<RawFunction*>(LOAD_CONSTANT(kidx))->ptr()->name_;
+      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      if (!InterfaceCall(thread, target_name, call_base, call_top, &pc, &FP,
+                         &SP)) {
+        HANDLE_EXCEPTION;
+      }
+    }
+
+    DISPATCH();
+  }
+
+  {
     BYTECODE(DynamicCall, A_D);
 
 #ifndef PRODUCT
@@ -2306,8 +2362,6 @@
                   exit_fp);
       }
       ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
-      const intptr_t argc = reinterpret_cast<uword>(pc) >> 2;
-      ASSERT(fp_ == FrameArguments(FP, argc + kKBCEntrySavedSlots));
       // Exception propagation should have been done.
       ASSERT(!result->IsHeapObject() ||
              result->GetClassId() != kUnhandledExceptionCid);
@@ -2498,30 +2552,10 @@
 
   {
     BYTECODE(AllocateContext, A_D);
+    ++SP;
     const uint16_t num_context_variables = rD;
-    {
-      const intptr_t instance_size =
-          Context::InstanceSize(num_context_variables);
-      ASSERT(Utils::IsAligned(instance_size, kObjectAlignment));
-      const uword start = thread->top();
-      if (LIKELY((start + instance_size) < thread->end())) {
-        thread->set_top(start + instance_size);
-        RawContext* result = Context::RawCast(
-            InitializeHeader(start, kContextCid, instance_size));
-        result->ptr()->num_variables_ = num_context_variables;
-        result->ptr()->parent_ = static_cast<RawContext*>(null_value);
-        for (intptr_t offset = sizeof(RawContext); offset < instance_size;
-             offset += kWordSize) {
-          *reinterpret_cast<RawObject**>(start + offset) = null_value;
-        }
-        *++SP = result;
-      } else {
-        *++SP = 0;
-        SP[1] = Smi::New(num_context_variables);
-        Exit(thread, FP, SP + 2, pc);
-        NativeArguments args(thread, 1, SP + 1, SP);
-        INVOKE_RUNTIME(DRT_AllocateContext, args);
-      }
+    if (!AllocateContext(thread, num_context_variables, pc, FP, SP)) {
+      HANDLE_EXCEPTION;
     }
     DISPATCH();
   }
@@ -2971,27 +3005,107 @@
   }
 
   {
-    BYTECODE(AllocateClosure, A_D);
-    const intptr_t instance_size = Closure::InstanceSize();
-    const uword start = thread->top();
-    if (LIKELY((start + instance_size) < thread->end())) {
-      thread->set_top(start + instance_size);
-      RawClosure* result =
-          Closure::RawCast(InitializeHeader(start, kClosureCid, instance_size));
-      for (intptr_t offset = sizeof(RawInstance); offset < instance_size;
-           offset += kWordSize) {
-        *reinterpret_cast<RawObject**>(start + offset) = null_value;
-      }
-      SP[1] = result;
-      ++SP;
+    BYTECODE(NegateDouble, 0);
+    UNBOX_DOUBLE(value, SP[0], Symbols::UnaryMinus());
+    double result = -value;
+    BOX_DOUBLE_RESULT(result);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(AddDouble, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::Plus());
+    UNBOX_DOUBLE(b, SP[1], Symbols::Plus());
+    double result = a + b;
+    BOX_DOUBLE_RESULT(result);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(SubDouble, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::Minus());
+    UNBOX_DOUBLE(b, SP[1], Symbols::Minus());
+    double result = a - b;
+    BOX_DOUBLE_RESULT(result);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(MulDouble, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::Star());
+    UNBOX_DOUBLE(b, SP[1], Symbols::Star());
+    double result = a * b;
+    BOX_DOUBLE_RESULT(result);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(DivDouble, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::Slash());
+    UNBOX_DOUBLE(b, SP[1], Symbols::Slash());
+    double result = a / b;
+    BOX_DOUBLE_RESULT(result);
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareDoubleEq, 0);
+    SP -= 1;
+    if ((SP[0] == null_value) || (SP[1] == null_value)) {
+      SP[0] = (SP[0] == SP[1]) ? true_value : false_value;
     } else {
-      SP[1] = 0;  // Space for the result.
-      SP[2] = thread->isolate()->object_store()->closure_class();
-      SP[3] = null_value;  // Type arguments.
-      Exit(thread, FP, SP + 4, pc);
-      NativeArguments args(thread, 2, SP + 2, SP + 1);
-      INVOKE_RUNTIME(DRT_AllocateObject, args);
-      ++SP;
+      double a = Double::RawCast(SP[0])->ptr()->value_;
+      double b = Double::RawCast(SP[1])->ptr()->value_;
+      SP[0] = (a == b) ? true_value : false_value;
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareDoubleGt, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::RAngleBracket());
+    UNBOX_DOUBLE(b, SP[1], Symbols::RAngleBracket());
+    SP[0] = (a > b) ? true_value : false_value;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareDoubleLt, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::LAngleBracket());
+    UNBOX_DOUBLE(b, SP[1], Symbols::LAngleBracket());
+    SP[0] = (a < b) ? true_value : false_value;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareDoubleGe, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::GreaterEqualOperator());
+    UNBOX_DOUBLE(b, SP[1], Symbols::GreaterEqualOperator());
+    SP[0] = (a >= b) ? true_value : false_value;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(CompareDoubleLe, 0);
+    SP -= 1;
+    UNBOX_DOUBLE(a, SP[0], Symbols::LessEqualOperator());
+    UNBOX_DOUBLE(b, SP[1], Symbols::LessEqualOperator());
+    SP[0] = (a <= b) ? true_value : false_value;
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(AllocateClosure, A_D);
+    ++SP;
+    if (!AllocateClosure(thread, pc, FP, SP)) {
+      HANDLE_EXCEPTION;
     }
     DISPATCH();
   }
@@ -3122,15 +3236,7 @@
       SP[1] = value;
       SP[2] = field_type;
       // Provide type arguments of instance as instantiator.
-      RawClass* instance_class = thread->isolate()->class_table()->At(
-          InterpreterHelpers::GetClassId(instance));
-      SP[3] =
-          instance_class->ptr()->num_type_arguments_ > 0
-              ? reinterpret_cast<RawObject**>(
-                    instance
-                        ->ptr())[instance_class->ptr()
-                                     ->type_arguments_field_offset_in_words_]
-              : null_value;
+      SP[3] = InterpreterHelpers::GetTypeArguments(thread, instance);
       SP[4] = null_value;  // Implicit setters cannot be generic.
       SP[5] = field->ptr()->name_;
       if (!AssertAssignable(thread, pc, FP, /* argv */ SP + 5,
@@ -3195,6 +3301,54 @@
     DISPATCH();
   }
 
+  {
+    BYTECODE(VMInternal_MethodExtractor, 0);
+
+    RawFunction* function = FrameFunction(FP);
+    int32_t counter = ++(function->ptr()->usage_counter_);
+    if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&
+                 counter >= FLAG_compilation_counter_threshold &&
+                 !Function::HasCode(function))) {
+      SP[1] = 0;  // Unused code result.
+      SP[2] = function;
+      Exit(thread, FP, SP + 3, pc);
+      NativeArguments native_args(thread, 1, SP + 2, SP + 1);
+      INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, native_args);
+      function = FrameFunction(FP);
+    }
+
+    ASSERT(InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) == 0);
+
+    ++SP;
+    if (!AllocateClosure(thread, pc, FP, SP)) {
+      HANDLE_EXCEPTION;
+    }
+
+    ++SP;
+    if (!AllocateContext(thread, 1, pc, FP, SP)) {
+      HANDLE_EXCEPTION;
+    }
+
+    RawContext* context = Context::RawCast(*SP--);
+    RawInstance* instance = Instance::RawCast(FrameArguments(FP, 1)[0]);
+    context->StorePointer(
+        reinterpret_cast<RawInstance**>(&context->ptr()->data()[0]), instance);
+
+    RawClosure* closure = Closure::RawCast(*SP);
+    closure->StorePointer(
+        &closure->ptr()->instantiator_type_arguments_,
+        InterpreterHelpers::GetTypeArguments(thread, instance));
+    // function_type_arguments_ is already null
+    closure->ptr()->delayed_type_arguments_ =
+        Object::empty_type_arguments().raw();
+    closure->StorePointer(&closure->ptr()->function_,
+                          Function::RawCast(FrameFunction(FP)->ptr()->data_));
+    closure->StorePointer(&closure->ptr()->context_, context);
+    // hash_ is already null
+
+    DISPATCH();
+  }
+
   // Helper used to handle noSuchMethod on closures.
   {
   ClosureNoSuchMethod:
@@ -3207,11 +3361,11 @@
     pc = SavedCallerPC(FP);
 
     const bool has_dart_caller = !IsEntryFrameMarker(pc);
-    const intptr_t argc = has_dart_caller ? KernelBytecode::DecodeArgc(pc[-1])
-                                          : (reinterpret_cast<uword>(pc) >> 2);
     const intptr_t type_args_len =
         InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
     const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
+    const intptr_t argc =
+        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
 
     SP = FrameArguments(FP, 0);
     RawObject** args = SP - argc;
@@ -3287,9 +3441,36 @@
     UNREACHABLE();
   }
 
-  // Single dispatch point used by exception handling macros.
+  // Exception handling helper. Gets handler FP and PC from the Interpreter
+  // where they were stored by Interpreter::Longjmp and proceeds to execute the
+  // handler. Corner case: handler PC can be a fake marker that marks entry
+  // frame, which means exception was not handled in the interpreter. In this
+  // case we return the caught exception from Interpreter::Call.
   {
-  DispatchAfterException:
+  HandleException:
+    FP = fp_;
+    pc = pc_;
+    if (IsEntryFrameMarker(pc)) {
+      pp_ = reinterpret_cast<RawObjectPool*>(fp_[kKBCSavedPpSlotFromEntryFp]);
+      argdesc_ =
+          reinterpret_cast<RawArray*>(fp_[kKBCSavedArgDescSlotFromEntryFp]);
+      uword exit_fp = reinterpret_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);
+      thread->set_top_exit_frame_info(exit_fp);
+      thread->set_top_resource(top_resource);
+      thread->set_vm_tag(vm_tag);
+#if defined(DEBUG)
+      if (IsTracingExecution()) {
+        THR_Print("%" Pu64 " ", icount_);
+        THR_Print("Returning exception from interpreter 0x%" Px " at fp_ 0x%" Px
+                  " exit 0x%" Px "\n",
+                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
+                  exit_fp);
+      }
+#endif
+      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
+      return special_[KernelBytecode::kExceptionSpecialIndex];
+    }
+
     pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
     DISPATCH();
   }
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 165a6d7..e8fe9db 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -71,6 +71,8 @@
 class Interpreter {
  public:
   static const uword kInterpreterStackUnderflowSize = 0x80;
+  // The entry frame pc marker must be non-zero (a valid exception handler pc).
+  static const word kEntryFramePcMarker = -1;
 
   Interpreter();
   ~Interpreter();
@@ -95,7 +97,7 @@
 
   // Identify an entry frame by looking at its pc marker value.
   static bool IsEntryFrameMarker(uint32_t* pc) {
-    return (reinterpret_cast<uword>(pc) & 2) != 0;
+    return reinterpret_cast<word>(pc) == kEntryFramePcMarker;
   }
 
   RawObject* Call(const Function& function,
@@ -236,6 +238,15 @@
                      uint32_t* pc,
                      RawObject** FP,
                      RawObject** SP);
+  bool AllocateContext(Thread* thread,
+                       intptr_t num_variables,
+                       uint32_t* pc,
+                       RawObject** FP,
+                       RawObject** SP);
+  bool AllocateClosure(Thread* thread,
+                       uint32_t* pc,
+                       RawObject** FP,
+                       RawObject** SP);
 
 #if defined(DEBUG)
   // Returns true if tracing of executed instructions is enabled.
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 13227c5..a4a6eea 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -314,7 +314,9 @@
           temp_array = klass.fields();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_field ^= temp_array.At(i);
-            if (temp_field.kernel_offset() <= 0) {
+            // TODO(alexmarkov): collect token positions from bytecode
+            if (temp_field.is_declared_in_bytecode() ||
+                temp_field.kernel_offset() <= 0) {
               // Skip artificially injected fields.
               continue;
             }
@@ -333,6 +335,10 @@
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_function ^= temp_array.At(i);
             entry_script = temp_function.script();
+            // TODO(alexmarkov): collect token positions from bytecode
+            if (temp_function.is_declared_in_bytecode()) {
+              continue;
+            }
             if (entry_script.raw() != interesting_script.raw()) {
               continue;
             }
@@ -363,6 +369,10 @@
         }
       } else if (entry.IsFunction()) {
         temp_function ^= entry.raw();
+        // TODO(alexmarkov): collect token positions from bytecode
+        if (temp_function.is_declared_in_bytecode()) {
+          continue;
+        }
         entry_script = temp_function.script();
         if (entry_script.raw() != interesting_script.raw()) {
           continue;
@@ -375,7 +385,8 @@
                                    &yield_positions);
       } else if (entry.IsField()) {
         const Field& field = Field::Cast(entry);
-        if (field.kernel_offset() <= 0) {
+        // TODO(alexmarkov): collect token positions from bytecode
+        if (field.is_declared_in_bytecode() || field.kernel_offset() <= 0) {
           // Skip artificially injected fields.
           continue;
         }
@@ -696,11 +707,6 @@
   return false;
 }
 
-bool IsFieldInitializer(const Function& function, Zone* zone) {
-  return (function.kind() == RawFunction::kImplicitStaticFinalGetter) &&
-         Field::IsInitName(String::Handle(zone, function.name()));
-}
-
 static ProcedureAttributesMetadata ProcedureAttributesOf(
     Zone* zone,
     const Script& script,
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 99b3454..0de9d5d 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -212,8 +212,6 @@
 // as such function already checks all of its parameters.
 bool NeedsDynamicInvocationForwarder(const Function& function);
 
-bool IsFieldInitializer(const Function& function, Zone* zone);
-
 ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
                                                   Zone* zone);
 
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 96c4986..760c6ac 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,7 +20,7 @@
 
 // Both version numbers are inclusive.
 static const uint32_t kMinSupportedKernelFormatVersion = 18;
-static const uint32_t kMaxSupportedKernelFormatVersion = 23;
+static const uint32_t kMaxSupportedKernelFormatVersion = 25;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -126,7 +126,8 @@
   V(NullReference, 99)                                                         \
   V(ClassReference, 100)                                                       \
   V(MemberReference, 101)                                                      \
-  V(ConstantExpression, 107)                                                   \
+  V(ConstantExpression, 106)                                                   \
+  V(Deprecated_ConstantExpression, 107)                                        \
   V(SpecializedVariableGet, 128)                                               \
   V(SpecializedVariableSet, 136)                                               \
   V(SpecializedIntLiteral, 144)
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 79fb581..4862219 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -44,8 +44,6 @@
             "URI scheme that replaces filepaths prefixes specified"
             " by kernel_multiroot_filepaths option");
 
-const char* KernelIsolate::kName = DART_KERNEL_ISOLATE_NAME;
-
 // Tags used to indicate different requests to the dart frontend.
 //
 // Current tags include the following:
@@ -61,10 +59,11 @@
 const int KernelIsolate::kListDependenciesTag = 5;
 const int KernelIsolate::kNotifyIsolateShutdown = 6;
 
+const char* KernelIsolate::kName = DART_KERNEL_ISOLATE_NAME;
 Dart_IsolateCreateCallback KernelIsolate::create_callback_ = NULL;
 Monitor* KernelIsolate::monitor_ = new Monitor();
+KernelIsolate::State KernelIsolate::state_ = KernelIsolate::kStopped;
 Isolate* KernelIsolate::isolate_ = NULL;
-bool KernelIsolate::initializing_ = true;
 Dart_Port KernelIsolate::kernel_port_ = ILLEGAL_PORT;
 
 class RunKernelTask : public ThreadPool::Task {
@@ -79,11 +78,7 @@
 
     Dart_IsolateCreateCallback create_callback =
         KernelIsolate::create_callback();
-
-    if (create_callback == NULL) {
-      KernelIsolate::FinishedInitializing();
-      return;
-    }
+    ASSERT(create_callback != NULL);
 
     // Note: these flags must match those passed to the VM during
     // the app-jit training run (see //utils/kernel-service/BUILD.gn).
@@ -109,7 +104,7 @@
       free(error);
       error = NULL;
       KernelIsolate::SetKernelIsolate(NULL);
-      KernelIsolate::FinishedInitializing();
+      KernelIsolate::InitializingFailed();
       return;
     }
 
@@ -171,6 +166,7 @@
     if (FLAG_trace_kernel) {
       OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Shutdown.\n");
     }
+    KernelIsolate::FinishedExiting();
   }
 
   bool RunMain(Isolate* I) {
@@ -223,18 +219,36 @@
 };
 
 void KernelIsolate::Run() {
-  MonitorLocker ml(monitor_);
-  initializing_ = true;
+  {
+    MonitorLocker ml(monitor_);
+    ASSERT(state_ == kStopped);
+    state_ = kStarting;
+    ml.NotifyAll();
+  }
   // Grab the isolate create callback here to avoid race conditions with tests
   // that change this after Dart_Initialize returns.
   create_callback_ = Isolate::CreateCallback();
-  Dart::thread_pool()->Run(new RunKernelTask());
+  if (create_callback_ == NULL) {
+    KernelIsolate::InitializingFailed();
+    return;
+  }
+  bool task_started = Dart::thread_pool()->Run(new RunKernelTask());
+  ASSERT(task_started);
 }
 
 void KernelIsolate::Shutdown() {
   MonitorLocker ml(monitor_);
-  while (isolate_ != NULL) {
-    Isolate::KillIfExists(isolate_, Isolate::kInternalKillMsg);
+  while (state_ == kStarting) {
+    ml.Wait();
+  }
+  if (state_ == kStopped) {
+    return;
+  }
+  ASSERT(state_ == kStarted);
+  state_ = kStopping;
+  ml.NotifyAll();
+  Isolate::KillIfExists(isolate_, Isolate::kInternalKillMsg);
+  while (state_ != kStopped) {
     ml.Wait();
   }
 }
@@ -290,16 +304,31 @@
   ml.NotifyAll();
 }
 
+void KernelIsolate::FinishedExiting() {
+  MonitorLocker ml(monitor_);
+  ASSERT(state_ == kStarted || state_ == kStopping);
+  state_ = kStopped;
+  ml.NotifyAll();
+}
+
 void KernelIsolate::FinishedInitializing() {
   MonitorLocker ml(monitor_);
-  initializing_ = false;
+  ASSERT(state_ == kStarting);
+  state_ = kStarted;
+  ml.NotifyAll();
+}
+
+void KernelIsolate::InitializingFailed() {
+  MonitorLocker ml(monitor_);
+  ASSERT(state_ == kStarting);
+  state_ = kStopped;
   ml.NotifyAll();
 }
 
 Dart_Port KernelIsolate::WaitForKernelPort() {
   VMTagScope tagScope(Thread::Current(), VMTag::kLoadWaitTagId);
   MonitorLocker ml(monitor_);
-  while (initializing_ && (kernel_port_ == ILLEGAL_PORT)) {
+  while (state_ == kStarting && (kernel_port_ == ILLEGAL_PORT)) {
     ml.Wait();
   }
   return kernel_port_;
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 284177b..cdfe9da 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -70,22 +70,28 @@
   static void AddExperimentalFlag(const char* value);
 
  protected:
-  static Monitor* monitor_;
-  static Dart_IsolateCreateCallback create_callback_;
-
   static void InitCallback(Isolate* I);
   static void SetKernelIsolate(Isolate* isolate);
   static void SetLoadPort(Dart_Port port);
+  static void FinishedExiting();
   static void FinishedInitializing();
-
-  static Dart_Port kernel_port_;
-  static Isolate* isolate_;
-  static bool initializing_;
-
+  static void InitializingFailed();
   static Dart_IsolateCreateCallback create_callback() {
     return create_callback_;
   }
 
+  static Dart_IsolateCreateCallback create_callback_;
+  static Monitor* monitor_;
+  enum State {
+    kStopped,
+    kStarting,
+    kStarted,
+    kStopping,
+  };
+  static State state_;
+  static Isolate* isolate_;
+  static Dart_Port kernel_port_;
+
   static MallocGrowableArray<char*>* experimental_flags_;
 
   friend class Dart;
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 183ae42..b90a609 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -143,8 +143,9 @@
   return loader_->LookupClass(library_lookup_handle_, klass);
 }
 
-LibraryIndex::LibraryIndex(const ExternalTypedData& kernel_data)
-    : reader_(kernel_data) {
+LibraryIndex::LibraryIndex(const ExternalTypedData& kernel_data,
+                           int32_t binary_version)
+    : reader_(kernel_data), binary_version_(binary_version) {
   intptr_t data_size = reader_.size();
 
   procedure_count_ = reader_.ReadUInt32At(data_size - 4);
@@ -152,6 +153,11 @@
 
   class_count_ = reader_.ReadUInt32At(procedure_index_offset_ - 4);
   class_index_offset_ = procedure_index_offset_ - 4 - (class_count_ + 1) * 4;
+
+  source_references_offset_ = -1;
+  if (binary_version >= 25) {
+    source_references_offset_ = reader_.ReadUInt32At(class_index_offset_ - 4);
+  }
 }
 
 ClassIndex::ClassIndex(const uint8_t* buffer,
@@ -539,11 +545,16 @@
       const intptr_t annotation_count = helper_.ReadListLength();
       for (intptr_t j = 0; j < annotation_count; ++j) {
         const intptr_t tag = helper_.PeekTag();
-        if (tag == kConstantExpression) {
+        if (tag == kConstantExpression ||
+            tag == kDeprecated_ConstantExpression) {
           helper_.ReadByte();  // Skip the tag.
 
           // We have a candiate.  Let's look if it's an instance of the
           // ExternalName class.
+          if (tag == kConstantExpression) {
+            helper_.ReadPosition();  // Skip fileOffset.
+            helper_.SkipDartType();  // Skip type.
+          }
           const intptr_t constant_table_offset = helper_.ReadUInt();
           constant ^= constant_table.GetOrDie(constant_table_offset);
           if (constant.clazz() == external_name_class_.raw()) {
@@ -654,9 +665,13 @@
       uri_path = String::null();
 
       const intptr_t tag = helper_.PeekTag();
-      if (tag == kConstantExpression) {
+      if (tag == kConstantExpression || tag == kDeprecated_ConstantExpression) {
         helper_.ReadByte();  // Skip the tag.
 
+        if (tag == kConstantExpression) {
+          helper_.ReadPosition();  // Skip fileOffset.
+          helper_.SkipDartType();  // Skip type.
+        }
         const intptr_t constant_table_index = helper_.ReadUInt();
         constant ^= constant_table.GetOrDie(constant_table_index);
         if (constant.clazz() == external_name_class_.raw()) {
@@ -910,7 +925,8 @@
       library_kernel_data_ =
           helper_.reader_.ExternalDataFromTo(kernel_offset, library_end);
 
-      LibraryIndex library_index(library_kernel_data_);
+      LibraryIndex library_index(library_kernel_data_,
+                                 program_->binary_version());
       num_classes += library_index.class_count();
       num_procedures += library_index.procedure_count();
     }
@@ -1001,7 +1017,7 @@
   library.set_kernel_data(library_kernel_data_);
   library.set_kernel_offset(library_kernel_offset_);
 
-  LibraryIndex library_index(library_kernel_data_);
+  LibraryIndex library_index(library_kernel_data_, program_->binary_version());
   intptr_t class_count = library_index.class_count();
 
   library_helper.ReadUntilIncluding(LibraryHelper::kName);
@@ -1084,6 +1100,19 @@
 
   if (register_class) {
     classes.Add(toplevel_class, Heap::kOld);
+
+    if (library_index.HasSourceReferences()) {
+      helper_.SetOffset(library_index.SourceReferencesOffset());
+      intptr_t count = helper_.ReadUInt();
+      const GrowableObjectArray& owned_scripts =
+          GrowableObjectArray::Handle(library.owned_scripts());
+      Script& script = Script::Handle(Z);
+      for (intptr_t i = 0; i < count; i++) {
+        intptr_t uri_index = helper_.ReadUInt();
+        script = ScriptAt(uri_index);
+        owned_scripts.Add(script);
+      }
+    }
   }
   if (!library.Loaded()) library.SetLoaded();
 
@@ -1668,7 +1697,7 @@
 
   KernelLoader kernel_loader(script, library_kernel_data,
                              library_kernel_offset);
-  LibraryIndex library_index(library_kernel_data);
+  LibraryIndex library_index(library_kernel_data, /*binary_version=*/-1);
 
   if (klass.IsTopLevel()) {
     ASSERT(klass.raw() == toplevel_class.raw());
@@ -1725,7 +1754,8 @@
       if (DetectPragmaCtor()) {
         *has_pragma_annotation = true;
       }
-    } else if (tag == kConstantExpression) {
+    } else if (tag == kConstantExpression ||
+               tag == kDeprecated_ConstantExpression) {
       const Array& constant_table_array =
           Array::Handle(kernel_program_info_.constants());
       if (constant_table_array.IsNull()) {
@@ -1747,6 +1777,10 @@
 
         helper_.ReadByte();  // Skip the tag.
 
+        if (tag == kConstantExpression) {
+          helper_.ReadPosition();  // Skip fileOffset.
+          helper_.SkipDartType();  // Skip type.
+        }
         const intptr_t offset_in_constant_table = helper_.ReadUInt();
 
         AlternativeReadingScope scope(
@@ -1776,6 +1810,10 @@
         // Obtain `dart:_internal::pragma`.
         EnsurePragmaClassIsLookedUp();
 
+        if (tag == kConstantExpression) {
+          helper_.ReadPosition();  // Skip fileOffset.
+          helper_.SkipDartType();  // Skip type.
+        }
         const intptr_t constant_table_index = helper_.ReadUInt();
         const Object& constant =
             Object::Handle(constant_table.GetOrDie(constant_table_index));
@@ -2233,10 +2271,7 @@
 
   // Create a static initializer.
   const Function& initializer_fun = Function::Handle(
-      zone, Function::New(init_name,
-                          // TODO(alexmarkov): Consider creating a separate
-                          // function kind for field initializers.
-                          RawFunction::kImplicitStaticFinalGetter,
+      zone, Function::New(init_name, RawFunction::kStaticFieldInitializer,
                           true,   // is_static
                           false,  // is_const
                           false,  // is_abstract
@@ -2248,6 +2283,7 @@
   initializer_fun.set_is_inlinable(false);
   initializer_fun.set_token_pos(field.token_pos());
   initializer_fun.set_end_token_pos(field.end_token_pos());
+  initializer_fun.set_accessor_field(field);
   initializer_fun.InheritBinaryDeclarationFrom(field);
   field.SetInitializerFunction(initializer_fun);
   return initializer_fun.raw();
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index ea39aac..79c58b6 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -82,7 +82,10 @@
 class LibraryIndex {
  public:
   // |kernel_data| is the kernel data for one library alone.
-  explicit LibraryIndex(const ExternalTypedData& kernel_data);
+  // binary_version can be -1 in which case some parts of the index might not
+  // be read.
+  explicit LibraryIndex(const ExternalTypedData& kernel_data,
+                        int32_t binary_version);
 
   intptr_t class_count() const { return class_count_; }
   intptr_t procedure_count() const { return procedure_count_; }
@@ -106,8 +109,17 @@
     return -1;
   }
 
+  bool HasSourceReferences() {
+    if (binary_version_ < 25) return false;
+    return true;
+  }
+
+  intptr_t SourceReferencesOffset() { return source_references_offset_; }
+
  private:
   Reader reader_;
+  int32_t binary_version_;
+  intptr_t source_references_offset_;
   intptr_t class_index_offset_;
   intptr_t class_count_;
   intptr_t procedure_index_offset_;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0397d9c..7a8b971 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -36,6 +36,7 @@
 #include "vm/heap/weak_code.h"
 #include "vm/isolate_reload.h"
 #include "vm/kernel.h"
+#include "vm/kernel_binary.h"
 #include "vm/kernel_isolate.h"
 #include "vm/kernel_loader.h"
 #include "vm/native_symbol.h"
@@ -901,6 +902,17 @@
   implicit_setter_bytecode_->set_exception_handlers(
       Object::empty_exception_handlers());
 
+  static const KBCInstr method_extractor_instr[2] = {
+      KernelBytecode::Encode(KernelBytecode::kVMInternal_MethodExtractor),
+      KernelBytecode::Encode(KernelBytecode::kReturnTOS),
+  };
+  *method_extractor_bytecode_ = Bytecode::New(
+      reinterpret_cast<uword>(method_extractor_instr),
+      sizeof(method_extractor_instr), -1, Object::empty_object_pool());
+  method_extractor_bytecode_->set_pc_descriptors(Object::empty_descriptors());
+  method_extractor_bytecode_->set_exception_handlers(
+      Object::empty_exception_handlers());
+
   // Some thread fields need to be reinitialized as null constants have not been
   // initialized until now.
   Thread* thr = Thread::Current();
@@ -962,6 +974,8 @@
   ASSERT(implicit_getter_bytecode_->IsBytecode());
   ASSERT(!implicit_setter_bytecode_->IsSmi());
   ASSERT(implicit_setter_bytecode_->IsBytecode());
+  ASSERT(!method_extractor_bytecode_->IsSmi());
+  ASSERT(method_extractor_bytecode_->IsBytecode());
 }
 
 void Object::FinishInit(Isolate* isolate) {
@@ -5678,7 +5692,6 @@
     }
   }
   switch (kind()) {
-    case RawFunction::kMethodExtractor:
     case RawFunction::kNoSuchMethodDispatcher:
     case RawFunction::kInvokeFieldDispatcher:
     case RawFunction::kDynamicInvocationForwarder:
@@ -5687,7 +5700,7 @@
     case RawFunction::kFfiTrampoline:
       return false;
     case RawFunction::kImplicitStaticFinalGetter:
-      return kernel::IsFieldInitializer(*this, zone) || is_const();
+      return is_const();
     default:
       return true;
   }
@@ -5913,6 +5926,7 @@
   ASSERT(kind() == RawFunction::kImplicitGetter ||
          kind() == RawFunction::kImplicitSetter ||
          kind() == RawFunction::kImplicitStaticFinalGetter ||
+         kind() == RawFunction::kStaticFieldInitializer ||
          kind() == RawFunction::kDynamicInvocationForwarder);
   return Field::RawCast(raw_ptr()->data_);
 }
@@ -5920,7 +5934,8 @@
 void Function::set_accessor_field(const Field& value) const {
   ASSERT(kind() == RawFunction::kImplicitGetter ||
          kind() == RawFunction::kImplicitSetter ||
-         kind() == RawFunction::kImplicitStaticFinalGetter);
+         kind() == RawFunction::kImplicitStaticFinalGetter ||
+         kind() == RawFunction::kStaticFieldInitializer);
   // Top level classes may be finalized multiple times.
   ASSERT(raw_ptr()->data_ == Object::null() || raw_ptr()->data_ == value.raw());
   set_data(value);
@@ -6148,6 +6163,9 @@
     case RawFunction::kImplicitStaticFinalGetter:
       return "ImplicitStaticFinalGetter";
       break;
+    case RawFunction::kStaticFieldInitializer:
+      return "StaticFieldInitializer";
+      break;
     case RawFunction::kMethodExtractor:
       return "MethodExtractor";
       break;
@@ -6222,6 +6240,7 @@
 //   implicit getter:         Field
 //   implicit setter:         Field
 //   impl. static final gttr: Field
+//   field initializer:       Field
 //   noSuchMethod dispatcher: Array arguments descriptor
 //   invoke-field dispatcher: Array arguments descriptor
 //   redirecting constructor: RedirectionData
@@ -8051,6 +8070,9 @@
     case RawFunction::kImplicitStaticFinalGetter:
       kind_str = " static-final-getter";
       break;
+    case RawFunction::kStaticFieldInitializer:
+      kind_str = " static-field-initializer";
+      break;
     case RawFunction::kMethodExtractor:
       kind_str = " method-extractor";
       break;
@@ -10378,6 +10400,15 @@
   // We compute the list of loaded scripts lazily. The result is
   // cached in loaded_scripts_.
   if (loaded_scripts() == Array::null()) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    // TODO(jensj): Once minimum kernel support is >= 25 this can be cleaned up.
+    // It really should just return the content of `owned_scripts`, and there
+    // should be no need to do the O(n) call to `AddScriptIfUnique` per script.
+    static_assert(
+        kernel::kMinSupportedKernelFormatVersion < 25,
+        "Once minimum kernel support is >= 25 this can be cleaned up.");
+#endif
+
     // Iterate over the library dictionary and collect all scripts.
     const GrowableObjectArray& scripts =
         GrowableObjectArray::Handle(GrowableObjectArray::New(8));
@@ -10400,7 +10431,7 @@
     }
 
     // Add all scripts from patch classes.
-    GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes());
+    GrowableObjectArray& patches = GrowableObjectArray::Handle(owned_scripts());
     for (intptr_t i = 0; i < patches.Length(); i++) {
       entry = patches.At(i);
       if (entry.IsClass()) {
@@ -10856,7 +10887,7 @@
                       GrowableObjectArray::New(4, Heap::kOld));
   result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null());
   result.StorePointer(
-      &result.raw_ptr()->patch_classes_,
+      &result.raw_ptr()->owned_scripts_,
       GrowableObjectArray::New(Object::empty_array(), Heap::kOld));
   result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw());
   result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw());
@@ -15120,6 +15151,8 @@
     return "[Bytecode Stub] VMInternal_ImplicitGetter";
   } else if (raw() == Object::implicit_setter_bytecode().raw()) {
     return "[Bytecode Stub] VMInternal_ImplicitSetter";
+  } else if (raw() == Object::method_extractor_bytecode().raw()) {
+    return "[Bytecode Stub] VMInternal_MethodExtractor";
   }
 
   Zone* zone = Thread::Current()->zone();
@@ -15132,9 +15165,11 @@
 
 const char* Bytecode::QualifiedName() const {
   if (raw() == Object::implicit_getter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal__ImplicitGetter";
+    return "[Bytecode Stub] VMInternal_ImplicitGetter";
   } else if (raw() == Object::implicit_setter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal__ImplicitSetter";
+    return "[Bytecode Stub] VMInternal_ImplicitSetter";
+  } else if (raw() == Object::method_extractor_bytecode().raw()) {
+    return "[Bytecode Stub] VMInternal_MethodExtractor";
   }
 
   Zone* zone = Thread::Current()->zone();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index a3a1aca..b1a0d3b 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -398,6 +398,7 @@
   V(Array, extractor_parameter_names)                                          \
   V(Bytecode, implicit_getter_bytecode)                                        \
   V(Bytecode, implicit_setter_bytecode)                                        \
+  V(Bytecode, method_extractor_bytecode)                                       \
   V(Instance, sentinel)                                                        \
   V(Instance, transition_sentinel)                                             \
   V(Instance, unknown_constant)                                                \
@@ -2296,6 +2297,7 @@
       case RawFunction::kSignatureFunction:
       case RawFunction::kConstructor:
       case RawFunction::kImplicitStaticFinalGetter:
+      case RawFunction::kStaticFieldInitializer:
       case RawFunction::kIrregexpFunction:
         return false;
       default:
@@ -2314,6 +2316,7 @@
       case RawFunction::kImplicitGetter:
       case RawFunction::kImplicitSetter:
       case RawFunction::kImplicitStaticFinalGetter:
+      case RawFunction::kStaticFieldInitializer:
       case RawFunction::kIrregexpFunction:
         return true;
       case RawFunction::kClosureFunction:
@@ -2592,6 +2595,7 @@
     switch (kind()) {
       case RawFunction::kImplicitGetter:
       case RawFunction::kImplicitSetter:
+      case RawFunction::kImplicitStaticFinalGetter:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
       case RawFunction::kDynamicInvocationForwarder:
@@ -2624,7 +2628,7 @@
   // Returns true if this function represents an implicit static field
   // initializer function.
   bool IsImplicitStaticFieldInitializer() const {
-    return kind() == RawFunction::kImplicitStaticFinalGetter;
+    return kind() == RawFunction::kStaticFieldInitializer;
   }
 
   // Returns true if this function represents a (possibly implicit) closure
@@ -2875,9 +2879,6 @@
   //          dispatchers is not visible. Synthetic code that can trigger
   //          exceptions such as the outer async functions that create Futures
   //          is visible.
-  // optimizable: Candidate for going through the optimizing compiler. False for
-  //              some functions known to be execute infrequently and functions
-  //              which have been de-optimized too many times.
   // instrinsic: Has a hand-written assembly prologue.
   // inlinable: Candidate for inlining. False for functions with features we
   //            don't support during inlining (e.g., optional parameters),
@@ -2899,7 +2900,6 @@
   V(Reflectable, is_reflectable)                                               \
   V(Visible, is_visible)                                                       \
   V(Debuggable, is_debuggable)                                                 \
-  V(Optimizable, is_optimizable)                                               \
   V(Inlinable, is_inlinable)                                                   \
   V(Intrinsic, is_intrinsic)                                                   \
   V(Native, is_native)                                                         \
@@ -2919,6 +2919,17 @@
   FOR_EACH_FUNCTION_KIND_BIT(DEFINE_ACCESSORS)
 #undef DEFINE_ACCESSORS
 
+  // optimizable: Candidate for going through the optimizing compiler. False for
+  //              some functions known to be execute infrequently and functions
+  //              which have been de-optimized too many times.
+  bool is_optimizable() const {
+    return RawFunction::OptimizableBit::decode(raw_ptr()->packed_fields_);
+  }
+  void set_is_optimizable(bool value) const {
+    set_packed_fields(
+        RawFunction::OptimizableBit::update(value, raw_ptr()->packed_fields_));
+  }
+
   // Indicates whether this function can be optimized on the background compiler
   // thread.
   bool is_background_optimizable() const {
@@ -2937,7 +2948,7 @@
 
   enum KindTagBits {
     kKindTagPos = 0,
-    kKindTagSize = 4,
+    kKindTagSize = 5,
     kRecognizedTagPos = kKindTagPos + kKindTagSize,
     kRecognizedTagSize = 9,
     kModifierPos = kRecognizedTagPos + kRecognizedTagSize,
@@ -3886,8 +3897,8 @@
   RawClass* toplevel_class() const { return raw_ptr()->toplevel_class_; }
   void set_toplevel_class(const Class& value) const;
 
-  RawGrowableObjectArray* patch_classes() const {
-    return raw_ptr()->patch_classes_;
+  RawGrowableObjectArray* owned_scripts() const {
+    return raw_ptr()->owned_scripts_;
   }
 
   // Library imports.
@@ -5498,6 +5509,9 @@
   static intptr_t num_variables_offset() {
     return OFFSET_OF(RawContext, num_variables_);
   }
+  static intptr_t NumVariables(const RawContext* context) {
+    return context->ptr()->num_variables_;
+  }
 
   RawObject* At(intptr_t context_index) const {
     return *ObjectAddr(context_index);
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 99576c6..e0d65f9 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -332,7 +332,8 @@
                     static_cast<intptr_t>(deoptimization_counter()));
   if ((kind() == RawFunction::kImplicitGetter) ||
       (kind() == RawFunction::kImplicitSetter) ||
-      (kind() == RawFunction::kImplicitStaticFinalGetter)) {
+      (kind() == RawFunction::kImplicitStaticFinalGetter) ||
+      (kind() == RawFunction::kStaticFieldInitializer)) {
     const Field& field = Field::Handle(accessor_field());
     if (!field.IsNull()) {
       jsobj.AddProperty("_field", field);
diff --git a/runtime/vm/os.h b/runtime/vm/os.h
index e987b5c..af98eb1 100644
--- a/runtime/vm/os.h
+++ b/runtime/vm/os.h
@@ -122,6 +122,9 @@
   // Cleanup the OS class.
   static void Cleanup();
 
+  // Only implemented on Windows, prevents cleanup code from running.
+  static void PrepareToAbort();
+
   DART_NORETURN static void Abort();
 
   DART_NORETURN static void Exit(int code);
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 997578c..196620f 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -337,6 +337,8 @@
 
 void OS::Cleanup() {}
 
+void OS::PrepareToAbort() {}
+
 void OS::Abort() {
   abort();
 }
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 600141e..df94ba9 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -258,6 +258,8 @@
 
 void OS::Cleanup() {}
 
+void OS::PrepareToAbort() {}
+
 void OS::Abort() {
   abort();
 }
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 20db94d..bc254e4 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -659,6 +659,8 @@
 
 void OS::Cleanup() {}
 
+void OS::PrepareToAbort() {}
+
 void OS::Abort() {
   abort();
 }
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index 16ce7e8..be6455d 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -323,6 +323,8 @@
 
 void OS::Cleanup() {}
 
+void OS::PrepareToAbort() {}
+
 void OS::Abort() {
   abort();
 }
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 885009c..1ff4eb9 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -336,9 +336,13 @@
   // ThreadLocalData::Cleanup();
 }
 
-void OS::Abort() {
+void OS::PrepareToAbort() {
   // TODO(zra): Remove once VM shuts down cleanly.
   private_flag_windows_run_tls_destructors = false;
+}
+
+void OS::Abort() {
+  PrepareToAbort();
   abort();
 }
 
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index dfc48dd..bae18f7 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -34,7 +34,7 @@
       }
       visitor->Visit(cls);
     }
-    patches = lib.patch_classes();
+    patches = lib.owned_scripts();
     for (intptr_t j = 0; j < patches.Length(); j++) {
       entry = patches.At(j);
       if (entry.IsClass()) {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 5f77d72..ffff441 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -851,6 +851,7 @@
     kImplicitSetter,             // represents an implicit setter for fields.
     kImplicitStaticFinalGetter,  // represents an implicit getter for static
                                  // final fields (incl. static const fields).
+    kStaticFieldInitializer,
     kMethodExtractor,  // converts method into implicit closure on the receiver.
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
     kInvokeFieldDispatcher,   // invokes a field as a closure.
@@ -935,6 +936,8 @@
                    bool,
                    PackedHasNamedOptionalParameters::kNextBit,
                    1>
+      OptimizableBit;
+  typedef BitField<uint32_t, bool, OptimizableBit::kNextBit, 1>
       BackgroundOptimizableBit;
   typedef BitField<uint32_t,
                    uint16_t,
@@ -1153,7 +1156,7 @@
   RawArray* dictionary_;              // Top-level names in this library.
   RawGrowableObjectArray* metadata_;  // Metadata on classes, methods etc.
   RawClass* toplevel_class_;          // Class containing top-level elements.
-  RawGrowableObjectArray* patch_classes_;
+  RawGrowableObjectArray* owned_scripts_;
   RawArray* imports_;        // List of Namespaces imported without prefix.
   RawArray* exports_;        // List of re-exported Namespaces.
   RawInstance* load_error_;  // Error iff load_state_ == kLoadError.
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 6bb1ac1..5728dad 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -71,7 +71,7 @@
   F(Library, dictionary_)                                                      \
   F(Library, metadata_)                                                        \
   F(Library, toplevel_class_)                                                  \
-  F(Library, patch_classes_)                                                   \
+  F(Library, owned_scripts_)                                                   \
   F(Library, imports_)                                                         \
   F(Library, exports_)                                                         \
   F(Library, load_error_)                                                      \
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 69b8a7a..f54d840 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -1718,6 +1718,7 @@
   // not act as an OSR entry outside loops.
   AppendInstruction(new (Z) CheckStackOverflowInstr(
       TokenPosition::kNoSource,
+      /*stack_depth=*/0,
       /*loop_depth=*/1, GetNextDeoptId(),
       is_backtrack ? CheckStackOverflowInstr::kOsrAndPreemption
                    : CheckStackOverflowInstr::kOsrOnly));
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index bcc8277..da70f90 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -219,30 +219,6 @@
   Exceptions::ThrowByType(Exceptions::kIntegerDivisionByZeroException, args);
 }
 
-static void EnsureNewOrRemembered(Thread* thread, const Object& result) {
-  // For generational write barrier elimination, we need to ensure that the
-  // allocation ends up in the new space if Heap::IsGuaranteedNewSpaceAllocation
-  // is true for this size or else the object needs to go into the store buffer.
-  NoSafepointScope no_safepoint_scope;
-
-  RawObject* object = result.raw();
-  if (!object->IsNewObject()) {
-    object->AddToRememberedSet(thread);
-  }
-}
-
-static void EnsureNewOrDeferredMarking(Thread* thread, const Object& result) {
-  // For incremental write barrier elimination, we need to ensure that the
-  // allocation ends up in the new space or else the object needs to added
-  // to deferred marking stack so it will be [re]scanned.
-  NoSafepointScope no_safepoint_scope;
-
-  RawObject* object = result.raw();
-  if (object->IsOldObject() && thread->is_marking()) {
-    thread->DeferredMarkingStackAddObject(object);
-  }
-}
-
 // Allocation of a fixed length array of given element type.
 // This runtime entry is never called for allocating a List of a generic type,
 // because a prior run time call instantiates the element type if necessary.
@@ -272,14 +248,6 @@
       ASSERT(element_type.IsNull() ||
              (element_type.Length() >= 1 && element_type.IsInstantiated()));
       array.SetTypeArguments(element_type);  // May be null.
-
-      ASSERT(Array::UseCardMarkingForAllocation(len) ==
-             array.raw()->IsCardRemembered());
-      if (!array.raw()->IsCardRemembered()) {
-        EnsureNewOrRemembered(thread, array);
-      }
-      EnsureNewOrDeferredMarking(thread, array);
-
       return;
     }
   }
@@ -325,13 +293,57 @@
             (type_arguments.Length() >= cls.NumTypeArguments())));
     instance.SetTypeArguments(type_arguments);
   }
-
-  if (AllocateObjectInstr::WillAllocateNewOrRemembered(cls)) {
-    EnsureNewOrRemembered(thread, instance);
-    EnsureNewOrDeferredMarking(thread, instance);
-  }
 }
 
+DEFINE_LEAF_RUNTIME_ENTRY(RawObject*,
+                          AddAllocatedObjectToRememberedSet,
+                          2,
+                          RawObject* object,
+                          Thread* thread) {
+  // The allocation stubs in will call this leaf method for newly allocated
+  // old space objects.
+  RELEASE_ASSERT(object->IsOldObject() && !object->IsRemembered());
+
+  // If we eliminate a generational write barriers on allocations of an object
+  // we need to ensure it's either a new-space object or it has been added to
+  // the remebered set.
+  //
+  // NOTE: We use reinterpret_cast<>() instead of ::RawCast() to avoid handle
+  // allocations in debug mode. Handle allocations in leaf runtimes can cause
+  // memory leaks because they will allocate into a handle scope from the next
+  // outermost runtime code (to which the genenerated Dart code might not return
+  // in a long time).
+  bool add_to_remembered_set = true;
+  if (object->IsArray()) {
+    const intptr_t length =
+        Array::LengthOf(reinterpret_cast<RawArray*>(object));
+    add_to_remembered_set =
+        CreateArrayInstr::WillAllocateNewOrRemembered(length);
+  } else if (object->IsContext()) {
+    const intptr_t num_context_variables =
+        Context::NumVariables(reinterpret_cast<RawContext*>(object));
+    add_to_remembered_set =
+        AllocateContextInstr::WillAllocateNewOrRemembered(
+            num_context_variables) ||
+        AllocateUninitializedContextInstr::WillAllocateNewOrRemembered(
+            num_context_variables);
+  }
+
+  if (add_to_remembered_set) {
+    object->AddToRememberedSet(thread);
+  }
+
+  // For incremental write barrier elimination, we need to ensure that the
+  // allocation ends up in the new space or else the object needs to added
+  // to deferred marking stack so it will be [re]scanned.
+  if (thread->is_marking()) {
+    thread->DeferredMarkingStackAddObject(object);
+  }
+
+  return object;
+}
+END_LEAF_RUNTIME_ENTRY
+
 // Instantiate type.
 // Arg0: uninstantiated type.
 // Arg1: instantiator type arguments.
@@ -433,15 +445,6 @@
   const Context& context =
       Context::Handle(zone, Context::New(num_variables.Value()));
   arguments.SetReturn(context);
-
-  const intptr_t num_context_variables = num_variables.Value();
-  if (AllocateContextInstr::WillAllocateNewOrRemembered(
-          num_context_variables) ||
-      AllocateUninitializedContextInstr::WillAllocateNewOrRemembered(
-          num_context_variables)) {
-    EnsureNewOrRemembered(thread, context);
-    EnsureNewOrDeferredMarking(thread, context);
-  }
 }
 
 // Make a copy of the given context, including the values of the captured
@@ -461,28 +464,6 @@
   arguments.SetReturn(cloned_ctx);
 }
 
-// Extract a method by allocating and initializing a new Closure.
-// Arg0: receiver.
-// Arg1: method.
-// Return value: newly allocated Closure.
-DEFINE_RUNTIME_ENTRY(ExtractMethod, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const Function& method = Function::CheckedHandle(zone, arguments.ArgAt(1));
-  const TypeArguments& instantiator_type_arguments =
-      method.HasInstantiatedSignature(kCurrentClass)
-          ? Object::null_type_arguments()
-          : TypeArguments::Handle(zone, receiver.GetTypeArguments());
-  ASSERT(method.HasInstantiatedSignature(kFunctions));
-  const Context& context = Context::Handle(zone, Context::New(1));
-  context.SetAt(0, receiver);
-  const Closure& closure = Closure::Handle(
-      zone,
-      Closure::New(instantiator_type_arguments, Object::null_type_arguments(),
-                   Object::empty_type_arguments(), method, context));
-  arguments.SetReturn(closure);
-}
-
 // Result of an invoke may be an unhandled exception, in which case we
 // rethrow it.
 static void ThrowIfError(const Object& result) {
@@ -2761,4 +2742,20 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
+extern "C" void DFLRT_EnterSafepoint(NativeArguments __unusable_) {
+  Thread* thread = Thread::Current();
+  ASSERT(thread->top_exit_frame_info() != 0);
+  ASSERT(thread->execution_state() == Thread::kThreadInNative);
+  thread->EnterSafepoint();
+}
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(EnterSafepoint, 0, false, &DFLRT_EnterSafepoint);
+
+extern "C" void DFLRT_ExitSafepoint(NativeArguments __unusable_) {
+  Thread* thread = Thread::Current();
+  ASSERT(thread->top_exit_frame_info() != 0);
+  ASSERT(thread->execution_state() == Thread::kThreadInNative);
+  thread->ExitSafepoint();
+}
+DEFINE_RAW_LEAF_RUNTIME_ENTRY(ExitSafepoint, 0, false, &DFLRT_ExitSafepoint);
+
 }  // namespace dart
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 13fb2b8ec..bb2eca9 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -15,7 +15,6 @@
   V(BreakpointRuntimeHandler)                                                  \
   V(SingleStepHandler)                                                         \
   V(CloneContext)                                                              \
-  V(ExtractMethod)                                                             \
   V(GetFieldForDispatch)                                                       \
   V(ResolveCallFunction)                                                       \
   V(FixCallersTarget)                                                          \
@@ -65,6 +64,8 @@
   V(void, StoreBufferBlockProcess, Thread*)                                    \
   V(void, MarkingStackBlockProcess, Thread*)                                   \
   V(void, RememberCard, RawObject*, RawObject**)                               \
+  V(RawObject*, AddAllocatedObjectToRememberedSet, RawObject* object,          \
+    Thread* thread)                                                            \
   V(double, LibcPow, double, double)                                           \
   V(double, DartModulo, double, double)                                        \
   V(double, LibcFloor, double)                                                 \
@@ -78,7 +79,10 @@
   V(double, LibcAsin, double)                                                  \
   V(double, LibcAtan, double)                                                  \
   V(double, LibcAtan2, double, double)                                         \
-  V(RawBool*, CaseInsensitiveCompareUC16, RawString*, RawSmi*, RawSmi*, RawSmi*)
+  V(RawBool*, CaseInsensitiveCompareUC16, RawString*, RawSmi*, RawSmi*,        \
+    RawSmi*)                                                                   \
+  V(void, EnterSafepoint)                                                      \
+  V(void, ExitSafepoint)
 
 }  // namespace dart
 
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 2aeb4a3..e96f9a5 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -513,7 +513,7 @@
     return true;
   }
 
-  static intptr_t Parse(const char* value) {
+  static uintptr_t Parse(const char* value) {
     if (value == NULL) {
       return -1;
     }
@@ -3849,9 +3849,9 @@
   Profile::TagOrder tag_order =
       EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values);
   int64_t time_origin_micros =
-      UIntParameter::Parse(js->LookupParam("timeOriginMicros"));
+      Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
-      UIntParameter::Parse(js->LookupParam("timeExtentMicros"));
+      Int64Parameter::Parse(js->LookupParam("timeExtentMicros"));
   bool code_trie = BoolParameter::Parse(js->LookupParam("code"), false);
   ProfilerService::PrintTimelineJSON(js, tag_order, time_origin_micros,
                                      time_extent_micros, code_trie);
@@ -3862,9 +3862,9 @@
   Profile::TagOrder tag_order =
       EnumMapper(js->LookupParam("tags"), tags_enum_names, tags_enum_values);
   int64_t time_origin_micros =
-      UIntParameter::Parse(js->LookupParam("timeOriginMicros"));
+      Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
-      UIntParameter::Parse(js->LookupParam("timeExtentMicros"));
+      Int64Parameter::Parse(js->LookupParam("timeExtentMicros"));
   bool code_trie = BoolParameter::Parse(js->LookupParam("code"), true);
   ProfilerService::AddToTimeline(tag_order, time_origin_micros,
                                  time_extent_micros, code_trie);
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 46f8f02..085b11a 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -72,15 +72,14 @@
   return list.raw();
 }
 
-const char* ServiceIsolate::kName = "vm-service";
+const char* ServiceIsolate::kName = DART_VM_SERVICE_ISOLATE_NAME;
+Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL;
+Monitor* ServiceIsolate::monitor_ = new Monitor();
+ServiceIsolate::State ServiceIsolate::state_ = ServiceIsolate::kStopped;
 Isolate* ServiceIsolate::isolate_ = NULL;
 Dart_Port ServiceIsolate::port_ = ILLEGAL_PORT;
 Dart_Port ServiceIsolate::load_port_ = ILLEGAL_PORT;
 Dart_Port ServiceIsolate::origin_ = ILLEGAL_PORT;
-Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL;
-Monitor* ServiceIsolate::monitor_ = new Monitor();
-bool ServiceIsolate::initializing_ = true;
-bool ServiceIsolate::shutting_down_ = false;
 char* ServiceIsolate::server_address_ = NULL;
 
 void ServiceIsolate::RequestServerInfo(const SendPort& sp) {
@@ -145,7 +144,7 @@
 Dart_Port ServiceIsolate::WaitForLoadPort() {
   VMTagScope tagScope(Thread::Current(), VMTag::kLoadWaitTagId);
   MonitorLocker ml(monitor_);
-  while (initializing_ && (load_port_ == ILLEGAL_PORT)) {
+  while (state_ == kStarting && (load_port_ == ILLEGAL_PORT)) {
     ml.Wait();
   }
   return load_port_;
@@ -207,7 +206,8 @@
   ASSERT(!list.IsNull());
   MessageWriter writer(false);
   if (FLAG_trace_service) {
-    OS::PrintErr("vm-service: Isolate %s %" Pd64 " registered.\n",
+    OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Isolate %s %" Pd64
+                                              " registered.\n",
                  name.ToCString(), Dart_GetMainPortId());
   }
   return PortMap::PostMessage(
@@ -232,7 +232,8 @@
   ASSERT(!list.IsNull());
   MessageWriter writer(false);
   if (FLAG_trace_service) {
-    OS::PrintErr("vm-service: Isolate %s %" Pd64 " deregistered.\n",
+    OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Isolate %s %" Pd64
+                                              " deregistered.\n",
                  name.ToCString(), Dart_GetMainPortId());
   }
   return PortMap::PostMessage(
@@ -244,7 +245,8 @@
     return;
   }
   if (FLAG_trace_service) {
-    OS::PrintErr("vm-service: sending service exit message.\n");
+    OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME
+                 ": sending service exit message.\n");
   }
 
   Dart_CObject code;
@@ -299,13 +301,22 @@
 
 void ServiceIsolate::FinishedExiting() {
   MonitorLocker ml(monitor_);
-  shutting_down_ = false;
+  ASSERT(state_ == kStarted || state_ == kStopping);
+  state_ = kStopped;
   ml.NotifyAll();
 }
 
 void ServiceIsolate::FinishedInitializing() {
   MonitorLocker ml(monitor_);
-  initializing_ = false;
+  ASSERT(state_ == kStarting);
+  state_ = kStarted;
+  ml.NotifyAll();
+}
+
+void ServiceIsolate::InitializingFailed() {
+  MonitorLocker ml(monitor_);
+  ASSERT(state_ == kStarting);
+  state_ = kStopped;
   ml.NotifyAll();
 }
 
@@ -331,11 +342,12 @@
                         NULL, &api_flags, NULL, &error));
     if (isolate == NULL) {
       if (FLAG_trace_service) {
-        OS::PrintErr("vm-service: Isolate creation error: %s\n", error);
+        OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME
+                     ": Isolate creation error: %s\n",
+                     error);
       }
       ServiceIsolate::SetServiceIsolate(NULL);
-      ServiceIsolate::FinishedInitializing();
-      ServiceIsolate::FinishedExiting();
+      ServiceIsolate::InitializingFailed();
       return;
     }
 
@@ -380,11 +392,13 @@
       Error& error = Error::Handle(Z);
       error = T->sticky_error();
       if (!error.IsNull() && !error.IsUnwindError()) {
-        OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString());
+        OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Error: %s\n",
+                     error.ToErrorCString());
       }
       error = I->sticky_error();
       if (!error.IsNull() && !error.IsUnwindError()) {
-        OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString());
+        OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Error: %s\n",
+                     error.ToErrorCString());
       }
       Dart::RunShutdownCallback();
     }
@@ -395,7 +409,7 @@
     // Shut the isolate down.
     Dart::ShutdownIsolate(I);
     if (FLAG_trace_service) {
-      OS::PrintErr("vm-service: Shutdown.\n");
+      OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Shutdown.\n");
     }
     ServiceIsolate::FinishedExiting();
   }
@@ -410,7 +424,8 @@
         Library::Handle(Z, I->object_store()->root_library());
     if (root_library.IsNull()) {
       if (FLAG_trace_service) {
-        OS::PrintErr("vm-service: Embedder did not install a script.");
+        OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME
+                     ": Embedder did not install a script.");
       }
       // Service isolate is not supported by embedder.
       return false;
@@ -423,7 +438,8 @@
     if (entry.IsNull()) {
       // Service isolate is not supported by embedder.
       if (FLAG_trace_service) {
-        OS::PrintErr("vm-service: Embedder did not provide a main function.");
+        OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME
+                     ": Embedder did not provide a main function.");
       }
       return false;
     }
@@ -435,7 +451,8 @@
       // Service isolate did not initialize properly.
       if (FLAG_trace_service) {
         const Error& error = Error::Cast(result);
-        OS::PrintErr("vm-service: Calling main resulted in an error: %s",
+        OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME
+                     ": Calling main resulted in an error: %s",
                      error.ToErrorCString());
       }
       if (result.IsUnwindError()) {
@@ -451,42 +468,65 @@
 };
 
 void ServiceIsolate::Run() {
+  {
+    MonitorLocker ml(monitor_);
+    ASSERT(state_ == kStopped);
+    state_ = kStarting;
+    ml.NotifyAll();
+  }
   // Grab the isolate create callback here to avoid race conditions with tests
   // that change this after Dart_Initialize returns.
   create_callback_ = Isolate::CreateCallback();
   if (create_callback_ == NULL) {
-    ServiceIsolate::FinishedInitializing();
+    ServiceIsolate::InitializingFailed();
     return;
   }
-  Dart::thread_pool()->Run(new RunServiceTask());
+  bool task_started = Dart::thread_pool()->Run(new RunServiceTask());
+  ASSERT(task_started);
 }
 
 void ServiceIsolate::KillServiceIsolate() {
   {
     MonitorLocker ml(monitor_);
-    shutting_down_ = true;
+    if (state_ == kStopped) {
+      return;
+    }
+    ASSERT(state_ == kStarted);
+    state_ = kStopping;
+    ml.NotifyAll();
   }
   Isolate::KillIfExists(isolate_, Isolate::kInternalKillMsg);
   {
     MonitorLocker ml(monitor_);
-    while (shutting_down_) {
+    while (state_ == kStopping) {
       ml.Wait();
     }
+    ASSERT(state_ == kStopped);
   }
 }
 
 void ServiceIsolate::Shutdown() {
+  {
+    MonitorLocker ml(monitor_);
+    while (state_ == kStarting) {
+      ml.Wait();
+    }
+  }
+
   if (IsRunning()) {
     {
       MonitorLocker ml(monitor_);
-      shutting_down_ = true;
+      ASSERT(state_ == kStarted);
+      state_ = kStopping;
+      ml.NotifyAll();
     }
     SendServiceExitMessage();
     {
       MonitorLocker ml(monitor_);
-      while (shutting_down_ && (port_ != ILLEGAL_PORT)) {
+      while (state_ == kStopping) {
         ml.Wait();
       }
+      ASSERT(state_ == kStopped);
     }
   } else {
     if (isolate_ != NULL) {
diff --git a/runtime/vm/service_isolate.h b/runtime/vm/service_isolate.h
index e6ecc405f..ab08649 100644
--- a/runtime/vm/service_isolate.h
+++ b/runtime/vm/service_isolate.h
@@ -63,6 +63,7 @@
   static void SetLoadPort(Dart_Port port);
   static void FinishedExiting();
   static void FinishedInitializing();
+  static void InitializingFailed();
   static void MaybeMakeServiceIsolate(Isolate* isolate);
   static Dart_IsolateCreateCallback create_callback() {
     return create_callback_;
@@ -70,8 +71,13 @@
 
   static Dart_IsolateCreateCallback create_callback_;
   static Monitor* monitor_;
-  static bool initializing_;
-  static bool shutting_down_;
+  enum State {
+    kStopped,
+    kStarting,
+    kStarted,
+    kStopping,
+  };
+  static State state_;
   static Isolate* isolate_;
   static Dart_Port port_;
   static Dart_Port load_port_;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 2af28ff..18839b45 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -1220,9 +1220,9 @@
                            const Array& arguments,
                            Thread* thread) {
   // Interpreter state (see constants_dbc.h for high-level overview).
-  uint32_t* pc;       // Program Counter: points to the next op to execute.
-  RawObject** FP;     // Frame Pointer.
-  RawObject** SP;     // Stack Pointer.
+  uint32_t* pc;    // Program Counter: points to the next op to execute.
+  RawObject** FP;  // Frame Pointer.
+  RawObject** SP;  // Stack Pointer.
 
   uint32_t op;  // Currently executing op.
   uint16_t rA;  // A component of the currently executing op.
@@ -1471,7 +1471,9 @@
 
   {
     BYTECODE(DebugStep, A);
-#ifndef PRODUCT
+#ifdef PRODUCT
+    FATAL("No debugging in PRODUCT mode");
+#else
     if (thread->isolate()->single_step()) {
       Exit(thread, FP, SP + 1, pc);
       NativeArguments args(thread, 0, NULL, NULL);
@@ -1483,7 +1485,9 @@
 
   {
     BYTECODE(DebugBreak, A);
-#if !defined(PRODUCT)
+#ifdef PRODUCT
+    FATAL("No debugging in PRODUCT mode");
+#else
     {
       const uint32_t original_bc =
           static_cast<uint32_t>(reinterpret_cast<uintptr_t>(
@@ -1496,9 +1500,6 @@
       INVOKE_RUNTIME(DRT_BreakpointRuntimeHandler, args)
       DISPATCH_OP(original_bc);
     }
-#else
-    // There should be no debug breaks in product mode.
-    UNREACHABLE();
 #endif
     DISPATCH();
   }
@@ -3025,6 +3026,14 @@
   }
 
   {
+    BYTECODE(NullError, 0);
+    Exit(thread, FP, SP, pc);
+    NativeArguments native_args(thread, 0, SP, SP);
+    INVOKE_RUNTIME(DRT_NullError, native_args);
+    UNREACHABLE();
+  }
+
+  {
     BYTECODE(BadTypeError, 0);
     // Stack: instance, instantiator type args, function type args, type, name
     RawObject** args = SP - 4;
@@ -3655,6 +3664,22 @@
   }
 
   {
+    BYTECODE(IfEqNullTOS, 0);
+    if (SP[0] != null_value) {
+      pc++;
+    }
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(IfNeNullTOS, 0);
+    if (SP[0] == null_value) {
+      pc++;
+    }
+    DISPATCH();
+  }
+
+  {
     BYTECODE(Jump, 0);
     const int32_t target = static_cast<int32_t>(op) >> 8;
     pc += (target - 1);
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 9061c99..6cf4754 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -93,6 +93,7 @@
     case RawFunction::kClosureFunction:
     case RawFunction::kImplicitClosureFunction:
     case RawFunction::kImplicitStaticFinalGetter:
+    case RawFunction::kStaticFieldInitializer:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction:
     case RawFunction::kConstructor:
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index ae8edb8..b1d4b79 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -387,8 +387,17 @@
 #if !defined(TARGET_ARCH_DBC)
   // For normal unoptimized Dart frames and Stub frames each slot
   // between the first and last included are tagged objects.
-  RawObject** first = reinterpret_cast<RawObject**>(
-      is_interpreted() ? fp() + (kKBCFirstObjectSlotFromFp * kWordSize) : sp());
+  if (is_interpreted()) {
+    // Do not visit caller's pc or caller's fp.
+    RawObject** first =
+        reinterpret_cast<RawObject**>(fp()) + kKBCFirstObjectSlotFromFp;
+    RawObject** last =
+        reinterpret_cast<RawObject**>(fp()) + kKBCLastFixedObjectSlotFromFp;
+
+    visitor->VisitPointers(first, last);
+  }
+  RawObject** first =
+      reinterpret_cast<RawObject**>(is_interpreted() ? fp() : sp());
   RawObject** last = reinterpret_cast<RawObject**>(
       is_interpreted()
           ? sp()
diff --git a/runtime/vm/stack_frame_kbc.h b/runtime/vm/stack_frame_kbc.h
index 8bfe809..3418eaa 100644
--- a/runtime/vm/stack_frame_kbc.h
+++ b/runtime/vm/stack_frame_kbc.h
@@ -22,8 +22,8 @@
 Current frame  | ...               T| <- SP of current frame
                | ...               T|
                | first local       T| <- FP of current frame
-               | caller's FP       *|
-               | caller's PC       *|
+               | caller's FP        |
+               | caller's PC        |
                | code object       T|    (current frame's code object)
                | function object   T|    (current frame's function object)
                +--------------------+
@@ -31,8 +31,6 @@
                |  ...               |
 
                T against a slot indicates it needs to be traversed during GC.
-               * against a slot indicates that it can be traversed during GC
-                 because it will look like a smi to the visitor.
 */
 
 static const int kKBCDartFrameFixedSize = 4;  // Function, Code, PC, FP
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index ce9d729..602ec4d 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -75,7 +75,9 @@
   V(StackOverflowSharedWithFPURegs)                                            \
   V(StackOverflowSharedWithoutFPURegs)                                         \
   V(OneArgCheckInlineCacheWithExactnessCheck)                                  \
-  V(OneArgOptimizedCheckInlineCacheWithExactnessCheck)
+  V(OneArgOptimizedCheckInlineCacheWithExactnessCheck)                         \
+  V(EnterSafepoint)                                                            \
+  V(ExitSafepoint)
 
 #else
 #define VM_STUB_CODE_LIST(V)                                                   \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 8ea5953..e4b6658 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -76,6 +76,8 @@
       active_stacktrace_(Object::null()),
       global_object_pool_(ObjectPool::null()),
       resume_pc_(0),
+      execution_state_(kThreadInNative),
+      safepoint_state_(0),
       task_kind_(kUnknownTask),
       dart_stream_(NULL),
       thread_lock_(new Monitor()),
@@ -97,10 +99,9 @@
       pending_functions_(GrowableObjectArray::null()),
       sticky_error_(Error::null()),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
-          REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) safepoint_state_(0),
-      execution_state_(kThreadInNative),
+          REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
 #if defined(USING_SAFE_STACK)
-      saved_safestack_limit_(0),
+              saved_safestack_limit_(0),
 #endif
 #if !defined(DART_PRECOMPILED_RUNTIME)
       interpreter_(nullptr),
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 5e771b0..f5b7c97 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -121,7 +121,9 @@
     StubCode::DeoptimizeLazyFromThrow().raw(), NULL)                           \
   V(RawCode*, slow_type_test_stub_, StubCode::SlowTypeTest().raw(), NULL)      \
   V(RawCode*, lazy_specialize_type_test_stub_,                                 \
-    StubCode::LazySpecializeTypeTest().raw(), NULL)
+    StubCode::LazySpecializeTypeTest().raw(), NULL)                            \
+  V(RawCode*, enter_safepoint_stub_, StubCode::EnterSafepoint().raw(), NULL)   \
+  V(RawCode*, exit_safepoint_stub_, StubCode::ExitSafepoint().raw(), NULL)
 
 #endif
 
@@ -307,6 +309,10 @@
   }
 #endif
 
+  static intptr_t safepoint_state_offset() {
+    return OFFSET_OF(Thread, safepoint_state_);
+  }
+
   TaskKind task_kind() const { return task_kind_; }
 
   // Retrieves and clears the stack overflow flags.  These are set by
@@ -673,8 +679,8 @@
     do {
       old_state = safepoint_state_;
       new_state = SafepointRequestedField::update(value, old_state);
-    } while (AtomicOperations::CompareAndSwapUint32(
-                 &safepoint_state_, old_state, new_state) != old_state);
+    } while (AtomicOperations::CompareAndSwapWord(&safepoint_state_, old_state,
+                                                  new_state) != old_state);
     return old_state;
   }
   static bool IsBlockedForSafepoint(uint32_t state) {
@@ -706,7 +712,10 @@
     return static_cast<ExecutionState>(execution_state_);
   }
   void set_execution_state(ExecutionState state) {
-    execution_state_ = static_cast<uint32_t>(state);
+    execution_state_ = static_cast<uword>(state);
+  }
+  static intptr_t execution_state_offset() {
+    return OFFSET_OF(Thread, execution_state_);
   }
 
   virtual bool MayAllocateHandles() {
@@ -714,10 +723,13 @@
            (execution_state() == kThreadInGenerated);
   }
 
+  static uword safepoint_state_unacquired() { return SetAtSafepoint(false, 0); }
+  static uword safepoint_state_acquired() { return SetAtSafepoint(true, 0); }
+
   bool TryEnterSafepoint() {
     uint32_t new_state = SetAtSafepoint(true, 0);
-    if (AtomicOperations::CompareAndSwapUint32(&safepoint_state_, 0,
-                                               new_state) != 0) {
+    if (AtomicOperations::CompareAndSwapWord(&safepoint_state_, 0, new_state) !=
+        0) {
       return false;
     }
     return true;
@@ -735,8 +747,8 @@
 
   bool TryExitSafepoint() {
     uint32_t old_state = SetAtSafepoint(true, 0);
-    if (AtomicOperations::CompareAndSwapUint32(&safepoint_state_, old_state,
-                                               0) != old_state) {
+    if (AtomicOperations::CompareAndSwapWord(&safepoint_state_, old_state, 0) !=
+        old_state) {
       return false;
     }
     return true;
@@ -838,6 +850,8 @@
   RawObject* active_stacktrace_;
   RawObjectPool* global_object_pool_;
   uword resume_pc_;
+  uword execution_state_;
+  uword safepoint_state_;
 
   // ---- End accessed from generated code. ----
 
@@ -889,8 +903,6 @@
   class SafepointRequestedField : public BitField<uint32_t, bool, 1, 1> {};
   class BlockedForSafepointField : public BitField<uint32_t, bool, 2, 1> {};
   class BypassSafepointsField : public BitField<uint32_t, bool, 3, 1> {};
-  uint32_t safepoint_state_;
-  uint32_t execution_state_;
 
 #if defined(USING_SAFE_STACK)
   uword saved_safestack_limit_;
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index ebb07bd..a7becbe 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -116,6 +116,10 @@
 
 // Delay between interrupts.
 void ThreadInterrupter::SetInterruptPeriod(intptr_t period) {
+  if (!initialized_) {
+    // Profiler may not be enabled.
+    return;
+  }
   MonitorLocker ml(monitor_);
   if (shutdown_) {
     return;
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index b627ddf..3f934fd 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -77,16 +77,20 @@
                         uword alignment,
                         uword vmar_base,
                         uword padded_size) {
+  // Allocate a larger mapping than needed in order to find a suitable aligned
+  // mapping within it.
   uword base;
   zx_status_t status =
       zx_vmar_map(vmar, options, 0, vmo, 0u, padded_size, &base);
   LOG_INFO("zx_vmar_map(%u, 0x%lx, 0x%lx)\n", options, base, padded_size);
-
   if (status != ZX_OK) {
     LOG_ERR("zx_vmar_map(%u, 0x%lx, 0x%lx) failed: %s\n", options, base,
             padded_size, zx_status_get_string(status));
     return NULL;
   }
+
+  // Allocate a smaller aligned mapping inside the larger mapping.
+  const uword orig_base = base;
   const uword aligned_base = Utils::RoundUp(base, alignment);
   const zx_vm_option_t overwrite_options = options | ZX_VM_SPECIFIC_OVERWRITE;
   status = zx_vmar_map(vmar, overwrite_options, aligned_base - vmar_base, vmo,
@@ -100,6 +104,11 @@
     return NULL;
   }
   ASSERT(base == aligned_base);
+
+  // Unmap the unused prefix and suffix.
+  Unmap(vmar, orig_base, base);
+  Unmap(vmar, base + size, orig_base + padded_size);
+
   return reinterpret_cast<void*>(base);
 }
 
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index f4aa3ef..586cc38 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -42,6 +42,7 @@
   "code_patcher_x64.cc",
   "compilation_trace.cc",
   "compilation_trace.h",
+  "constants_arm.cc",
   "constants_arm.h",
   "constants_arm64.cc",
   "constants_arm64.h",
diff --git a/samples/sample_extension/sample_extension.cc b/samples/sample_extension/sample_extension.cc
index 5af3f74..f183d36 100644
--- a/samples/sample_extension/sample_extension.cc
+++ b/samples/sample_extension/sample_extension.cc
@@ -102,7 +102,11 @@
         result.value.as_typed_data.type = Dart_TypedData_kUint8;
         result.value.as_typed_data.values = values;
         result.value.as_typed_data.length = length;
-        Dart_PostCObject(reply_port_id, &result);
+        if (Dart_PostCObject(reply_port_id, &result)) {
+          Dart_CObject error;
+          error.type = Dart_CObject_kNull;
+          Dart_PostCObject(reply_port_id, &error);
+        }
         free(values);
         // It is OK that result is destroyed when function exits.
         // Dart_PostCObject has copied its data.
@@ -110,9 +114,8 @@
       }
     }
   }
-  Dart_CObject result;
-  result.type = Dart_CObject_kNull;
-  Dart_PostCObject(reply_port_id, &result);
+  fprintf(stderr, "Invalid message received, cannot proceed. Aborting the process.\n");
+  abort();
 }
 
 
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index 44a9352..e637ca2 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -170,6 +170,14 @@
 Language/Expressions/Shift/equivalent_super_t02: Skip # triple-shift flag
 Language/Expressions/Shift/equivalent_t02: Skip # triple-shift flag
 Language/Expressions/Shift/integer_t03: Skip # triple-shift flag
+Language/Expressions/Shift/integer_t04/01: Crash
+Language/Expressions/Shift/integer_t04/02: Crash
+Language/Expressions/Shift/integer_t04/03: Crash
+Language/Expressions/Shift/integer_t04/04: Crash
+Language/Expressions/Shift/integer_t04/05: Crash
+Language/Expressions/Shift/integer_t04/06: Crash
+Language/Expressions/Shift/integer_t04/07: Crash
+Language/Expressions/Shift/integer_t04/none: Crash
 Language/Expressions/Shift/syntax_t01: Skip # triple-shift experiment flag
 Language/Expressions/Shift/syntax_t15: Skip # triple-shift experiment flag
 Language/Expressions/Shift/syntax_t17: Skip # triple-shift experiment flag
@@ -283,11 +291,19 @@
 LanguageFeatures/Constant-update-2018/NewOperators_A01_t06/03: Crash
 LanguageFeatures/Constant-update-2018/NewOperators_A01_t06/04: Crash
 LanguageFeatures/Constant-update-2018/NewOperators_A01_t06/05: Crash
-LanguageFeatures/Constant-update-2018/TypeTestOperator_A01_t01: CompileTimeError
-LanguageFeatures/Control-flow-collections/type_inference_A09_t01: Crash
-LanguageFeatures/Control-flow-collections/type_inference_A11_t01: CompileTimeError
-LanguageFeatures/Control-flow-collections/type_inference_A13_t01: CompileTimeError
-LanguageFeatures/Control-flow-collections/type_inference_A13_t02: CompileTimeError
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/01: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/02: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/03: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/04: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/05: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/06: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t07/none: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t08/01: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t08/02: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t08/03: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t08/04: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t08/05: Crash
+LanguageFeatures/Constant-update-2018/NewOperators_A01_t08/none: Crash
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t01: Crash
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t02: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t03: Crash
@@ -563,6 +579,8 @@
 LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t04/01: MissingCompileTimeError
 LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t04/02: MissingCompileTimeError
 LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t10: CompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A09_t09/04: MissingCompileTimeError
+LanguageFeatures/Spread-collections/ConstSpreads_A10_t09/04: MissingCompileTimeError
 LanguageFeatures/Spread-collections/TypeInference_A01_t03/06: MissingCompileTimeError
 LanguageFeatures/Spread-collections/TypeInference_A01_t03/07: MissingCompileTimeError
 LanguageFeatures/Spread-collections/TypeInference_A01_t03/08: MissingCompileTimeError
diff --git a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
new file mode 100644
index 0000000..75fa653
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class I1 {}
+
+class I2 {}
+
+class A implements I1, I2 {}
+
+class B implements I1, I2 {}
+
+/*element: foo:params=1*/
+@pragma('dart2js:noInline')
+void foo(I1 x) {}
+
+/*element: bar:params=1*/
+@pragma('dart2js:noInline')
+void bar(I2 x) {}
+
+/*strong.element: main:calls=[call$1(new F.A()),call$1(new F.B()),foo(1),foo(1),main__bar$closure(0),main__bar$closure(0)],params=0*/
+/*omit.element: main:calls=[call$1(new F.A()),call$1(new F.B()),foo(1),foo(1),main__bar$closure(0),main__bar$closure(0)],params=0*/
+/*strongConst.element: main:calls=[bar(1),bar(1),foo(1),foo(1)],params=0*/
+/*omitConst.element: main:calls=[bar(1),bar(1),foo(1),foo(1)],params=0*/
+main() {
+  dynamic f = bar;
+
+  foo(new A());
+  foo(new B());
+  f(new A());
+  f(new B());
+}
diff --git a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
index 8a1f1ec..52f93c0 100644
--- a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
@@ -99,11 +99,11 @@
     const ConstantData(
         'const {0: 1, 2: 3}',
         'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
-        'IntConstant(2): IntConstant(3)})'),
+            'IntConstant(2): IntConstant(3)})'),
     const ConstantData(
         'const <int, int>{0: 1, 2: 3}',
         'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
-        'IntConstant(2): IntConstant(3)})'),
+            'IntConstant(2): IntConstant(3)})'),
     const ConstantData('const <int, int>{0: 1, 0: 2}', 'NonConstant',
         expectedErrors: 'ConstEvalDuplicateKey'),
     const ConstantData(
@@ -155,36 +155,36 @@
     const ConstantData(
         'const C()',
         'ConstructedConstant(C(field1=IntConstant(42),'
-        'field2=BoolConstant(false)))'),
+            'field2=BoolConstant(false)))'),
     const ConstantData(
         'const C(field1: 87)',
         'ConstructedConstant(C(field1=IntConstant(87),'
-        'field2=BoolConstant(false)))'),
+            'field2=BoolConstant(false)))'),
     const ConstantData(
         'const C(field2: true)',
         'ConstructedConstant(C(field1=IntConstant(42),'
-        'field2=BoolConstant(true)))'),
+            'field2=BoolConstant(true)))'),
     const ConstantData(
         'const C.named()',
         'ConstructedConstant(C(field1=BoolConstant(false),'
-        'field2=BoolConstant(false)))'),
+            'field2=BoolConstant(false)))'),
     const ConstantData(
         'const C.named(87)',
         'ConstructedConstant(C(field1=IntConstant(87),'
-        'field2=IntConstant(87)))'),
+            'field2=IntConstant(87)))'),
     const ConstantData(
         'const C(field1: a, field2: b)', const <Map<String, String>, String>{
       const {}: 'ConstructedConstant(C(field1=BoolConstant(true),'
           'field2=IntConstant(42)))',
       const {'foo': 'false', 'bar': '87'}:
           'ConstructedConstant(C(field1=BoolConstant(false),'
-          'field2=IntConstant(87)))',
+              'field2=IntConstant(87)))',
     }),
     const ConstantData(
         'const D(42, 87)',
         'ConstructedConstant(D(field1=IntConstant(87),'
-        'field2=IntConstant(42),'
-        'field3=IntConstant(99)))'),
+            'field2=IntConstant(42),'
+            'field3=IntConstant(99)))'),
   ]),
   const TestData('redirect', '''
 class A<T> implements B<Null> {
@@ -252,19 +252,19 @@
     const ConstantData(
         'const A.named(99, 100)',
         'ConstructedConstant(A('
-        't=IntConstant(100),'
-        'u=IntConstant(42),'
-        'x=IntConstant(3),'
-        'y=IntConstant(499),'
-        'z=IntConstant(99)))'),
+            't=IntConstant(100),'
+            'u=IntConstant(42),'
+            'x=IntConstant(3),'
+            'y=IntConstant(499),'
+            'z=IntConstant(99)))'),
     const ConstantData(
         'const A(99, 100)',
         'ConstructedConstant(A('
-        't=IntConstant(100),'
-        'u=IntConstant(42),'
-        'x=IntConstant(3),'
-        'y=IntConstant(499),'
-        'z=IntConstant(99)))'),
+            't=IntConstant(100),'
+            'u=IntConstant(42),'
+            'x=IntConstant(3),'
+            'y=IntConstant(499),'
+            'z=IntConstant(99)))'),
   ]),
   const TestData('errors', r'''
  const dynamic null_ = const bool.fromEnvironment('x') ? null : null;
@@ -441,13 +441,13 @@
     const ConstantData(
         'const C<int>(0, identity)',
         'ConstructedConstant(C<int>(defaultValue=IntConstant(0),'
-        'identityFunction=InstantiationConstant([int],'
-        'FunctionConstant(identity))))'),
+            'identityFunction=InstantiationConstant([int],'
+            'FunctionConstant(identity))))'),
     const ConstantData(
         'const C<double>(0.5, identity)',
         'ConstructedConstant(C<double>(defaultValue=DoubleConstant(0.5),'
-        'identityFunction=InstantiationConstant([double],'
-        'FunctionConstant(identity))))'),
+            'identityFunction=InstantiationConstant([double],'
+            'FunctionConstant(identity))))'),
   ]),
   const TestData('generic class', '''
 class C<T> {
@@ -508,7 +508,6 @@
     CompilationResult result = await runCompiler(memorySourceFiles: {
       'main.dart': source
     }, options: [
-      '${Flags.enableLanguageExperiments}=constant-update-2018',
       Flags.enableAsserts,
     ]);
     Compiler compiler = result.compiler;
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
deleted file mode 100644
index fafdcbb..0000000
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ /dev/null
@@ -1,685 +0,0 @@
-// 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.
-
-library dart2js.constants.expressions.evaluate_test;
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/common.dart';
-import 'package:compiler/src/common_elements.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/constants/constructors.dart';
-import 'package:compiler/src/constants/evaluation.dart';
-import 'package:compiler/src/constants/expressions.dart';
-import 'package:compiler/src/constants/values.dart';
-import 'package:compiler/src/diagnostics/messages.dart';
-import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/elements/types.dart';
-import 'package:compiler/src/kernel/kernel_strategy.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
-import '../helpers/memory_compiler.dart';
-
-class TestData {
-  final String name;
-
-  /// Declarations needed for the [constants].
-  final String declarations;
-
-  /// Tested constants.
-  final List<ConstantData> constants;
-
-  const TestData(this.name, this.declarations, this.constants);
-}
-
-class ConstantData {
-  /// Source code for the constant expression.
-  final String code;
-
-  /// Constant value as structured text for the empty environment or a map from
-  /// environment to either the expected constant value as structured text or
-  /// a [ConstantResult].
-  final expectedResults;
-
-  /// A [MessageKind] or a list of [MessageKind]s containing the error messages
-  /// expected as the result of evaluating the constant under the empty
-  /// environment.
-  final expectedErrors;
-
-  const ConstantData(this.code, this.expectedResults, {this.expectedErrors});
-}
-
-class EvaluationError {
-  final MessageKind kind;
-  final Map arguments;
-
-  EvaluationError(this.kind, this.arguments);
-}
-
-class MemoryEnvironment implements EvaluationEnvironment {
-  final EvaluationEnvironment _environment;
-  final Map<String, String> env;
-  final List<EvaluationError> errors = <EvaluationError>[];
-
-  MemoryEnvironment(this._environment, [this.env = const <String, String>{}]);
-
-  @override
-  bool get checkCasts => true;
-
-  @override
-  String readFromEnvironment(String name) => env[name];
-
-  @override
-  InterfaceType substByContext(InterfaceType base, InterfaceType target) {
-    return _environment.substByContext(base, target);
-  }
-
-  @override
-  DartType getTypeInContext(DartType type) =>
-      _environment.getTypeInContext(type);
-
-  @override
-  ConstantConstructor getConstructorConstant(ConstructorEntity constructor) {
-    return _environment.getConstructorConstant(constructor);
-  }
-
-  @override
-  ConstantExpression getFieldConstant(FieldEntity field) {
-    return _environment.getFieldConstant(field);
-  }
-
-  @override
-  ConstantExpression getLocalConstant(Local local) {
-    return _environment.getLocalConstant(local);
-  }
-
-  @override
-  CommonElements get commonElements => _environment.commonElements;
-
-  @override
-  DartTypes get types => _environment.types;
-
-  @override
-  InterfaceType get enclosingConstructedType =>
-      _environment.enclosingConstructedType;
-
-  @override
-  void reportWarning(
-      ConstantExpression expression, MessageKind kind, Map arguments) {
-    errors.add(new EvaluationError(kind, arguments));
-    _environment.reportWarning(expression, kind, arguments);
-  }
-
-  @override
-  void reportError(
-      ConstantExpression expression, MessageKind kind, Map arguments) {
-    errors.add(new EvaluationError(kind, arguments));
-    _environment.reportError(expression, kind, arguments);
-  }
-
-  @override
-  ConstantValue evaluateConstructor(ConstructorEntity constructor,
-      InterfaceType type, ConstantValue evaluate()) {
-    return _environment.evaluateConstructor(constructor, type, evaluate);
-  }
-
-  @override
-  ConstantValue evaluateField(FieldEntity field, ConstantValue evaluate()) {
-    return _environment.evaluateField(field, evaluate);
-  }
-
-  @override
-  ConstantValue evaluateMapBody(ConstantValue evaluate()) {
-    return _environment.evaluateMapBody(evaluate);
-  }
-
-  @override
-  bool get enableAssertions => true;
-}
-
-const List<TestData> DATA = const [
-  const TestData('simple', '', const [
-    const ConstantData('null', 'NullConstant'),
-    const ConstantData('false', 'BoolConstant(false)'),
-    const ConstantData('true', 'BoolConstant(true)'),
-    const ConstantData('0', 'IntConstant(0)'),
-    const ConstantData('0.0', 'IntConstant(0)'),
-    const ConstantData('"foo"', 'StringConstant("foo")'),
-    const ConstantData('1 + 2', 'IntConstant(3)'),
-    const ConstantData('-(1)', 'IntConstant(-1)'),
-    const ConstantData('1 == 2', 'BoolConstant(false)'),
-    const ConstantData('1 != 2', 'BoolConstant(true)'),
-    const ConstantData('1 / 0', 'DoubleConstant(Infinity)'),
-    const ConstantData('0 / 0', 'DoubleConstant(NaN)'),
-    const ConstantData('1 << 0', 'IntConstant(1)'),
-    const ConstantData('1 >> 0', 'IntConstant(1)'),
-    const ConstantData('"foo".length', 'IntConstant(3)'),
-    const ConstantData('identical(0, 1)', 'BoolConstant(false)'),
-    const ConstantData('"a" "b"', 'StringConstant("ab")'),
-    const ConstantData(r'"${null}"', 'StringConstant("null")'),
-    const ConstantData('identical', 'FunctionConstant(identical)'),
-    const ConstantData('true ? 0 : 1', 'IntConstant(0)'),
-    const ConstantData('proxy', 'ConstructedConstant(_Proxy())'),
-    const ConstantData('const [] == null', 'BoolConstant(false)'),
-    const ConstantData('proxy == null', 'BoolConstant(false)'),
-    const ConstantData('Object', 'TypeConstant(Object)'),
-    const ConstantData('null ?? 0', 'IntConstant(0)'),
-    const ConstantData(
-        'const [0, 1]', 'ListConstant(<int>[IntConstant(0), IntConstant(1)])'),
-    const ConstantData('const <int>[0, 1]',
-        'ListConstant(<int>[IntConstant(0), IntConstant(1)])'),
-    const ConstantData(
-        'const {0: 1, 2: 3}',
-        'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
-        'IntConstant(2): IntConstant(3)})'),
-    const ConstantData(
-        'const <int, int>{0: 1, 2: 3}',
-        'MapConstant(<int, int>{IntConstant(0): IntConstant(1), '
-        'IntConstant(2): IntConstant(3)})'),
-    const ConstantData('const <int, int>{0: 1, 0: 2}',
-        'MapConstant(<int, int>{IntConstant(0): IntConstant(2)})',
-        expectedErrors: MessageKind.EQUAL_MAP_ENTRY_KEY),
-    const ConstantData(
-        'const bool.fromEnvironment("foo", defaultValue: false)',
-        const <Map<String, String>, String>{
-          const {}: 'BoolConstant(false)',
-          const {'foo': 'true'}: 'BoolConstant(true)'
-        }),
-    const ConstantData(
-        'const int.fromEnvironment("foo", defaultValue: 42)',
-        const <Map<String, String>, String>{
-          const {}: 'IntConstant(42)',
-          const {'foo': '87'}: 'IntConstant(87)'
-        }),
-    const ConstantData(
-        'const String.fromEnvironment("foo", defaultValue: "bar")',
-        const <Map<String, String>, String>{
-          const {}: 'StringConstant("bar")',
-          const {'foo': 'foo'}: 'StringConstant("foo")'
-        }),
-  ]),
-  const TestData('env', '''
-const a = const bool.fromEnvironment("foo", defaultValue: true);
-const b = const int.fromEnvironment("bar", defaultValue: 42);
-
-class A {
-  const A();
-}
-class B {
-  final field1;
-  const B(this.field1);
-}
-class C extends B {
-  final field2;
-  const C({field1: 42, this.field2: false}) : super(field1);
-  const C.named([field = false]) : this(field1: field, field2: field);
-}
-class D extends C {
-  final field3 = 99;
-  const D(a, b) : super(field2: a, field1: b);
-}
-''', const [
-    const ConstantData('const Object()', 'ConstructedConstant(Object())'),
-    const ConstantData('const A()', 'ConstructedConstant(A())'),
-    const ConstantData(
-        'const B(0)', 'ConstructedConstant(B(field1=IntConstant(0)))'),
-    const ConstantData('const B(const A())',
-        'ConstructedConstant(B(field1=ConstructedConstant(A())))'),
-    const ConstantData(
-        'const C()',
-        'ConstructedConstant(C(field1=IntConstant(42),'
-        'field2=BoolConstant(false)))'),
-    const ConstantData(
-        'const C(field1: 87)',
-        'ConstructedConstant(C(field1=IntConstant(87),'
-        'field2=BoolConstant(false)))'),
-    const ConstantData(
-        'const C(field2: true)',
-        'ConstructedConstant(C(field1=IntConstant(42),'
-        'field2=BoolConstant(true)))'),
-    const ConstantData(
-        'const C.named()',
-        'ConstructedConstant(C(field1=BoolConstant(false),'
-        'field2=BoolConstant(false)))'),
-    const ConstantData(
-        'const C.named(87)',
-        'ConstructedConstant(C(field1=IntConstant(87),'
-        'field2=IntConstant(87)))'),
-    const ConstantData(
-        'const C(field1: a, field2: b)', const <Map<String, String>, String>{
-      const {}: 'ConstructedConstant(C(field1=BoolConstant(true),'
-          'field2=IntConstant(42)))',
-      const {'foo': 'false', 'bar': '87'}:
-          'ConstructedConstant(C(field1=BoolConstant(false),'
-          'field2=IntConstant(87)))',
-    }),
-    const ConstantData(
-        'const D(42, 87)',
-        'ConstructedConstant(D(field1=IntConstant(87),'
-        'field2=IntConstant(42),'
-        'field3=IntConstant(99)))'),
-  ]),
-  const TestData('redirect', '''
-class A<T> implements B<Null> {
-  final field1;
-  const A({this.field1:42});
-}
-class B<S> implements C<Null> {
-  const factory B({field1}) = A<B<S>>;
-  const factory B.named() = A<S>;
-}
-class C<U> {
-  const factory C({field1}) = A<B<double>>;
-}
-''', const [
-    const ConstantData(
-        'const A()', 'ConstructedConstant(A<dynamic>(field1=IntConstant(42)))'),
-    const ConstantData('const A<int>(field1: 87)',
-        'ConstructedConstant(A<int>(field1=IntConstant(87)))'),
-    const ConstantData('const B()',
-        'ConstructedConstant(A<B<dynamic>>(field1=IntConstant(42)))'),
-    const ConstantData('const B<int>()',
-        'ConstructedConstant(A<B<int>>(field1=IntConstant(42)))'),
-    const ConstantData('const B<int>(field1: 87)',
-        'ConstructedConstant(A<B<int>>(field1=IntConstant(87)))'),
-    const ConstantData('const C<int>(field1: 87)',
-        'ConstructedConstant(A<B<double>>(field1=IntConstant(87)))'),
-    const ConstantData('const B<int>.named()',
-        'ConstructedConstant(A<int>(field1=IntConstant(42)))'),
-  ]),
-  const TestData('env2', '''
-const c = const int.fromEnvironment("foo", defaultValue: 5);
-const d = const int.fromEnvironment("bar", defaultValue: 10);
-
-class A {
-  final field;
-  const A(a, b) : field = a + b;
-}
-
-class B extends A {
-  const B(a) : super(a, a * 2);
-}
-''', const [
-    const ConstantData('const A(c, d)', const <Map<String, String>, String>{
-      const {}: 'ConstructedConstant(A(field=IntConstant(15)))',
-      const {'foo': '7', 'bar': '11'}:
-          'ConstructedConstant(A(field=IntConstant(18)))',
-    }),
-    const ConstantData('const B(d)', const <Map<String, String>, String>{
-      const {}: 'ConstructedConstant(B(field=IntConstant(30)))',
-      const {'bar': '42'}: 'ConstructedConstant(B(field=IntConstant(126)))',
-    }),
-  ]),
-  const TestData('construct', '''
- class A {
-   final x;
-   final y;
-   final z;
-   final t;
-   final u = 42;
-   const A(this.z, tt) : y = 499, t = tt, x = 3;
-   const A.named(z, this.t) : y = 400 + z, this.z = z, x = 3;
-   const A.named2(t, z, y, x) : x = t, y = z, z = y, t = x;
- }
- ''', const [
-    const ConstantData(
-        'const A.named(99, 100)',
-        'ConstructedConstant(A('
-        't=IntConstant(100),'
-        'u=IntConstant(42),'
-        'x=IntConstant(3),'
-        'y=IntConstant(499),'
-        'z=IntConstant(99)))'),
-    const ConstantData(
-        'const A(99, 100)',
-        'ConstructedConstant(A('
-        't=IntConstant(100),'
-        'u=IntConstant(42),'
-        'x=IntConstant(3),'
-        'y=IntConstant(499),'
-        'z=IntConstant(99)))'),
-  ]),
-  const TestData('errors', r'''
- const integer = const int.fromEnvironment("foo", defaultValue: 5);
- const string = const String.fromEnvironment("bar", defaultValue: "baz");
- const boolean = const bool.fromEnvironment("baz", defaultValue: false);
- const not_string =
-    const bool.fromEnvironment("not_string", defaultValue: false) ? '' : 0;
- get getter => 0;
- class Class1 {
-    final field;
-    const Class1() : field = not_string.length;
- }
- class Class2 implements Class3 {
-    const Class2() : assert(false);
-    const Class2.redirect() : this();
- }
- class Class3 {
-    const Class3() : assert(false, "Message");
-    const factory Class3.fact() = Class2;
- }
- class Class4 extends Class2 {
-    const Class4();
- }
- class Class5 {
-    const Class5(a) : assert(a > 0, "$a <= 0");
- }
- class Class6 extends Class5 {
-    const Class6(a) : super(a - 1);
- }
- class Class7 {
-    const Class7();
- }
- ''', const [
-    const ConstantData(
-        r'"$integer $string $boolean"', 'StringConstant("5 baz false")'),
-    const ConstantData('0 ? true : false', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_CONDITIONAL_TYPE),
-    const ConstantData('integer ? true : false', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_CONDITIONAL_TYPE),
-    const ConstantData(r'"${const []}"', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE),
-    const ConstantData(r'"${proxy}"', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE),
-    const ConstantData(r'"${proxy}${const []}"', 'NonConstant',
-        expectedErrors: const [
-          MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE,
-          MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE
-        ]),
-    const ConstantData(r'"${"${proxy}"}${const []}"', 'NonConstant',
-        expectedErrors: const [
-          MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE,
-          MessageKind.INVALID_CONSTANT_INTERPOLATION_TYPE
-        ]),
-    const ConstantData('0 + ""', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE),
-    const ConstantData('0 + string', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_NUM_ADD_TYPE),
-    const ConstantData('"" + 0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE),
-    const ConstantData('string + 0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE),
-    const ConstantData('true + ""', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE),
-    const ConstantData('boolean + string', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_STRING_ADD_TYPE),
-    const ConstantData('true + false', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_ADD_TYPES),
-    const ConstantData('boolean + false', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_ADD_TYPES),
-    const ConstantData('0 * ""', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE),
-    const ConstantData('0 * string', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE),
-    const ConstantData('0 % ""', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE),
-    const ConstantData('0 % string', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_NUM_TYPE),
-    const ConstantData('0 << ""', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE),
-    const ConstantData('0 << string', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_BINARY_INT_TYPE),
-    const ConstantData('1 ~/ 0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
-    const ConstantData('1 ~/ 0.0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
-    const ConstantData('1 % 0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
-    const ConstantData('1 % 0.0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_DIV),
-    const ConstantData('1 << -1', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_SHIFT),
-    const ConstantData('1 >> -1', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_SHIFT),
-    const ConstantData('null[0]', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_INDEX),
-    const ConstantData('const bool.fromEnvironment(0)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE),
-    const ConstantData('const bool.fromEnvironment(integer)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE),
-    const ConstantData(
-        'const bool.fromEnvironment("baz", defaultValue: 0)', 'NonConstant',
-        expectedErrors:
-            MessageKind.INVALID_BOOL_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE),
-    const ConstantData(
-        'const bool.fromEnvironment("baz", defaultValue: integer)',
-        'NonConstant',
-        expectedErrors:
-            MessageKind.INVALID_BOOL_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE),
-    const ConstantData('const int.fromEnvironment(0)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE),
-    const ConstantData('const int.fromEnvironment(integer)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE),
-    const ConstantData(
-        'const int.fromEnvironment("baz", defaultValue: "")', 'NonConstant',
-        expectedErrors:
-            MessageKind.INVALID_INT_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE),
-    const ConstantData(
-        'const int.fromEnvironment("baz", defaultValue: string)', 'NonConstant',
-        expectedErrors:
-            MessageKind.INVALID_INT_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE),
-    const ConstantData('const String.fromEnvironment(0)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE),
-    const ConstantData('const String.fromEnvironment(integer)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_FROM_ENVIRONMENT_NAME_TYPE),
-    const ConstantData(
-        'const String.fromEnvironment("baz", defaultValue: 0)', 'NonConstant',
-        expectedErrors:
-            MessageKind.INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE),
-    const ConstantData(
-        'const String.fromEnvironment("baz", defaultValue: integer)',
-        'NonConstant',
-        expectedErrors:
-            MessageKind.INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE),
-    const ConstantData('true || 0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE),
-    const ConstantData('0 || true', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE),
-    const ConstantData('true || integer', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE),
-    const ConstantData('integer || true', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_OR_OPERAND_TYPE),
-    const ConstantData('true && 0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_AND_OPERAND_TYPE),
-    const ConstantData('0 && true', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_AND_OPERAND_TYPE),
-    const ConstantData('integer && true', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_LOGICAL_AND_OPERAND_TYPE),
-    const ConstantData('!0', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_NOT_TYPE),
-    const ConstantData('!string', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_NOT_TYPE),
-    const ConstantData('-("")', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_NEGATE_TYPE),
-    const ConstantData('-(string)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_NEGATE_TYPE),
-    const ConstantData('not_string.length', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE),
-    const ConstantData('const Class1()', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_CONSTANT_STRING_LENGTH_TYPE),
-    const ConstantData('getter', 'NonConstant'),
-    const ConstantData('const Class2()', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE),
-    const ConstantData('const Class2.redirect()', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE),
-    const ConstantData('const Class3()', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE_MESSAGE),
-    const ConstantData('const Class3.fact()', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE),
-    const ConstantData('const Class4()', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE),
-    const ConstantData('const Class5(0)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE_MESSAGE),
-    const ConstantData('const Class5(1)', 'ConstructedConstant(Class5())'),
-    const ConstantData('const Class6(1)', 'NonConstant',
-        expectedErrors: MessageKind.INVALID_ASSERT_VALUE_MESSAGE),
-    const ConstantData('const Class6(2)', 'ConstructedConstant(Class6())'),
-    const ConstantData('const Class7()', 'ConstructedConstant(Class7())'),
-    const ConstantData('const Class7() == const Class7()', 'NonConstant',
-        expectedErrors: const [
-          MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE,
-          MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE
-        ]),
-  ]),
-  const TestData('assert', '''
-    class A {
-      const A() : assert(true);
-    }
-    class B {
-      const B() : assert(true, "Message");
-    }
-    class C {
-      final a;
-      const C(this.a);
-    }
-    class D extends C {
-      final b;
-      const D(c) : b = c + 2, super(c + 1);
-    }
-  ''', const [
-    const ConstantData(r'const A()', 'ConstructedConstant(A())'),
-    const ConstantData(r'const B()', 'ConstructedConstant(B())'),
-    const ConstantData(r'const D(0)',
-        'ConstructedConstant(D(a=IntConstant(1),b=IntConstant(2)))'),
-  ]),
-  const TestData('instantiations', '''
-T identity<T>(T t) => t;
-class C<T> {
-  final T defaultValue;
-  final T Function(T t) identityFunction;
-
-  const C(this.defaultValue, this.identityFunction);
-}
-  ''', const <ConstantData>[
-    const ConstantData('identity', 'FunctionConstant(identity)'),
-    const ConstantData(
-        'const C<int>(0, identity)',
-        'ConstructedConstant(C<int>(defaultValue=IntConstant(0),'
-        'identityFunction=InstantiationConstant([int],'
-        'FunctionConstant(identity))))'),
-    const ConstantData(
-        'const C<double>(0.5, identity)',
-        'ConstructedConstant(C<double>(defaultValue=DoubleConstant(0.5),'
-        'identityFunction=InstantiationConstant([double],'
-        'FunctionConstant(identity))))'),
-  ]),
-  const TestData('generic class', '''
-class C<T> {
-  const C.generative();
-  const C.redirect() : this.generative();
-}
-  ''', const <ConstantData>[
-    const ConstantData(
-        'const C<int>.generative()', 'ConstructedConstant(C<int>())'),
-    const ConstantData(
-        'const C<int>.redirect()', 'ConstructedConstant(C<int>())'),
-  ])
-];
-
-main(List<String> args) {
-  asyncTest(() async {
-    for (TestData data in DATA) {
-      if (args.isNotEmpty && !args.contains(data.name)) continue;
-      await testData(data);
-    }
-  });
-}
-
-Future testData(TestData data) async {
-  StringBuffer sb = new StringBuffer();
-  sb.writeln('${data.declarations}');
-  Map<String, ConstantData> constants = {};
-  List<String> names = <String>[];
-  data.constants.forEach((ConstantData constantData) {
-    String name = 'c${constants.length}';
-    names.add(name);
-    sb.writeln('const $name = ${constantData.code};');
-    constants[name] = constantData;
-  });
-  sb.writeln('main() {');
-  for (String name in names) {
-    sb.writeln('  print($name);');
-  }
-  sb.writeln('}');
-  String source = sb.toString();
-  print("--source '${data.name}'---------------------------------------------");
-  print(source);
-
-  Future runTest(
-      EvaluationEnvironment getEnvironment(
-          Compiler compiler, FieldEntity field)) async {
-    CompilationResult result =
-        await runCompiler(memorySourceFiles: {'main.dart': source});
-    Compiler compiler = result.compiler;
-    KElementEnvironment elementEnvironment =
-        compiler.frontendStrategy.elementEnvironment;
-    LibraryEntity library = elementEnvironment.mainLibrary;
-    constants.forEach((String name, ConstantData data) {
-      FieldEntity field = elementEnvironment.lookupLibraryMember(library, name);
-      compiler.reporter.withCurrentElement(field, () {
-        ConstantExpression constant =
-            elementEnvironment.getFieldConstantForTesting(field);
-
-        var expectedResults = data.expectedResults;
-        if (expectedResults is String) {
-          expectedResults = <Map<String, String>, String>{
-            const <String, String>{}: expectedResults
-          };
-        }
-        expectedResults.forEach((Map<String, String> env, String expectedText) {
-          MemoryEnvironment environment =
-              new MemoryEnvironment(getEnvironment(compiler, field), env);
-          ConstantValue value = constant.evaluate(environment);
-
-          Expect.isNotNull(
-              value,
-              "Expected non-null value from evaluation of "
-              "`${constant.toStructuredText()}`.");
-
-          String valueText = value.toStructuredText();
-          Expect.equals(
-              expectedText,
-              valueText,
-              "Unexpected value '${valueText}' for field $field = "
-              "`${constant.toDartText()}`, expected '${expectedText}'.");
-
-          List<MessageKind> errors =
-              environment.errors.map((m) => m.kind).toList();
-          var expectedErrors = data.expectedErrors;
-          if (expectedErrors != null) {
-            if (expectedErrors is! List) {
-              expectedErrors = [expectedErrors];
-            }
-            Expect.listEquals(
-                expectedErrors,
-                errors,
-                "Error mismatch for `$field = ${constant.toDartText()}`:\n"
-                "Expected: ${data.expectedErrors},\n"
-                "Found: ${errors}.");
-          } else {
-            Expect.isTrue(
-                errors.isEmpty,
-                "Unexpected errors for `$field = ${constant.toDartText()}`:\n"
-                "Found: ${errors}.");
-          }
-        });
-      });
-    });
-  }
-
-  const skipStrongList = const [
-    // TODO(johnniwinther): Investigate why different errors are reported in
-    // strong mode.
-    'errors',
-  ];
-
-  if (!skipStrongList.contains(data.name)) {
-    await runTest((Compiler compiler, FieldEntity field) {
-      KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
-      KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
-      return new KernelEvaluationEnvironment(elementMap, null, field,
-          constantRequired: field.isConst);
-    });
-  }
-}
diff --git a/tests/compiler/dart2js/model/constant_expression_test.dart b/tests/compiler/dart2js/model/constant_expression_test.dart
deleted file mode 100644
index dee8ee5..0000000
--- a/tests/compiler/dart2js/model/constant_expression_test.dart
+++ /dev/null
@@ -1,397 +0,0 @@
-// 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.
-
-library constant_expression_test;
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/common_elements.dart' show KElementEnvironment;
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/constants/expressions.dart';
-import 'package:compiler/src/kernel/element_map_impl.dart';
-import 'package:compiler/src/elements/entities.dart';
-import '../helpers/memory_compiler.dart';
-import 'constant_expression_evaluate_test.dart' show MemoryEnvironment;
-
-class TestData {
-  /// Declarations needed for the [constants].
-  final String declarations;
-
-  /// Tested constants.
-  final List<ConstantData> constants;
-
-  const TestData(this.declarations, this.constants);
-}
-
-class ConstantData {
-  /// Source code for the constant expression.
-  final String code;
-
-  /// The expected constant expression kind.
-  final ConstantExpressionKind kind;
-
-  /// ConstantExpression.getText() result if different from [code].
-  final String text;
-
-  /// The expected instance type for ConstructedConstantExpression.
-  final String type;
-
-  /// The expected instance fields for ConstructedConstantExpression.
-  final Map<String, String> fields;
-
-  const ConstantData(String code, this.kind,
-      {String text, this.type, this.fields})
-      : this.code = code,
-        this.text = text ?? code;
-}
-
-const List<TestData> DATA = const [
-  const TestData('''
-class Class<T, S> {
-  final a;
-  final b;
-  final c;
-  const Class(this.a, {this.b, this.c: true});
-  const Class.named([this.a, this.b = 0, this.c = 2]);
-
-  static const staticConstant = 0;
-  static staticFunction() {}
-}
-const t = true;
-const f = false;
-const toplevelConstant = 0;
-toplevelFunction() {}
-''', const [
-    const ConstantData('null', ConstantExpressionKind.NULL),
-    const ConstantData('false', ConstantExpressionKind.BOOL),
-    const ConstantData('true', ConstantExpressionKind.BOOL),
-    const ConstantData('0', ConstantExpressionKind.INT),
-    const ConstantData('0.0', ConstantExpressionKind.DOUBLE),
-    const ConstantData('"foo"', ConstantExpressionKind.STRING),
-    const ConstantData('1 + 2', ConstantExpressionKind.BINARY),
-    const ConstantData('1 == 2', ConstantExpressionKind.BINARY),
-    const ConstantData('1 != 2', ConstantExpressionKind.UNARY,
-        // a != b is encoded as !(a == b) by CFE.
-        text: '!(1 == 2)'),
-    const ConstantData('1 ?? 2', ConstantExpressionKind.BINARY),
-    const ConstantData('-(1)', ConstantExpressionKind.UNARY, text: '-1'),
-    const ConstantData('"foo".length', ConstantExpressionKind.STRING_LENGTH),
-    const ConstantData('identical(0, 1)', ConstantExpressionKind.IDENTICAL),
-    const ConstantData('"a" "b"', ConstantExpressionKind.CONCATENATE,
-        text: '"ab"'),
-    const ConstantData('identical', ConstantExpressionKind.FUNCTION),
-    const ConstantData('true ? 0 : 1', ConstantExpressionKind.CONDITIONAL),
-    const ConstantData('proxy', ConstantExpressionKind.FIELD),
-    const ConstantData('Object', ConstantExpressionKind.TYPE),
-    const ConstantData('#name', ConstantExpressionKind.SYMBOL),
-    const ConstantData('const []', ConstantExpressionKind.LIST),
-    const ConstantData('const [0, 1]', ConstantExpressionKind.LIST,
-        text: 'const <int>[0, 1]'),
-    const ConstantData('const <int>[0, 1]', ConstantExpressionKind.LIST),
-    const ConstantData('const <dynamic>[0, 1]', ConstantExpressionKind.LIST,
-        text: 'const [0, 1]'),
-    const ConstantData('const {}', ConstantExpressionKind.MAP),
-    const ConstantData('const {0: 1, 2: 3}', ConstantExpressionKind.MAP,
-        text: 'const <int, int>{0: 1, 2: 3}'),
-    const ConstantData(
-        'const <int, int>{0: 1, 2: 3}', ConstantExpressionKind.MAP),
-    const ConstantData(
-        'const <String, int>{"0": 1, "2": 3}', ConstantExpressionKind.MAP),
-    const ConstantData(
-        'const <String, dynamic>{"0": 1, "2": 3}', ConstantExpressionKind.MAP),
-    const ConstantData(
-        'const <dynamic, dynamic>{"0": 1, "2": 3}', ConstantExpressionKind.MAP,
-        text: 'const {"0": 1, "2": 3}'),
-    const ConstantData('const bool.fromEnvironment("foo", defaultValue: false)',
-        ConstantExpressionKind.BOOL_FROM_ENVIRONMENT),
-    const ConstantData('const int.fromEnvironment("foo", defaultValue: 42)',
-        ConstantExpressionKind.INT_FROM_ENVIRONMENT),
-    const ConstantData(
-        'const String.fromEnvironment("foo", defaultValue: "bar")',
-        ConstantExpressionKind.STRING_FROM_ENVIRONMENT),
-    const ConstantData('const Class(0)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class(0, b: 1)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class(0, c: 2)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class(0, b: 3, c: 4)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class.named()', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class.named(0)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class.named(0, 1)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class.named(0, 1, 2)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class<String, int>(0)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class<String, dynamic>(0)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class<dynamic, String>(0)', ConstantExpressionKind.CONSTRUCTED),
-    const ConstantData(
-        'const Class<dynamic, dynamic>(0)', ConstantExpressionKind.CONSTRUCTED,
-        text: 'const Class(0)'),
-    const ConstantData('toplevelConstant', ConstantExpressionKind.FIELD),
-    const ConstantData('toplevelFunction', ConstantExpressionKind.FUNCTION),
-    const ConstantData('Class.staticConstant', ConstantExpressionKind.FIELD),
-    const ConstantData('Class.staticFunction', ConstantExpressionKind.FUNCTION),
-    const ConstantData('1 + 2', ConstantExpressionKind.BINARY),
-    const ConstantData('1 + 2 + 3', ConstantExpressionKind.BINARY),
-    const ConstantData('1 + -2', ConstantExpressionKind.BINARY),
-    const ConstantData('-1 + 2', ConstantExpressionKind.BINARY),
-    const ConstantData('(1 + 2) + 3', ConstantExpressionKind.BINARY,
-        text: '1 + 2 + 3'),
-    const ConstantData('1 + (2 + 3)', ConstantExpressionKind.BINARY,
-        text: '1 + 2 + 3'),
-    const ConstantData('1 * 2', ConstantExpressionKind.BINARY),
-    const ConstantData('1 * 2 + 3', ConstantExpressionKind.BINARY),
-    const ConstantData('1 * (2 + 3)', ConstantExpressionKind.BINARY),
-    const ConstantData('1 + 2 * 3', ConstantExpressionKind.BINARY),
-    const ConstantData('(1 + 2) * 3', ConstantExpressionKind.BINARY),
-    const ConstantData(
-        'false || identical(0, 1)', ConstantExpressionKind.BINARY),
-    const ConstantData('!identical(0, 1)', ConstantExpressionKind.UNARY),
-    const ConstantData(
-        '!identical(0, 1) || false', ConstantExpressionKind.BINARY),
-    const ConstantData(
-        '!(identical(0, 1) || false)', ConstantExpressionKind.UNARY),
-    const ConstantData('identical(0, 1) ? 3 * 4 + 5 : 6 + 7 * 8',
-        ConstantExpressionKind.CONDITIONAL),
-    const ConstantData('t ? f ? 0 : 1 : 2', ConstantExpressionKind.CONDITIONAL),
-    const ConstantData(
-        '(t ? t : f) ? f ? 0 : 1 : 2', ConstantExpressionKind.CONDITIONAL),
-    const ConstantData(
-        't ? t : f ? f ? 0 : 1 : 2', ConstantExpressionKind.CONDITIONAL),
-    const ConstantData(
-        't ? t ? t : t : t ? t : t', ConstantExpressionKind.CONDITIONAL),
-    const ConstantData(
-        't ? (t ? t : t) : (t ? t : t)', ConstantExpressionKind.CONDITIONAL,
-        text: 't ? t ? t : t : t ? t : t'),
-    const ConstantData(
-        'const [const <dynamic, dynamic>{0: true, "1": "c" "d"}, '
-        'const Class(const Class<dynamic, dynamic>(toplevelConstant))]',
-        ConstantExpressionKind.LIST,
-        text: 'const <Object>[const {0: true, "1": "cd"}, '
-            'const Class(const Class(toplevelConstant))]'),
-  ]),
-  const TestData('''
-class A {
-  const A();
-}
-class B {
-  final field1;
-  const B(this.field1);
-}
-class C extends B {
-  final field2;
-  const C({field1: 42, this.field2: false}) : super(field1);
-  const C.named([field = false]) : this(field1: field, field2: field);
-}
-''', const [
-    const ConstantData('const Object()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'Object', fields: const {}),
-    const ConstantData('const A()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A', fields: const {}),
-    const ConstantData('const B(0)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'B', fields: const {'field(B#field1)': '0'}),
-    const ConstantData('const B(const A())', ConstantExpressionKind.CONSTRUCTED,
-        type: 'B', fields: const {'field(B#field1)': 'const A()'}),
-    const ConstantData('const C()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C',
-        fields: const {
-          'field(B#field1)': '42',
-          'field(C#field2)': 'false',
-        }),
-    const ConstantData(
-        'const C(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C',
-        fields: const {
-          'field(B#field1)': '87',
-          'field(C#field2)': 'false',
-        }),
-    const ConstantData(
-        'const C(field2: true)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C',
-        fields: const {
-          'field(B#field1)': '42',
-          'field(C#field2)': 'true',
-        }),
-    const ConstantData('const C.named()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C',
-        fields: const {
-          'field(B#field1)': 'false',
-          'field(C#field2)': 'false',
-        }),
-    const ConstantData('const C.named(87)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C',
-        fields: const {
-          'field(B#field1)': '87',
-          'field(C#field2)': '87',
-        }),
-  ]),
-  const TestData('''
-class A<T> implements B<Null> {
-  final field1;
-  const A({this.field1:42});
-}
-class B<S> implements C<Null> {
-  const factory B({field1}) = A<B<S>>;
-  const factory B.named() = A<S>;
-}
-class C<U> {
-  const factory C({field1}) = A<B<double>>;
-}
-''', const [
-    const ConstantData('const A()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<dynamic>', fields: const {'field(A#field1)': '42'}),
-    const ConstantData(
-        'const A<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<int>', fields: const {'field(A#field1)': '87'}),
-    const ConstantData('const B()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<B<dynamic>>',
-        fields: const {
-          'field(A#field1)': '42',
-        },
-        // Redirecting factories are replaced by their effective targets by CFE.
-        text: 'const A<B<dynamic>>()'),
-    const ConstantData('const B<int>()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<B<int>>',
-        fields: const {
-          'field(A#field1)': '42',
-        },
-        // Redirecting factories are replaced by their effective targets by CFE.
-        text: 'const A<B<int>>()'),
-    const ConstantData(
-        'const B<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<B<int>>',
-        fields: const {
-          'field(A#field1)': '87',
-        },
-        // Redirecting factories are replaced by their effective targets by CFE.
-        text: 'const A<B<int>>(field1: 87)'),
-    const ConstantData(
-        'const C<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<B<double>>',
-        fields: const {
-          'field(A#field1)': '87',
-        },
-        // Redirecting factories are replaced by their effective targets by CFE.
-        text: 'const A<B<double>>(field1: 87)'),
-    const ConstantData(
-        'const B<int>.named()', ConstantExpressionKind.CONSTRUCTED,
-        type: 'A<int>',
-        fields: const {
-          'field(A#field1)': '42',
-        },
-        // Redirecting factories are replaced by their effective targets by CFE.
-        text: 'const A<int>()'),
-  ]),
-  const TestData('''
-T identity<T>(T t) => t;
-class C<T> {
-  final T defaultValue;
-  final T Function(T t) identityFunction;
-
-  const C(this.defaultValue, this.identityFunction);
-}
-  ''', const <ConstantData>[
-    const ConstantData('identity', ConstantExpressionKind.FUNCTION),
-    const ConstantData(
-        'const C<int>(0, identity)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C<int>', text: 'const C<int>(0, <int>(identity))'),
-    const ConstantData(
-        'const C<double>(0.5, identity)', ConstantExpressionKind.CONSTRUCTED,
-        type: 'C<double>', text: 'const C<double>(0.5, <double>(identity))'),
-  ])
-];
-
-main() {
-  asyncTest(() async {
-    await runTest();
-  });
-}
-
-Future runTest() async {
-  for (TestData data in DATA) {
-    await testData(data);
-  }
-}
-
-Future testData(TestData data) async {
-  StringBuffer sb = new StringBuffer();
-  sb.writeln('${data.declarations}');
-  Map<String, ConstantData> constants = {};
-  List<String> names = <String>[];
-  data.constants.forEach((ConstantData constantData) {
-    String name = 'c${constants.length}';
-    names.add(name);
-    sb.writeln('const $name = ${constantData.code};');
-    constants[name] = constantData;
-  });
-  sb.writeln('main() {');
-  for (String name in names) {
-    sb.writeln('  print($name);');
-  }
-  sb.writeln('}');
-  String source = sb.toString();
-  CompilationResult result =
-      await runCompiler(memorySourceFiles: {'main.dart': source});
-  Compiler compiler = result.compiler;
-  KElementEnvironment elementEnvironment =
-      compiler.frontendStrategy.elementEnvironment;
-
-  MemoryEnvironment environment = new MemoryEnvironment(
-      new KernelEvaluationEnvironment(
-          (compiler.frontendStrategy as dynamic).elementMap,
-          compiler.environment,
-          null));
-  dynamic library = elementEnvironment.mainLibrary;
-  constants.forEach((String name, ConstantData data) {
-    FieldEntity field = elementEnvironment.lookupLibraryMember(library, name);
-    dynamic constant = elementEnvironment.getFieldConstantForTesting(field);
-    Expect.equals(
-        data.kind,
-        constant.kind,
-        "Unexpected kind '${constant.kind}' for constant "
-        "`${constant.toDartText()}`, expected '${data.kind}'.");
-    String text = data.text;
-    Expect.equals(
-        text,
-        constant.toDartText(),
-        "Unexpected text '${constant.toDartText()}' for constant, "
-        "expected '${text}'.");
-    if (data.type != null) {
-      String instanceType =
-          constant.computeInstanceType(environment).toString();
-      Expect.equals(
-          data.type,
-          instanceType,
-          "Unexpected type '$instanceType' for constant "
-          "`${constant.toDartText()}`, expected '${data.type}'.");
-    }
-    if (data.fields != null) {
-      Map instanceFields = constant.computeInstanceData(environment).fieldMap;
-      Expect.equals(
-          data.fields.length,
-          instanceFields.length,
-          "Unexpected field count ${instanceFields.length} for constant "
-          "`${constant.toDartText()}`, expected '${data.fields.length}'.");
-      instanceFields.forEach((field, expression) {
-        String name = '$field';
-        Expect.isTrue(name.startsWith('k:'));
-        name = name.substring(2).replaceAll('.', "#");
-        String expression = instanceFields[field].toDartText();
-        String expected = data.fields[name];
-        Expect.equals(
-            expected,
-            expression,
-            "Unexpected field expression ${expression} for field '$name' in "
-            "constant `${constant.toDartText()}`, expected '${expected}'.");
-      });
-    }
-  });
-}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index a4a6fa0..b3ca79e 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
@@ -63,6 +63,13 @@
       writeJs: writeJs,
       verbose: verbose,
       inlineData: inlineData);
+  print('---from kernel with CFE constants-----------------------------------');
+  await runTest(test, kernelMarker,
+      printJs: printJs,
+      writeJs: writeJs,
+      verbose: verbose,
+      inlineData: inlineData,
+      options: ['${Flags.enableLanguageExperiments}=constant-update-2018']);
 }
 
 Future runTest(Test test, String config,
diff --git a/tests/corelib_2/map_test.dart b/tests/corelib_2/map_test.dart
index 5c9e9a4..88d6e92 100644
--- a/tests/corelib_2/map_test.dart
+++ b/tests/corelib_2/map_test.dart
@@ -1043,4 +1043,5 @@
   checkUnmodifiable(const {1: 1});
   checkUnmodifiable(Map.unmodifiable({1: 1}));
   checkUnmodifiable(UnmodifiableMapView({1: 1}));
+  checkUnmodifiable(const MapView({1: 1}));
 }
diff --git a/tests/ffi/enable_ffi_test.dart b/tests/ffi/enable_ffi_test.dart
index ebe1b9b..1ccb5ec 100644
--- a/tests/ffi/enable_ffi_test.dart
+++ b/tests/ffi/enable_ffi_test.dart
@@ -13,8 +13,8 @@
 import "package:expect/expect.dart";
 
 void main() {
-  ffi.Pointer<ffi.Int64> p = ffi.allocate(); //# 01: compile-time error
-  p.store(42); //# 01: compile-time error
-  Expect.equals(42, p.load<int>()); //# 01: compile-time error
-  p.free(); //# 01: compile-time error
+  ffi.Pointer<ffi.Int64> p = ffi.allocate(); //# 01: compile-time error, runtime error
+  p.store(42); //# 01: compile-time error, runtime error
+  Expect.equals(42, p.load<int>()); //# 01: compile-time error, runtime error
+  p.free(); //# 01: compile-time error, runtime error
 }
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index f56725a..5b0ab46 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -28,8 +28,11 @@
 [ $runtime == dart_precompiled ]
 *: Skip # AOT is not yet supported: dartbug.com/35765
 
-[ $arch != arm64 && $arch != ia32 && $arch != x64 ]
-*: Skip # FFI not yet supported on other architectures.
+[ $arch == simdbc64 || $arch == simarm || $arch == simarm64 ]
+*: Skip # FFI not yet supported on DBC or other simulated architectures.
 
 [ $system != android && $system != linux && $system != macos && $system != windows ]
 *: Skip # FFI not yet supported on other OSes.
+
+[ $system != android && $arch == arm ]
+*: Skip # "hardfp" calling convention is not yet supported (iOS is also supported but not tested): dartbug.com/36309
diff --git a/tests/ffi/function_stress_test.dart b/tests/ffi/function_stress_test.dart
index 1c0d9f4..92e807c 100644
--- a/tests/ffi/function_stress_test.dart
+++ b/tests/ffi/function_stress_test.dart
@@ -18,15 +18,21 @@
 import "package:expect/expect.dart";
 import 'gc_helper.dart';
 
-test(GCWatcher watcher, void Function() testee,
-    {bool mustTriggerGC: true}) async {
+test(GCWatcher watcher, Function testee,
+    {bool mustTriggerGC: true, bool batched: false}) async {
   // Warmup.
   for (int i = 0; i < 1000; ++i) {
-    testee();
+    batched ? testee(1) : testee();
   }
   int size = await watcher.size();
-  for (int i = 0; i < 1000000; ++i) {
-    testee();
+  for (int i = 0; i < 1000000;) {
+    if (batched) {
+      testee(1000);
+      i += 1000;
+    } else {
+      testee();
+      i++;
+    }
   }
   int new_size = await watcher.size();
   if (mustTriggerGC) {
@@ -44,6 +50,8 @@
     await test(watcher, testBoxInt32, mustTriggerGC: false);
     await test(watcher, testBoxDouble);
     await test(watcher, testBoxPointer);
+    await test(watcher, testAllocateMints, batched: true);
+    await test(watcher, testAllocationsInDart, batched: true);
   } finally {
     watcher.dispose();
   }
@@ -56,9 +64,11 @@
 typedef NativeNullaryOp32 = ffi.Int32 Function();
 typedef NativeNullaryOpDouble = ffi.Double Function();
 typedef NativeNullaryOpPtr = ffi.Pointer<ffi.Void> Function();
+typedef NativeUnaryOp = ffi.Void Function(ffi.Uint64);
 typedef NullaryOp = int Function();
 typedef NullaryOpDbl = double Function();
 typedef NullaryOpPtr = ffi.Pointer<ffi.Void> Function();
+typedef UnaryOp = void Function(int);
 
 //// These functions return values that require boxing into different types.
 
@@ -100,3 +110,34 @@
     }
   }
 }
+
+final allocateMint =
+    ffiTestFunctions.lookupFunction<NativeUnaryOp, UnaryOp>("AllocateMints");
+
+// Test GC in the FFI call path by calling a C function which allocates through
+// the Dart API.
+void testAllocateMints(int batchSize) {
+  allocateMint(batchSize);
+}
+
+class C {
+  final int i;
+  C(this.i);
+}
+
+C c = null;
+@pragma("vm:entry-point", "call")
+void testAllocationsInDartHelper(int count) {
+  for (int i = 0; i < count; ++i) {
+    c = C(i);
+  }
+}
+
+final allocateThroughDart = ffiTestFunctions
+    .lookupFunction<NativeUnaryOp, UnaryOp>("AllocateThroughDart");
+
+// Test GC in the FFI call path by calling a C function which allocates by
+// calling back into Dart ('testAllocationsInDartHelper').
+void testAllocationsInDart(int batchSize) {
+  allocateThroughDart(batchSize * 10);
+}
diff --git a/tests/language_2/control_flow_collections/await_for_inference_test.dart b/tests/language_2/control_flow_collections/await_for_inference_test.dart
index d4d4bb8..6987f58 100644
--- a/tests/language_2/control_flow_collections/await_for_inference_test.dart
+++ b/tests/language_2/control_flow_collections/await_for_inference_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 // Test how await for interacts with inference.
 import "package:async_helper/async_helper.dart";
diff --git a/tests/language_2/control_flow_collections/await_for_null_test.dart b/tests/language_2/control_flow_collections/await_for_null_test.dart
index d040e92..7e2fc5e 100644
--- a/tests/language_2/control_flow_collections/await_for_null_test.dart
+++ b/tests/language_2/control_flow_collections/await_for_null_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 // Test that a null stream expression procudes a runtime error.
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/language_2/control_flow_collections/await_for_syntax_error_test.dart b/tests/language_2/control_flow_collections/await_for_syntax_error_test.dart
index 0b7c20a..f5e30ce 100644
--- a/tests/language_2/control_flow_collections/await_for_syntax_error_test.dart
+++ b/tests/language_2/control_flow_collections/await_for_syntax_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 void main() {
   // Use await for in non-async function.
diff --git a/tests/language_2/control_flow_collections/await_for_test.dart b/tests/language_2/control_flow_collections/await_for_test.dart
index 032084e..c838c49 100644
--- a/tests/language_2/control_flow_collections/await_for_test.dart
+++ b/tests/language_2/control_flow_collections/await_for_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/await_for_type_error_test.dart b/tests/language_2/control_flow_collections/await_for_type_error_test.dart
index 7090cee..8cc87da 100644
--- a/tests/language_2/control_flow_collections/await_for_type_error_test.dart
+++ b/tests/language_2/control_flow_collections/await_for_type_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 void main() {
   () async {
diff --git a/tests/language_2/control_flow_collections/experimental_flag_test.dart b/tests/language_2/control_flow_collections/experimental_flag_test.dart
deleted file mode 100644
index a044a01..0000000
--- a/tests/language_2/control_flow_collections/experimental_flag_test.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2019, 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.
-
-// Check that control flow is not enabled without the experimental flag.
-
-// TODO(rnystrom): Remove this test when the feature is enabled without a flag.
-
-void main() {
-  var _ = <int>[if (true) 1]; //# 01: compile-time error
-  var _ = <int, int>{if (true) 1: 1}; //# 02: compile-time error
-  var _ = <int>{if (true) 1}; //# 03: compile-time error
-
-  var _ = <int>[if (true) 1 else 2]; //# 04: compile-time error
-  var _ = <int, int>{if (true) 1: 1 else 2: 2}; //# 05: compile-time error
-  var _ = <int>{if (true) 1 else 2}; //# 06: compile-time error
-
-  var _ = <int>[for (var i in []) 1]; //# 07: compile-time error
-  var _ = <int, int>{for (var i in []) 1: 1}; //# 08: compile-time error
-  var _ = <int>{for (var i in []) 1}; //# 09: compile-time error
-
-  var _ = <int>[for (; false;) 1]; //# 10: compile-time error
-  var _ = <int, int>{for (; false;) 1: 1}; //# 11: compile-time error
-  var _ = <int>{for (; false;) 1}; //# 12: compile-time error
-
-  () async {
-    var _ = <int>[await for (var i in []) 1]; //# 13: compile-time error
-    var _ = <int, int>{await  for (var i in []) 1: 1}; //# 14: compile-time error
-    var _ = <int>{await for (var i in []) 1}; //# 15: compile-time error
-  }();
-}
diff --git a/tests/language_2/control_flow_collections/for_await_test.dart b/tests/language_2/control_flow_collections/for_await_test.dart
index 81b0a3f..55d24ae 100644
--- a/tests/language_2/control_flow_collections/for_await_test.dart
+++ b/tests/language_2/control_flow_collections/for_await_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 import "package:async_helper/async_helper.dart";
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/for_const_test.dart b/tests/language_2/control_flow_collections/for_const_error_test.dart
similarity index 82%
rename from tests/language_2/control_flow_collections/for_const_test.dart
rename to tests/language_2/control_flow_collections/for_const_error_test.dart
index 32f7e51..626c7a8 100644
--- a/tests/language_2/control_flow_collections/for_const_test.dart
+++ b/tests/language_2/control_flow_collections/for_const_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 void main() {
   // For cannot be used in a const collection.
@@ -16,7 +16,7 @@
 
   () async {
     const _ = <int>[await for (var i in []) 1]; //# 06: compile-time error
-    const _ = <int, int>{await  for (var i in []) 1: 1}; //# 07: compile-time error
+    const _ = <int, int>{await for (var i in []) 1: 1}; //# 07: compile-time error
     const _ = <int>{await for (var i in []) 1}; //# 08: compile-time error
   }();
 }
diff --git a/tests/language_2/control_flow_collections/for_inference_test.dart b/tests/language_2/control_flow_collections/for_inference_test.dart
index 7835d7a..9479dd6 100644
--- a/tests/language_2/control_flow_collections/for_inference_test.dart
+++ b/tests/language_2/control_flow_collections/for_inference_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 // Test how control flow interacts with inference.
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/for_non_bool_condition_test.dart b/tests/language_2/control_flow_collections/for_non_bool_condition_test.dart
index fbc3834..74b00df 100644
--- a/tests/language_2/control_flow_collections/for_non_bool_condition_test.dart
+++ b/tests/language_2/control_flow_collections/for_non_bool_condition_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/for_null_condition_test.dart b/tests/language_2/control_flow_collections/for_null_condition_test.dart
index 6b890fd..2f9a6c0 100644
--- a/tests/language_2/control_flow_collections/for_null_condition_test.dart
+++ b/tests/language_2/control_flow_collections/for_null_condition_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/for_runtime_error_test.dart b/tests/language_2/control_flow_collections/for_runtime_error_test.dart
index f036a94..b8fa267 100644
--- a/tests/language_2/control_flow_collections/for_runtime_error_test.dart
+++ b/tests/language_2/control_flow_collections/for_runtime_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/for_test.dart b/tests/language_2/control_flow_collections/for_test.dart
index 8df9d75..a264cb6 100644
--- a/tests/language_2/control_flow_collections/for_test.dart
+++ b/tests/language_2/control_flow_collections/for_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/for_variable_test.dart b/tests/language_2/control_flow_collections/for_variable_test.dart
index 69d0b3f..f866daf 100644
--- a/tests/language_2/control_flow_collections/for_variable_test.dart
+++ b/tests/language_2/control_flow_collections/for_variable_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 /// Tests for how variables and scoping work with for elements.
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/if_await_test.dart b/tests/language_2/control_flow_collections/if_await_test.dart
index a0e8bad..2db3f62 100644
--- a/tests/language_2/control_flow_collections/if_await_test.dart
+++ b/tests/language_2/control_flow_collections/if_await_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 import "package:async_helper/async_helper.dart";
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/if_const_error_test.dart b/tests/language_2/control_flow_collections/if_const_error_test.dart
index c644acf..f3645f2 100644
--- a/tests/language_2/control_flow_collections/if_const_error_test.dart
+++ b/tests/language_2/control_flow_collections/if_const_error_test.dart
@@ -2,138 +2,14 @@
 // 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.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
-
-import 'dart:collection';
-
-import 'package:expect/expect.dart';
-
-import 'utils.dart';
-
-final nonConstBool = true;
-final nonConstInt = 3;
-
-const dynamic nonBool = 3;
-const dynamic nonInt = "s";
+// SharedOptions=--enable-experiment=control-flow-collections
 
 void main() {
-  testList();
-  testMap();
-  testSet();
-  testShortCircuit();
-}
-
-void testList() {
-  // Condition must be constant.
-  const _ = <int>[if (nonConstBool) 1]; //# 01: compile-time error
-
-  // Condition must be Boolean.
-  const _ = <int>[if (nonBool) 1]; //# 02: compile-time error
-
-  // Then element must be constant, whether or not branch is taken.
-  const _ = <int>[if (true) nonConstInt]; //# 03: compile-time error
-  const _ = <int>[if (false) nonConstInt]; //# 04: compile-time error
-
-  // Else element must be constant, whether or not branch is taken.
-  const _ = <int>[if (true) 1 else nonConstInt]; //# 05: compile-time error
-  const _ = <int>[if (false) 1 else nonConstInt]; //# 06: compile-time error
-
-  // Then element must have right type if branch is chosen.
-  const _ = <int>[if (true) nonInt]; //# 07: compile-time error
-
-  // Else element must have right type if branch is chosen.
-  const _ = <int>[if (false) 9 else nonInt]; //# 08: compile-time error
-}
-
-void testMap() {
-  // Condition must be constant.
-  const _ = <int, int>{if (nonConstBool) 1: 1}; //# 09: compile-time error
-
-  // Condition must be Boolean.
-  const _ = <int, int>{if (nonBool) 1: 1}; //# 10: compile-time error
-
-  // Then key element must be constant, whether or not branch is taken.
-  const _ = <int, int>{if (true) nonConstInt: 1}; //# 11: compile-time error
-  const _ = <int, int>{if (false) nonConstInt: 1}; //# 12: compile-time error
-
-  // Then value element must be constant, whether or not branch is taken.
-  const _ = <int, int>{if (true) 1: nonConstInt}; //# 13: compile-time error
-  const _ = <int, int>{if (false) 1: nonConstInt}; //# 14: compile-time error
-
-  // Else key element must be constant, whether or not branch is taken.
-  const _ = <int, int>{if (true) 1 else nonConstInt: 1}; //# 15: compile-time error
-  const _ = <int, int>{if (false) 1 else nonConstInt: 1}; //# 16: compile-time error
-
-  // Else value element must be constant, whether or not branch is taken.
-  const _ = <int, int>{if (true) 1 else 1: nonConstInt}; //# 17: compile-time error
-  const _ = <int, int>{if (false) 1 else 1: nonConstInt}; //# 18: compile-time error
-
-  // Then key element must have right type if branch is chosen.
-  const _ = <int, int>{if (true) nonInt: 1}; //# 19: compile-time error
-
-  // Then value element must have right type if branch is chosen.
-  const _ = <int, int>{if (true) 1: nonInt}; //# 20: compile-time error
-
-  // Else key element must have right type if branch is chosen.
-  const _ = <int, int>{if (false) 9 else nonInt: 1}; //# 21: compile-time error
-
-  // Else value element must have right type if branch is chosen.
-  const _ = <int, int>{if (false) 9 else 1: nonInt}; //# 22: compile-time error
-
-  // Key cannot override operator.==().
-  const obj = 0.1;
-  const _ = {if (true) 0.1: 1}; //# 23: compile-time error
-  const _ = {if (true) Duration(seconds: 0): 1}; //# 24: compile-time error
-  const _ = {if (true) obj: 1}; //# 25: compile-time error
-
-  // Cannot have key collision when branch is chosen.
-  const _ = <int, int>{1: 1, if (true) 1: 1}; //# 25: compile-time error
-  const _ = <int, int>{if (true) 1: 1, if (true) 1: 1}; //# 26: compile-time error
-}
-
-void testSet() {
-  // Condition must be constant.
-  const _ = <int>{if (nonConstBool) 1}; //# 27: compile-time error
-
-  // Condition must be Boolean.
-  const _ = <int>{if (nonBool) 1}; //# 28: compile-time error
-
-  // Then element must be constant, whether or not branch is taken.
-  const _ = <int>{if (true) nonConstInt}; //# 29: compile-time error
-  const _ = <int>{if (false) nonConstInt}; //# 30: compile-time error
-
-  // Else element must be constant, whether or not branch is taken.
-  const _ = <int>{if (true) 1 else nonConstInt}; //# 31: compile-time error
-  const _ = <int>{if (false) 1 else nonConstInt}; //# 32: compile-time error
-
-  // Then element must have right type if branch is chosen.
-  const _ = <int>{if (true) nonInt}; //# 33: compile-time error
-
-  // Else element must have right type if branch is chosen.
-  const _ = <int>{if (false) 9 else nonInt}; //# 34: compile-time error
-
-  // Cannot override operator.==().
-  const obj = 0.1;
-  const _ = {if (true) 0.1}; //# 35: compile-time error
-  const _ = {if (true) Duration(seconds: 0)}; //# 36: compile-time error
-  const _ = {if (true) obj}; //# 37: compile-time error
-
-  // Cannot have collision when branch is chosen.
-  const _ = <int>{1, if (true) 1}; //# 38: compile-time error
-  const _ = <int>{if (true) 1, if (true) 1}; //# 39: compile-time error
-}
-
-void testShortCircuit() {
-  // A const expression that throws causes a compile error if it occurs inside
-  // the chosen branch of an if.
-
-  // Store null in a dynamically-typed constant to avoid the type error on "+".
-  const dynamic nil = null;
-
-  // With no else.
-  const _ = [if (true) nil + 1]; //# 40: compile-time error
-
-  // With else.
-  const _ = [if (true) nil + 1 else 1]; //# 41: compile-time error
-  const _ = [if (false) 1 else nil + 1]; //# 42: compile-time error
+  // If cannot be used in a const collection.
+  const _ = [if (true) 1]; //# 00: compile-time error
+  const _ = [if (false) 1 else 2]; //# 01: compile-time error
+  const _ = {if (true) 1}; //# 02: compile-time error
+  const _ = {if (false) 1 else 2}; //# 03: compile-time error
+  const _ = {if (true) 1: 1}; //# 04: compile-time error
+  const _ = {if (false) 1: 1 else 2: 2}; //# 05: compile-time error
 }
diff --git a/tests/language_2/control_flow_collections/if_const_test.dart b/tests/language_2/control_flow_collections/if_const_test.dart
deleted file mode 100644
index db38174..0000000
--- a/tests/language_2/control_flow_collections/if_const_test.dart
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright (c) 2019, 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.
-
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
-
-import 'package:expect/expect.dart';
-
-import 'utils.dart';
-
-// Typed as dynamic to also test spreading a value of type dynamic.
-const dynamic list = [1, 2, 3];
-const dynamic map = {1: 1, 2: 2, 3: 3};
-const dynamic set = {1, 2, 3};
-
-const dynamic dynamicTrue = true;
-const Object objectTrue = true;
-
-void main() {
-  testList();
-  testMap();
-  testSet();
-  testShortCircuit();
-  testDuplicateKeys();
-  testKeyOrder();
-}
-
-void testList() {
-  // Then if true.
-  Expect.identical(list, const <int>[1, if (true) 2, 3]);
-
-  // Nothing if false and no else.
-  Expect.identical(list, const <int>[1, if (false) 9, 2, 3]);
-
-  // Else if false.
-  Expect.identical(list, const <int>[1, if (false) 9 else 2, 3]);
-
-  // Only if.
-  Expect.identical(const [1], const <int>[if (true) 1]);
-
-  // If at beginning.
-  Expect.identical(list, const <int>[if (true) 1, 2, 3]);
-
-  // If in middle.
-  Expect.identical(list, const <int>[1, if (true) 2, 3]);
-
-  // If at end.
-  Expect.identical(list, const <int>[1, 2, if (true) 3]);
-
-  // Multiple ifs.
-  Expect.identical(list,
-      const <int>[if (true) 1, if (false) 9, 2, if (true) 3]);
-
-  // Cast condition.
-  Expect.identical(const [1], const <int>[if (dynamicTrue) 1]);
-  Expect.identical(const [1], const <int>[if (objectTrue) 1]);
-
-  // Does not flatten nested collection literal.
-  Expect.identical(const [1], const [if (true) [1]].first);
-  Expect.identical(const {1: 1}, const [if (true) {1: 1}].first);
-  Expect.identical(const {1}, const [if (true) {1}].first);
-
-  // Nested spread.
-  Expect.identical(list,
-      const <int>[if (true) ...<int>[1, 2], if (false) 9 else ...<int>[3]]);
-
-  // Nested if in then.
-  Expect.identical(const [1],
-      const <int>[if (true) if (true) 1, if (true) if (false) 9]);
-
-  // Nested if in else.
-  Expect.identical(const [1], const <int>[if (false) 9 else if (true) 1]);
-}
-
-void testMap() {
-  // Then if true.
-  Expect.identical(map, const <int, int>{1: 1, if (true) 2: 2, 3: 3});
-
-  // Nothing if false and no else.
-  Expect.identical(map, const <int, int>{1: 1, if (false) 9: 9, 2: 2, 3: 3});
-
-  // Else if false.
-  Expect.identical(map,
-      const <int, int>{1: 1, if (false) 9: 9 else 2: 2, 3: 3});
-
-  // Only if.
-  Expect.identical(const {1: 1}, const <int, int>{if (true) 1: 1});
-
-  // If at beginning.
-  Expect.identical(map, const <int, int>{if (true) 1: 1, 2: 2, 3: 3});
-
-  // If in middle.
-  Expect.identical(map, const <int, int>{1: 1, if (true) 2: 2, 3: 3});
-
-  // If at end.
-  Expect.identical(map, const <int, int>{1: 1, 2: 2, if (true) 3: 3});
-
-  // Multiple ifs.
-  Expect.identical(map,
-      const <int, int>{if (true) 1: 1, if (false) 9: 9, 2: 2, if (true) 3: 3});
-
-  // Cast condition.
-  Expect.identical(const {1: 1}, const <int, int>{if (dynamicTrue) 1: 1});
-  Expect.identical(const {1: 1}, const <int, int>{if (objectTrue) 1: 1});
-
-  // Nested spread.
-  Expect.identical(map, const <int, int>{
-    if (true) ...<int, int>{1: 1, 2: 2},
-    if (false) 9: 9 else ...<int, int>{3: 3}
-  });
-
-  // Nested if in then.
-  Expect.identical(const {1: 1},
-      const <int, int>{if (true) if (true) 1: 1, if (true) if (false) 9: 9});
-
-  // Nested if in else.
-  Expect.identical(const {1: 1},
-      const <int, int>{if (false) 9: 9 else if (true) 1: 1});
-}
-
-void testSet() {
-  // Then if true.
-  Expect.identical(set, const <int>{1, if (true) 2, 3});
-
-  // Nothing if false and no else.
-  Expect.identical(set, const <int>{1, if (false) 9, 2, 3});
-
-  // Else if false.
-  Expect.identical(set, const <int>{1, if (false) 9 else 2, 3});
-
-  // Only if.
-  Expect.identical(const <int>{1}, const <int>{if (true) 1});
-
-  // If at beginning.
-  Expect.identical(set, const <int>{if (true) 1, 2, 3});
-
-  // If in middle.
-  Expect.identical(set, const <int>{1, if (true) 2, 3});
-
-  // If at end.
-  Expect.identical(set, const <int>{1, 2, if (true) 3});
-
-  // Multiple ifs.
-  Expect.identical(set,
-      const <int>{if (true) 1, if (false) 9, 2, if (true) 3});
-
-  // Cast condition.
-  Expect.identical(const <int>{1}, const <int>{if (dynamicTrue) 1});
-  Expect.identical(const <int>{1}, const <int>{if (objectTrue) 1});
-
-  // Does not flatten nested collection literal.
-  Expect.identical(const <int>[1], const <List<int>>{if (true) [1]}.first);
-  Expect.identical(
-      const <int, int>{1: 1}, const <Map<int, int>>{if (true) {1: 1}}.first);
-  Expect.identical(const <int>{1}, const <Set<int>>{if (true) {1}}.first);
-
-  // Nested spread.
-  Expect.identical(set,
-      const <int>{if (true) ...<int>[1, 2], if (false) 9 else ...<int>[3]});
-
-  // Nested if in then.
-  Expect.identical(const <int>{1},
-      const <int>{if (true) if (true) 1, if (true) if (false) 9});
-
-  // Nested if in else.
-  Expect.identical(const <int>{1}, const <int>{if (false) 9 else if (true) 1});
-}
-
-void testShortCircuit() {
-  // A const expression that throws does not cause a compile error if it occurs
-  // inside an unchosen branch of an if.
-
-  // Store null in a dynamically-typed constant to avoid the type error on "+".
-  const dynamic nil = null;
-
-  Expect.identical(const <int>[1],
-      const <int>[if (true) 1, if (false) nil + 1]);
-  Expect.identical(const <int>[1, 2],
-      const <int>[if (true) 1 else nil + 1, if (false) nil + 1 else 2]);
-
-  Expect.identical(const <int, int>{1: 1}, const <int, int>{
-    if (true) 1: 1,
-    if (false) nil + 1: 9,
-    if (false) 9: nil + 1
-  });
-  Expect.identical(const <int, int>{1: 1, 2: 2}, const <int, int>{
-    if (true) 1: 1 else nil + 1: 9,
-    if (false) 9: nil + 1 else 2: 2
-  });
-
-  Expect.identical(const <int>{1},
-      const <int>{if (true) 1, if (false) nil + 1});
-  Expect.identical(const <int>{1, 2},
-      const <int>{if (true) 1 else nil + 1, if (false) nil + 1 else 2});
-
-  // A const expression whose value isn't the right type does not cause a
-  // compile error if it occurs inside an unchosen branch.
-  const dynamic nonInt = "s";
-
-  Expect.identical(const <int>[1], const <int>[if (true) 1, if (false) nonInt]);
-  Expect.identical(const <int>[1, 2],
-      const <int>[if (true) 1 else nonInt, if (false) nonInt else 2]);
-
-  Expect.identical(const <int, int>{1: 1}, const <int, int>{
-    if (true) 1: 1,
-    if (false) nonInt: 9,
-    if (false) 9: nonInt
-  });
-  Expect.identical(const <int, int>{1: 1, 2: 2}, const <int, int>{
-    if (true) 1: 1 else nonInt: 9,
-    if (false) 9: nonInt else 2: 2
-  });
-
-  Expect.identical(const <int>{1}, const <int>{if (true) 1, if (false) nonInt});
-  Expect.identical(const <int>{1, 2},
-      const <int>{if (true) 1 else nonInt, if (false) nonInt else 2});
-}
-
-void testDuplicateKeys() {
-  // Duplicate keys from unchosen branches are not an error.
-  Expect.mapEquals(map, <int, int>{
-    1: 1,
-    if (false) 1: 1,
-    if (true) 2: 2 else 3: 3,
-    3: 3
-  });
-
-  Expect.setEquals(set, const <int>{1, if (false) 1, if (true) 2 else 3, 3});
-}
-
-void testKeyOrder() {
-  // Canonicalization isn't affected by which elements are conditional.
-  Expect.identical(map,
-      const <int, int>{1: 1, if (true) 2: 2, if (false) 9: 9, 3: 3});
-  Expect.identical(map,
-      const <int, int>{if (false) 9: 9 else 1: 1, 2: 2, if (true) 3: 3});
-
-  Expect.identical(set, const <int>{1, if (true) 2, if (false) 9, 3});
-  Expect.identical(set, const <int>{if (false) 9 else 1, 2, if (true) 3});
-
-  // Ordering does affect canonicalization.
-  Expect.notIdentical(map, const <int, int>{1: 1, if (true) 3: 3, 2: 2});
-  Expect.notIdentical(set, const <int>{1, if (true) 3, 2});
-}
diff --git a/tests/language_2/control_flow_collections/if_inference_test.dart b/tests/language_2/control_flow_collections/if_inference_test.dart
index 454c903..0c73618 100644
--- a/tests/language_2/control_flow_collections/if_inference_test.dart
+++ b/tests/language_2/control_flow_collections/if_inference_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 // Test how control flow interacts with inference.
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/if_null_condition_test.dart b/tests/language_2/control_flow_collections/if_null_condition_test.dart
index 10cbb6b..c5a1e96 100644
--- a/tests/language_2/control_flow_collections/if_null_condition_test.dart
+++ b/tests/language_2/control_flow_collections/if_null_condition_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/if_promotion_test.dart b/tests/language_2/control_flow_collections/if_promotion_test.dart
index 152d225..5622a47 100644
--- a/tests/language_2/control_flow_collections/if_promotion_test.dart
+++ b/tests/language_2/control_flow_collections/if_promotion_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 class A {
   var a = "a";
diff --git a/tests/language_2/control_flow_collections/if_runtime_error_test.dart b/tests/language_2/control_flow_collections/if_runtime_error_test.dart
index 8bf5469..8e48bea 100644
--- a/tests/language_2/control_flow_collections/if_runtime_error_test.dart
+++ b/tests/language_2/control_flow_collections/if_runtime_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/if_test.dart b/tests/language_2/control_flow_collections/if_test.dart
index 4a922f8..c835dd6 100644
--- a/tests/language_2/control_flow_collections/if_test.dart
+++ b/tests/language_2/control_flow_collections/if_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/control_flow_collections/map_set_ambiguity_error_test.dart b/tests/language_2/control_flow_collections/map_set_ambiguity_error_test.dart
index 0c4073e..452ac9b 100644
--- a/tests/language_2/control_flow_collections/map_set_ambiguity_error_test.dart
+++ b/tests/language_2/control_flow_collections/map_set_ambiguity_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 // Test cases where the syntax is ambiguous between maps and sets when control
 // flow elements contain spreads.
diff --git a/tests/language_2/control_flow_collections/map_set_ambiguity_test.dart b/tests/language_2/control_flow_collections/map_set_ambiguity_test.dart
index 3331770..6ce77de 100644
--- a/tests/language_2/control_flow_collections/map_set_ambiguity_test.dart
+++ b/tests/language_2/control_flow_collections/map_set_ambiguity_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 // Test cases where the syntax is ambiguous between maps and sets because of
 // spreads inside control flow.
diff --git a/tests/language_2/control_flow_collections/syntax_error_test.dart b/tests/language_2/control_flow_collections/syntax_error_test.dart
index 25bff6b..e0f0ba8 100644
--- a/tests/language_2/control_flow_collections/syntax_error_test.dart
+++ b/tests/language_2/control_flow_collections/syntax_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections,spread-collections
 
 void main() {
   // No then element.
diff --git a/tests/language_2/control_flow_collections/syntax_test.dart b/tests/language_2/control_flow_collections/syntax_test.dart
index 71c3f62..0810aec 100644
--- a/tests/language_2/control_flow_collections/syntax_test.dart
+++ b/tests/language_2/control_flow_collections/syntax_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 // Tests syntax edge cases.
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/control_flow_collections/type_error_test.dart b/tests/language_2/control_flow_collections/type_error_test.dart
index 533dc18..91e0ebb 100644
--- a/tests/language_2/control_flow_collections/type_error_test.dart
+++ b/tests/language_2/control_flow_collections/type_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=control-flow-collections,constant-update-2018
+// SharedOptions=--enable-experiment=control-flow-collections
 
 void main() {
   // Non-Boolean if condition.
@@ -11,42 +11,42 @@
   var _ = <int>{if (1) 2}; //# 02: compile-time error
 
   // Wrong then element type.
-  var _ = <int>[if (true) "s"]; //# 06: compile-time error
-  var _ = <int, int>{if (true) "s": 1}; //# 07: compile-time error
-  var _ = <int, int>{if (true) 1: "s"}; //# 08: compile-time error
-  var _ = <int>{if (true) "s"}; //# 09: compile-time error
+  var _ = <int>[if (true) "s"]; //# 04: compile-time error
+  var _ = <int, int>{if (true) "s": 1}; //# 05: compile-time error
+  var _ = <int, int>{if (true) 1: "s"}; //# 06: compile-time error
+  var _ = <int>{if (true) "s"}; //# 07: compile-time error
 
   // Wrong else element type.
-  var _ = <int>[if (false) 1 else "s"]; //# 10: compile-time error
-  var _ = <int, int>{if (false) 1: 1 else "s": 2}; //# 11: compile-time error
-  var _ = <int, int>{if (false) 1: 1 else 2: "s"}; //# 12: compile-time error
-  var _ = <int>{if (false) 1 else "s"}; //# 13: compile-time error
+  var _ = <int>[if (false) 1 else "s"]; //# 08: compile-time error
+  var _ = <int, int>{if (false) 1: 1 else "s": 2}; //# 09: compile-time error
+  var _ = <int, int>{if (false) 1: 1 else 2: "s"}; //# 10: compile-time error
+  var _ = <int>{if (false) 1 else "s"}; //# 11: compile-time error
 
   // Non-Boolean for condition.
-  var _ = <int>[for (; 1;) 2]; //# 14: compile-time error
-  var _ = <int, int>{for (; 1;) 2: 2}; //# 15: compile-time error
-  var _ = <int>{for (; 1;) 2}; //# 16: compile-time error
+  var _ = <int>[for (; 1;) 2]; //# 12: compile-time error
+  var _ = <int, int>{for (; 1;) 2: 2}; //# 13: compile-time error
+  var _ = <int>{for (; 1;) 2}; //# 14: compile-time error
 
   // Wrong for-in element type.
   List<String> s = ["s"];
-  var _ = <int>[for (int i in s) 1]; //# 20: compile-time error
-  var _ = <int, int>{for (int i in s) 1: 1}; //# 21: compile-time error
-  var _ = <int>{for (int i in s) 1}; //# 22: compile-time error
+  var _ = <int>[for (int i in s) 1]; //# 15: compile-time error
+  var _ = <int, int>{for (int i in s) 1: 1}; //# 16: compile-time error
+  var _ = <int>{for (int i in s) 1}; //# 17: compile-time error
 
   // Wrong for declaration element type.
-  var _ = <int>[for (int i = "s"; false;) 1]; //# 23: compile-time error
-  var _ = <int, int>{for (int i = "s"; false;) 1: 1}; //# 24: compile-time error
-  var _ = <int>{for (int i = "s"; false;) 1}; //# 25: compile-time error
+  var _ = <int>[for (int i = "s"; false;) 1]; //# 18: compile-time error
+  var _ = <int, int>{for (int i = "s"; false;) 1: 1}; //# 19: compile-time error
+  var _ = <int>{for (int i = "s"; false;) 1}; //# 20: compile-time error
 
   // Wrong for body element type.
-  var _ = <int>[for (; false;) "s"]; //# 26: compile-time error
-  var _ = <int, int>{for (; false;) "s": 1}; //# 27: compile-time error
-  var _ = <int, int>{for (; false;) 1: "s"}; //# 28: compile-time error
-  var _ = <int>{for (; false;) "s"}; //# 29: compile-time error
+  var _ = <int>[for (; false;) "s"]; //# 21: compile-time error
+  var _ = <int, int>{for (; false;) "s": 1}; //# 22: compile-time error
+  var _ = <int, int>{for (; false;) 1: "s"}; //# 23: compile-time error
+  var _ = <int>{for (; false;) "s"}; //# 24: compile-time error
 
   // Non-iterable sequence type.
   int nonIterable = 3;
-  var _ = <int>[for (int i in nonIterable) 1]; //# 30: compile-time error
-  var _ = <int, int>{for (int i in nonIterable) 1: 1}; //# 31: compile-time error
-  var _ = <int>{for (int i in nonIterable) 1}; //# 32: compile-time error
+  var _ = <int>[for (int i in nonIterable) 1]; //# 25: compile-time error
+  var _ = <int, int>{for (int i in nonIterable) 1: 1}; //# 26: compile-time error
+  var _ = <int>{for (int i in nonIterable) 1}; //# 27: compile-time error
 }
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 3047a9d..63b4104 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -106,6 +106,7 @@
 mixin_super_use_test: CompileTimeError # Issue 34806
 mock_writable_final_private_field_test: CompileTimeError # Issue 30848
 nested_generic_closure_test: CompileTimeError
+nnbd/*: Skip
 override_inheritance_field_test/42: CompileTimeError
 part_of_multiple_libs_test/01: MissingCompileTimeError
 part_refers_to_core_library_test/01: Crash
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 96c638e..f5b2b09 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -216,6 +216,7 @@
 mixin_declaration/mixin_declaration_superinvocation_application_test/07: MissingCompileTimeError
 mixin_declaration/mixin_declaration_superinvocation_application_test/08: MissingCompileTimeError
 mixin_method_override_test/G5: Crash # Issue 34354
+nnbd/*: Skip
 override_inheritance_field_test/42: MissingCompileTimeError
 regress_22976_test/*: CompileTimeError # Issue 31935
 set_literals/invalid_set_literal_test/08: MissingCompileTimeError # Requires constant evaluation
diff --git a/tests/language_2/nnbd/static_errors/nullable_supertype_test.dart b/tests/language_2/nnbd/static_errors/nullable_supertype_test.dart
new file mode 100644
index 0000000..711fefd
--- /dev/null
+++ b/tests/language_2/nnbd/static_errors/nullable_supertype_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+// Test that it is an error to use a nullable type as a supertype.
+import 'package:expect/expect.dart';
+import 'dart:core';
+import 'dart:core' as core;
+
+main() {}
+
+class A {}
+class B extends A? {} //# 01: compile-time error
+class B implements A? {} //# 02: compile-time error
+class B with A? {} //# 03: compile-time error
+mixin B on A? {} //# 04: compile-time error
+mixin B implements A? {} //# 05: compile-time error
diff --git a/tests/language_2/nnbd/syntax/null_assertion_ambiguous_test.dart b/tests/language_2/nnbd/syntax/null_assertion_ambiguous_test.dart
new file mode 100644
index 0000000..b2955e9
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/null_assertion_ambiguous_test.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+import 'package:expect/expect.dart';
+
+class C {
+  C operator*(int? other) => this;
+  Object? operator-() => null;
+}
+
+// Test ambiguous cases of trailing "!" syntax.  Where possible, we verify that
+// both the compiler and the runtime resolve the ambiguity correctly.
+main() async {
+  Object? a = null;
+
+  // `throw a!` means `throw (a!)`, not `(throw a)!`.  Since it's a compile-time
+  // error for a thrown expression to be potentially nullable, this is
+  // sufficient to verify that the compiler has resolved the ambiguity
+  // correctly.  Unforunately there's no good way to test the runtime behavior
+  // because `throw a` wouldn't complete anyway.
+  Expect.throws(() {
+      throw a!;
+  });
+
+  // `() => a!` means `() => (a!)`, not `(() => a)!`.  We check the compile-time
+  // behavior by trying to assign to a function returning non-null.  We check
+  // the runtime behavior by ensuring that a call to the closure causes an
+  // exception in the correct circumstances.
+  var x1 = () => a!;
+  Object Function() x2 = x1;
+  Expect.throws(() {
+      x1();
+  });
+
+  // `x = a!` means `x = (a!)`, not `(x = a)!`.  We check the compile-time
+  // behavior by trying to assign to a non-nullable variable.  We check the
+  // runtime behavior by verifying that the exception is thrown before an
+  // assignment occurs.
+  Object x3;
+  Expect.throws(() {
+      x3 = a!;
+  });
+  Object? x4 = 0;
+  Expect.throws(() {
+      x4 = a!;
+  });
+  Expect.equals(x4, 0);
+
+  // `true ? null : a!` means `true ? null : (a!)`, not `(true ? null : a)!`.
+  // We check the compile-time behavior by checking that the inferred type of
+  // the expression is nullable.  We check the runtime behavior by verifying
+  // that a null value can propagate from the true branch of the conditional.
+  var x5 = true ? null : a!;
+  x5 = null;
+
+  // `x * i!` means `x * (i!)`, not `(x * i)!`.  We check the compile-time
+  // behavior by checking that the multiplication is accepted even though i is
+  // nullable.  We check the runtime behavior by using an object whose operator*
+  // ignores its argument, and verify that the appropriate exception is still
+  // thrown.
+  var x6 = 2;
+  int? i = 2;
+  x6 * i!;
+  var x7 = new C();
+  Expect.throws(() {
+      x7 * i!;
+  });
+
+  // `-x!` means `-(x!)`, not `(-x)!`.  We check the compile-time behavior by
+  // checking that the negation is accepted even though x is nullable.  We check
+  // the runtime behavior by using an object whose operator- returns null.
+  int? x8 = 2;
+  -x8!;
+  var x9 = new C();
+  -x9!;
+
+  // `await x!` means `await (x!)`, not `(await x)!`.  We check the compile-time
+  // behavior by checking that the inferred type of the expression is nullable.
+  // We check the runtime behavior by ensuring that the future completes to a
+  // null value, and this does not produce an exception.
+  var x10 = new Future<Object?>.value(null);
+  var x11 = await x10!;
+  x11 = null;
+}
diff --git a/tests/language_2/nnbd/syntax/null_assertion_test.dart b/tests/language_2/nnbd/syntax/null_assertion_test.dart
new file mode 100644
index 0000000..4b27e00
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/null_assertion_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+// Test that the trailing "!" is accepted after a sampling of expression
+// syntaxes.  Verify that the compiler understands the resulting type to be
+// non-nullable by constructing a list containing the expression, and assigning
+// it to List<Object>.  Where possible, verify that the runtime implements the
+// proper null-check semantics by verifying that the presence of `null` causes
+// an exception to be thrown.
+import 'package:expect/expect.dart';
+
+class C {
+  const C();
+
+  Object? get x => null;
+
+  void f() {}
+}
+
+Object? f() => null;
+
+main() {
+  List<Object> listOfObject;
+
+  var x1 = [0!];
+  listOfObject = x1;
+
+  var x2 = [true!];
+  listOfObject = x2;
+
+  var x3 = ["foo"!];
+  listOfObject = x3;
+
+  var x4 = [#foo!];
+  listOfObject = x4;
+
+  var x5 = [[1]!];
+  listOfObject = x5;
+
+  var x6 = [{1:2}!];
+  listOfObject = x6;
+
+  var x7 = [{1}!];
+  listOfObject = x7;
+
+  var x8 = [new C()!];
+  listOfObject = x8;
+
+  var x9 = [const C()!];
+  listOfObject = x9;
+
+  Expect.throws(() {
+      var x10 = [f()!];
+      listOfObject = x10;
+  });
+
+  C c = new C();
+  Expect.throws(() {
+      var x11 = [c.x!];
+      listOfObject = x11;
+  });
+
+  var g = f;
+  Expect.throws(() {
+      var x12 = [g()!];
+      listOfObject = x12;
+  });
+
+  int i = 0;
+  var x13 = [i++!];
+  listOfObject = x13;
+}
diff --git a/tests/language_2/nnbd/syntax/nullable_type_ambiguous_test.dart b/tests/language_2/nnbd/syntax/nullable_type_ambiguous_test.dart
new file mode 100644
index 0000000..e6f6ad6
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/nullable_type_ambiguous_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+import 'package:expect/expect.dart';
+
+class C {
+  bool operator *(Type t) => true;
+}
+
+main() {
+  // { a as bool ? - 3 : 3 } is parsed as a set literal { (a as bool) ? - 3 : 3 }.
+  dynamic a = true;
+  var x1 = {a as bool ? -3 : 3};
+  Expect.isTrue(x1 is Set<dynamic>);
+  Set<dynamic> y1 = x1;
+
+  // { a is int ? -3 : 3 } is parsed as a set literal { (a is int) ? -3 : 3 }.
+  a = 0;
+  var x2 = {a is int ? -3 : 3};
+  Expect.isTrue(x2 is Set<dynamic>);
+  Set<dynamic> y2 = x2;
+
+  // { a * int ? -3 : 3 } is parsed as a set literal { (a * int) ? -3 : 3 }.
+  a = C();
+  var x3 = {a * int ? -3 : 3};
+  Expect.isTrue(x3 is Set<dynamic>);
+  Set<dynamic> y3 = x3;
+}
diff --git a/tests/language_2/nnbd/syntax/nullable_type_error_test.dart b/tests/language_2/nnbd/syntax/nullable_type_error_test.dart
new file mode 100644
index 0000000..3cd9b8f
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/nullable_type_error_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+import 'dart:core';
+import 'dart:core' as core;
+
+void f() {}
+
+main() {
+  // The grammar for types does not allow multiple successive ? operators on a
+  // type.  Note: we test both with and without a space between `?`s because the
+  // scanner treats `??` as a single token.
+  int?? x1 = 0; //# 01: compile-time error
+  core.int?? x2 = 0; //# 02: compile-time error
+  List<int>?? x3 = <int>[]; //# 03: compile-time error
+  void Function()?? x4 = f; //# 04: compile-time error
+  int? ? x5 = 0; //# 05: compile-time error
+  core.int? ? x6 = 0; //# 06: compile-time error
+  List<int>? ? x7 = <int>[]; //# 07: compile-time error
+  void Function()? ? x4 = f; //# 08: compile-time error
+}
diff --git a/tests/language_2/nnbd/syntax/nullable_type_test.dart b/tests/language_2/nnbd/syntax/nullable_type_test.dart
new file mode 100644
index 0000000..8ed8fc3
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/nullable_type_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+// Test that the trailing "?" is accepted after all type syntaxes.  Verify that
+// the compiler understands the resulting type to be nullable by trying to
+// construct a list containing `null`.  Verify that the runtime understands the
+// resulting type to be nullable by checking the reified list type.
+import 'package:expect/expect.dart';
+import 'dart:core';
+import 'dart:core' as core;
+
+main() {
+  var x1 = <int?>[null];
+  Expect.type<List<int?>>(x1);
+  Expect.notType<List<int>>(x1);
+
+  var x2 = <core.int?>[null];
+  Expect.type<List<int?>>(x2);
+  Expect.notType<List<int>>(x2);
+
+  var x3 = <List<int>?>[null];
+  Expect.type<List<List<int>?>>(x3);
+  Expect.notType<List<List<int>>>(x3);
+
+  var x4 = <void Function()?>[null];
+  Expect.type<List<void Function()?>>(x4);
+  Expect.notType<List<void Function()>>(x4);
+}
diff --git a/tests/language_2/spread_collections/await_test.dart b/tests/language_2/spread_collections/await_test.dart
index 839cfc9..886a94a 100644
--- a/tests/language_2/spread_collections/await_test.dart
+++ b/tests/language_2/spread_collections/await_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 import "package:async_helper/async_helper.dart";
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/spread_collections/const_error_test.dart b/tests/language_2/spread_collections/const_error_test.dart
index 7b4bb94..c186f13 100644
--- a/tests/language_2/spread_collections/const_error_test.dart
+++ b/tests/language_2/spread_collections/const_error_test.dart
@@ -2,67 +2,24 @@
 // 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.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
-
-import 'dart:collection';
+// SharedOptions=--enable-experiment=spread-collections
 
 import 'package:expect/expect.dart';
-import 'helper_classes.dart';
 
-var nonConstList = <int>[];
-var nonConstMap = <int, String>{};
-const dynamic nonIterable = 3;
-const dynamic nonMap = 3;
+const constList = [1, 2, 3, 4];
+const constSet = {1, 2, 3, 4};
+const constMap = {1: 1, 2: 2, 3: 3, 4: 4};
 
 void main() {
-  testList();
-  testMap();
-  testSet();
-}
+  var list = [1, 2, 3];
+  var set = {1, 2, 3};
+  var map = {1:1, 2:2, 3:3};
 
-void testList() {
-  // Must be constant.
-  const _ = <int>[...nonConstList]; //# 01: compile-time error
-
-  // Must be iterable.
-  const _ = <int>[...nonIterable]; //# 02: compile-time error
-
-  // Cannot be custom iterable type.
-  const _ = <int>[...ConstIterable()]; //# 03: compile-time error
-}
-
-void testMap() {
-  // Must be constant.
-  const _ = <int, String>{...nonConstMap}; //# 04: compile-time error
-
-  // Must be map.
-  const _ = <int, String>{...nonMap}; //# 05: compile-time error
-
-  // Cannot be custom map type.
-  const _ = <int, String>{...ConstMap()}; //# 06: compile-time error
-
-  // Cannot have key collision.
-  const _ = <int, String>{1: "s", ...{1: "t"}}; //# 07: compile-time error
-  const _ = <int, String>{...{1: "s"}, ...{1: "t"}}; //# 08: compile-time error
-}
-
-void testSet() {
-  // Must be constant.
-  const _ = <int>{...nonConstList}; //# 09: compile-time error
-
-  // Must be iterable.
-  const _ = <int>{...nonIterable}; //# 10: compile-time error
-
-  // Cannot be custom iterable type.
-  const _ = <int>{...ConstIterable()}; //# 11: compile-time error
-
-  // Cannot override operator.==().
-  const obj = 0.1;
-  const _ = {...[0.1]}; //# 12: compile-time error
-  const _ = {...[Duration(seconds: 0)]}; //# 13: compile-time error
-  const _ = {...[obj]}; //# 14: compile-time error
-
-  // Cannot have collision.
-  const _ = {1, ...[1]}; //# 15: compile-time error
-  const _ = {...[1], ...[1]}; //# 16: compile-time error
+  // Spread cannot be used in a const collection.
+  const _ = [...list]; //# 00: compile-time error
+  const _ = [...constList]; //# 01: compile-time error
+  const _ = {...set}; //# 02: compile-time error
+  const _ = {...constSet}; //# 03: compile-time error
+  const _ = {...map}; //# 04: compile-time error
+  const _ = {...constMap}; //# 05: compile-time error
 }
diff --git a/tests/language_2/spread_collections/const_test.dart b/tests/language_2/spread_collections/const_test.dart
deleted file mode 100644
index dccfab2..0000000
--- a/tests/language_2/spread_collections/const_test.dart
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright (c) 2019, 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.
-
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
-
-import 'package:expect/expect.dart';
-
-// Typed as dynamic to also test spreading a value of type dynamic.
-const dynamic list = [1, 2, 3, 4];
-const dynamic map = {1: 1, 2: 2, 3: 3, 4: 4};
-const dynamic set = {1, 2, 3, 4};
-
-void main() {
-  testList();
-  testMap();
-  testSet();
-  testKeyOrder();
-}
-
-void testList() {
-  // Only spread.
-  Expect.identical(list, const <int>[...list]);
-  Expect.identical(list, const <int>[...set]);
-
-  // Spread at beginning.
-  Expect.identical(list, const <int>[...<int>[1, 2], 3, 4]);
-
-  // Spread in middle.
-  Expect.identical(list, const <int>[1, ...<int>[2, 3], 4]);
-
-  // Spread at end.
-  Expect.identical(list, const <int>[1, 2, ...<int>[3, 4]]);
-
-  // Empty spreads.
-  Expect.identical(list,
-      const <int>[...<int>[], 1, 2, ...<int>[], 3, 4, ...<int>[]]);
-
-  // Multiple spreads.
-  Expect.identical(list,
-      const <int>[...<int>[1], 2, ...<int>[3, 4]]);
-
-  // Nested spreads.
-  Expect.identical(list,
-      const <int>[...<int>[...<int>[1, 2], ...<int>[3, 4]]]);
-
-  // Null-aware.
-  Expect.identical(list,
-      const <int>[1, ...?<int>[2, 3], ...?(null), ...?<int>[4]]);
-
-  // Does not deep flatten.
-  Expect.identical(
-      const <Object>[1, 2, <int>[3], 4],
-      const <Object>[1, ...<Object>[2, <int>[3], 4]]);
-
-  // Establishes const context.
-  Expect.identical(const <Symbol>[Symbol("sym")],
-      const <Symbol>[...<Symbol>[Symbol("sym")]]);
-}
-
-void testMap() {
-  // Only spread.
-  Expect.identical(map, const <int, int>{...map});
-
-  // Spread at beginning.
-  Expect.identical(map,
-      const <int, int>{...<int, int>{1: 1, 2: 2}, 3: 3, 4: 4});
-
-  // Spread in middle.
-  Expect.identical(map,
-      const <int, int>{1: 1, ...<int, int>{2: 2, 3: 3}, 4: 4});
-
-  // Spread at end.
-  Expect.identical(map,
-      const <int, int>{1: 1, 2: 2, ...<int, int>{3: 3, 4: 4}});
-
-  // Empty spreads.
-  Expect.identical(map, const <int, int>{
-    ...<int, int>{},
-    1: 1,
-    2: 2,
-    ...<int, int>{},
-    3: 3,
-    4: 4,
-    ...<int, int>{}
-  });
-
-  // Multiple spreads.
-  Expect.identical(map,
-      const <int, int>{...<int, int>{1: 1}, 2: 2, ...<int, int>{3: 3, 4: 4}});
-
-  // Nested spreads.
-  Expect.identical(map, const <int, int>{
-    ...<int, int>{
-      ...<int, int>{1: 1, 2: 2},
-      ...<int, int>{3: 3, 4: 4}
-    }
-  });
-
-  // Null-aware.
-  Expect.identical(map, const <int, int>{
-    1: 1,
-    ...?<int, int>{2: 2, 3: 3},
-    ...?(null),
-    ...?<int, int>{4: 4}
-  });
-
-  // Does not deep flatten.
-  Expect.identical(const <int, Object>{
-    1: 1,
-    2: 2,
-    3: <int, int>{3: 3},
-    4: 4
-  }, const <int, Object>{
-    1: 1,
-    ...<int, Object>{
-      2: 2,
-      3: <int, int>{3: 3},
-      4: 4
-    }
-  });
-
-  // Establishes const context.
-  Expect.identical(const <Symbol, Symbol>{
-    Symbol("sym"): Symbol("bol")
-  }, const <Symbol, Symbol>{
-    ...<Symbol, Symbol>{Symbol("sym"): Symbol("bol")}
-  });
-}
-
-void testSet() {
-  // Only spread.
-  Expect.identical(set, const <int>{...set});
-  Expect.identical(set, const <int>{...list});
-
-  // Spread at beginning.
-  Expect.identical(set, const <int>{...<int>[1, 2], 3, 4});
-
-  // Spread in middle.
-  Expect.identical(set, const <int>{1, ...<int>[2, 3], 4});
-
-  // Spread at end.
-  Expect.identical(set, const <int>{1, 2, ...<int>[3, 4]});
-
-  // Empty spreads.
-  Expect.identical(set,
-      const <int>{...<int>[], 1, 2, ...<int>[], 3, 4, ...<int>[]});
-
-  // Multiple spreads.
-  Expect.identical(set, const <int>{...<int>[1], 2, ...<int>[3, 4]});
-
-  // Nested spreads.
-  Expect.identical(set, const <int>{...<int>{...<int>[1, 2], ...<int>[3, 4]}});
-
-  // Null-aware.
-  Expect.identical(set,
-      const <int>{1, ...?<int>[2, 3], ...?(null), ...?<int>[4]});
-
-  // Does not deep flatten.
-  Expect.identical(const <Object>{1, 2, <int>{3}, 4},
-      const <Object>{1, ...<Object>{2, <int>{3}, 4}});
-
-  // Establishes const context.
-  Expect.identical(const <Symbol>{Symbol("sym")},
-      const <Symbol>{...<Symbol>{Symbol("sym")}});
-}
-
-void testKeyOrder() {
-  // Canonicalization isn't affected by which elements are spread.
-  Expect.identical(map,
-      const <int, int>{1: 1, ...<int, int>{2: 2, 3: 3}, 4: 4});
-  Expect.identical(map,
-      const <int, int>{1: 1, ...<int, int>{2: 2}, 3: 3, ...<int, int>{4: 4}});
-
-  Expect.identical(set, const <int>{1, ...<int>{2, 3}, 4});
-  Expect.identical(set, const <int>{1, ...<int>{2}, 3, ...<int>{4}});
-
-  // Ordering does affect canonicalization.
-  Expect.notIdentical(const <int, int>{1: 1, 2: 2, 3: 3},
-      const <int, int>{1: 1, ...<int, int>{3: 3, 2: 2}});
-  Expect.notIdentical(const <int>{1, 2, 3}, const <int>{1, ...<int>{3, 2}});
-}
diff --git a/tests/language_2/spread_collections/experimental_flag_test.dart b/tests/language_2/spread_collections/experimental_flag_test.dart
deleted file mode 100644
index 84135f1..0000000
--- a/tests/language_2/spread_collections/experimental_flag_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2019, 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.
-
-// Check that spread collections are not enabled without the experimental flag.
-
-// TODO(rnystrom): Remove this test when the feature is enabled without a flag.
-
-void main() {
-  var _ = <int>[...<int>[1]]; //# 01: compile-time error
-  var _ = <int, int>{...<int, int>{1: 1}}; //# 02: compile-time error
-  var _ = <int>{...<int>{1}}; //# 03: compile-time error
-  var _ = <int>[...?null]; //# 04: compile-time error
-  var _ = <int, int>{...?null}; //# 05: compile-time error
-  var _ = <int>{...?null}; //# 06: compile-time error
-}
diff --git a/tests/language_2/spread_collections/inference_test.dart b/tests/language_2/spread_collections/inference_test.dart
index 7d0ffef..e3c429f 100644
--- a/tests/language_2/spread_collections/inference_test.dart
+++ b/tests/language_2/spread_collections/inference_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 // Test how spread interacts with inference.
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/spread_collections/map_set_ambiguity_error_test.dart b/tests/language_2/spread_collections/map_set_ambiguity_error_test.dart
index 458f264..5f6576d 100644
--- a/tests/language_2/spread_collections/map_set_ambiguity_error_test.dart
+++ b/tests/language_2/spread_collections/map_set_ambiguity_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 // Test cases where the syntax is ambiguous between maps and sets.
 import 'dart:collection';
diff --git a/tests/language_2/spread_collections/map_set_ambiguity_test.dart b/tests/language_2/spread_collections/map_set_ambiguity_test.dart
index 4b11ccf..9b3d537 100644
--- a/tests/language_2/spread_collections/map_set_ambiguity_test.dart
+++ b/tests/language_2/spread_collections/map_set_ambiguity_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 // Test cases where the syntax is ambiguous between maps and sets.
 import 'dart:collection';
diff --git a/tests/language_2/spread_collections/runtime_error_test.dart b/tests/language_2/spread_collections/runtime_error_test.dart
index 095e77b..ad74289 100644
--- a/tests/language_2/spread_collections/runtime_error_test.dart
+++ b/tests/language_2/spread_collections/runtime_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/spread_collections/spread_test.dart b/tests/language_2/spread_collections/spread_test.dart
index bb2e166..7bc721d 100644
--- a/tests/language_2/spread_collections/spread_test.dart
+++ b/tests/language_2/spread_collections/spread_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 import 'package:expect/expect.dart';
 
diff --git a/tests/language_2/spread_collections/syntax_error_test.dart b/tests/language_2/spread_collections/syntax_error_test.dart
index 96802da..05261cd 100644
--- a/tests/language_2/spread_collections/syntax_error_test.dart
+++ b/tests/language_2/spread_collections/syntax_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 void main() {
   // Spread nothing.
diff --git a/tests/language_2/spread_collections/syntax_test.dart b/tests/language_2/spread_collections/syntax_test.dart
index 716ec22..7100394 100644
--- a/tests/language_2/spread_collections/syntax_test.dart
+++ b/tests/language_2/spread_collections/syntax_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 // Tests syntax edge cases.
 import 'package:expect/expect.dart';
diff --git a/tests/language_2/spread_collections/type_error_test.dart b/tests/language_2/spread_collections/type_error_test.dart
index 4c7a338..68cf98c 100644
--- a/tests/language_2/spread_collections/type_error_test.dart
+++ b/tests/language_2/spread_collections/type_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--enable-experiment=spread-collections,constant-update-2018
+// SharedOptions=--enable-experiment=spread-collections
 
 void main() {
   // Spread non-iterable or non-map.
diff --git a/tests/language_2/vm/osr_nonempty_stack_test.dart b/tests/language_2/vm/osr_nonempty_stack_test.dart
new file mode 100644
index 0000000..20af5d6
--- /dev/null
+++ b/tests/language_2/vm/osr_nonempty_stack_test.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2019, 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.
+
+// SharedOptions=--enable-experiment=spread-collections,control-flow-collections,constant-update-2018
+
+// Test with OSR on non-empty stack (block expression).
+
+import 'dart:core';
+import "package:expect/expect.dart";
+
+const String NeverInline = 'NeverInline';
+
+class Z {
+  @NeverInline
+  check(int a, int b, String c, List<int> d) {
+    Expect.equals(a, 42);
+    Expect.equals(b, global_bazz);
+    Expect.equals(c, 'abc');
+    return d;
+  }
+}
+
+Z z = new Z();
+int global_bazz = 123;
+int global_more_bazz = 456;
+
+@NeverInline
+int bazz() {
+  return ++global_bazz;
+}
+
+@NeverInline
+int more_bazz() {
+  return ++global_more_bazz;
+}
+
+@NeverInline
+int bar(int i) {
+  return i - 1;
+}
+
+@NeverInline
+List<int> spread(int v, List<int> x) {
+  return [v, ...x];
+}
+
+// Long running control-flow collection (block expression),
+// leaves the stack non-empty during a potential OSR.
+@NeverInline
+List<int> test1(int n) {
+  return spread(more_bazz(), [for (int i = 0; i < n; i++) i]);
+}
+
+// Long running control-flow collection (block expression) inside outer
+// loop, leaves the stack non-empty during a potential OSR.
+List<int> test2(int n) {
+  List<int> x = [];
+  for (int k = 0; k < 10; k++) {
+    x += spread(more_bazz(), [for (int i = 0; i < n; i++) i]);
+  }
+  return x;
+}
+
+// Long running control-flow collection (block expression) inside two
+// outer loops, leaves the stack non-empty during a potential OSR.
+List<int> test3(int n) {
+  List<int> x = [];
+  for (int k = 0; k < 4; k++) {
+    for (int j = 0; j < 4; j++) {
+      x += spread(more_bazz(), [for (int i = 0; i < n; i++) i]);
+    }
+  }
+  return x;
+}
+
+// Long running control-flow collection (block expression),
+// leaves the stack non-empty during a potential OSR.
+@NeverInline
+List<int> test4(int n) {
+  var x = [10] +
+      z.check(42, bazz(), 'abc',
+          [more_bazz(), for (int i = 0; i < n; i++) bar(2 * i)]);
+  return x;
+}
+
+// Long running control-flow collection (block expression) inside outer
+// loop, also leaves the stack non-empty during a potential OSR.
+@NeverInline
+List<int> test5(int m, int n) {
+  List<int> x = [];
+  for (int k = 0; k < m; k++) {
+    x += [10] +
+        z.check(42, bazz(), 'abc',
+            [more_bazz(), for (int i = 0; i < n; i++) bar(2 * i)]);
+  }
+  return x;
+}
+
+main() {
+  int n = 100000;
+  int g = 457;
+
+  var a = test1(n);
+  Expect.equals(a.length, n + 1);
+  for (int k = 0; k < n + 1; k++) {
+    int expect = (k == 0) ? g++ : k - 1;
+    Expect.equals(a[k], expect);
+  }
+
+  var b = test2(n);
+  Expect.equals(b.length, 10 * (n + 1));
+  for (int i = 0, k = 0; i < 10 * (n + 1); i++) {
+    int expect = (k == 0) ? g++ : k - 1;
+    Expect.equals(b[i], expect);
+    if (++k == (n + 1)) k = 0;
+  }
+
+  var c = test3(n);
+  Expect.equals(c.length, 16 * (n + 1));
+  for (int i = 0, k = 0; i < 16 * (n + 1); i++) {
+    int expect = (k == 0) ? g++ : k - 1;
+    Expect.equals(c[i], expect);
+    if (++k == (n + 1)) k = 0;
+  }
+
+  var d = test4(n);
+  Expect.equals(d.length, n + 2);
+  for (int k = 0; k < n + 2; k++) {
+    int expect = k <= 1 ? ((k == 0) ? 10 : g++) : -5 + 2 * k;
+    Expect.equals(d[k], expect);
+  }
+
+  var e = test5(10, n);
+  Expect.equals(e.length, 10 * (n + 2));
+  for (int i = 0, k = 0; i < 10 * (n + 2); i++) {
+    int expect = k <= 1 ? ((k == 0) ? 10 : g++) : -5 + 2 * k;
+    Expect.equals(e[i], expect);
+    if (++k == (n + 2)) k = 0;
+  }
+}
diff --git a/tests/language_2/vm/regression_36587_test.dart b/tests/language_2/vm/regression_36587_test.dart
new file mode 100644
index 0000000..a014641
--- /dev/null
+++ b/tests/language_2/vm/regression_36587_test.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test extracted from a large DartFuzz-generated test.
+// https://github.com/dart-lang/sdk/issues/36587
+
+import "package:expect/expect.dart";
+
+import 'dart:async';
+import 'dart:cli';
+import 'dart:collection';
+import 'dart:convert';
+import 'dart:core';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:math';
+import 'dart:typed_data';
+
+Set<int> var0 = {-62, -13, 2147483648, -10, -9223372028264841217, -54, 47};
+Set<int> var1 = {-59};
+bool var2 = false;
+bool var3 = true;
+int var4 = 58;
+double var5 = 0.004032426761438224;
+String var6 = 'u6X2';
+List<int> var7 = [56, -95, 6442450944, -31, 82];
+Set<int> var8 = {9223372036854775807, 4294967297};
+Map<int, String> var9 = {
+  6: 'Ei(ZR',
+  75: 'O0A-',
+  99: 't',
+  49: 'Qu',
+  20: 'FujA\u2665',
+  47: ''
+};
+
+String foo2() {
+  var8 ??= Set.identity();
+  switch ((--var4)) {
+    case 3826530052:
+      {
+        {
+          int loc0 = 0;
+          do {
+            try {
+              throw {64: var6};
+            } catch (e) {
+              if ((!(var3))) {
+                break;
+              } else {
+                try {
+                  var8 = ((false ? FileSystemEntity.isWatchSupported : var3)
+                      ? {Int32x4.wxxx, var4, -43, Float32x4.wzxz}
+                      : {
+                          (var4++),
+                          (var7[(false ? -87 : (++loc0))] %
+                              (var7[((++loc0) * var4)] ~/ 73))
+                        });
+                  var0 = ((((-((((true ? var2 : false) ? (!(var3)) : true)
+                                  ? var5
+                                  : (0.38834735336907733 ??
+                                      0.8105736840461367)))) +
+                              (0.3752597438445757).abs()))
+                          .isFinite
+                      ? {
+                          (true ? 65 : (var3 ? (loc0--) : var4)),
+                          var7[Float32x4.xxxx]
+                        }
+                      : Set.identity());
+                  var1 = ((true
+                          ? ({var7[var7[-9223372032559808513]]}).toSet()
+                          : (Set.identity()).difference(var8)) ??
+                      var8);
+                  var9[Float32x4.zxyz] = '';
+                } catch (e) {
+                  loc0 ~/= ((var3 != var3)
+                      ? (~((false ? (-(loc0)) : Int32x4.wzwx)))
+                      : var4);
+                } finally {
+                  var1 = var8;
+                  var5 ??= 0.6273822429057158;
+                  throw [
+                    (loc0++),
+                    2147483647,
+                    (var4--),
+                    (-(ZLibOption.defaultWindowBits)),
+                    (~((loc0--))),
+                    (var4++)
+                  ];
+                }
+              }
+              break;
+            }
+          } while (++loc0 < 74);
+        }
+      }
+  }
+}
+
+main() {
+  Expect.equals(58, var4);
+  foo2();
+  Expect.equals(57, var4);
+}
diff --git a/third_party/d8/README.google b/third_party/d8/README.google
index 9b592e1..303e812 100644
--- a/third_party/d8/README.google
+++ b/third_party/d8/README.google
@@ -1,9 +1,9 @@
 Name: V8 command line javascript shell.
 Short Name: d8
-URL: https://chromium.googlesource.com/v8/v8/+/refs/tags/6.9.427.23
-Version: 6.9.427.23
-Revision: 40b7c570a56b1134ff5083d8311e69ad8bf8fbd7
-Date: September 14 2018
+URL: https://chromium.googlesource.com/v8/v8/+/refs/tags/7.5.149
+Version: 7.5.149
+Revision: 804cfc5fb2ab8c49facc7a5f486c1555c2cbad63
+Date: March 31 2019
 License: BSD
 
 Description:
diff --git a/third_party/d8/update.sh b/third_party/d8/update.sh
index 3236046..bb5e2d3 100755
--- a/third_party/d8/update.sh
+++ b/third_party/d8/update.sh
@@ -26,7 +26,7 @@
 for i in "${!arch[@]}"
 do
   filename="v8-${arch[$i]}-rel-$version.zip"
-  gsutil cp "gs://chromium-v8/official/$major.$minor/$filename" .
+  gsutil cp "gs://chromium-v8/official/canary/$filename" .
   mkdir -p d8/${path[$i]}
   unzip -q $filename -d d8/${path[$i]}
   rm $filename
diff --git a/tools/VERSION b/tools/VERSION
index e0edd34..cf8239f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -31,9 +31,9 @@
 #
 CHANNEL dev
 MAJOR 2
-MINOR 2
-PATCH 1
-PRERELEASE 4
-PRERELEASE_PATCH 2
-ABI_VERSION 2
+MINOR 3
+PATCH 0
+PRERELEASE 0
+PRERELEASE_PATCH 0
+ABI_VERSION 4
 OLDEST_SUPPORTED_ABI_VERSION 1
diff --git a/tools/bots/flutter/compile_flutter.sh b/tools/bots/flutter/compile_flutter.sh
new file mode 100755
index 0000000..1c81fba
--- /dev/null
+++ b/tools/bots/flutter/compile_flutter.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+# Copyright (c) 2019, 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.
+
+# Compile flutter tests with a locally built SDK.
+
+set -e
+
+checkout=$(pwd)
+dart=$checkout/out/ReleaseX64/dart-sdk/bin/dart
+sdk=$checkout/out/ReleaseX64/dart-sdk
+tmpdir=$(mktemp -d)
+cleanup() {
+  rm -rf "$tmpdir"
+}
+trap cleanup EXIT HUP INT QUIT TERM PIPE
+pushd "$tmpdir"
+
+git clone -vv https://chromium.googlesource.com/external/github.com/flutter/flutter
+
+pushd flutter
+bin/flutter config --no-analytics
+pinned_dart_sdk=$(cat bin/cache/dart-sdk/revision)
+patch=$checkout/tools/patches/flutter-engine/${pinned_dart_sdk}.flutter.patch
+if [ -e "$patch" ]; then
+  git apply $patch
+fi
+bin/flutter update-packages
+popd
+
+# Directly in temp directory again.
+mkdir engine
+pushd engine
+git clone -vv --depth 1 https://chromium.googlesource.com/external/github.com/flutter/engine flutter
+mkdir third_party
+pushd third_party
+ln -s $checkout dart
+popd
+popd
+
+mkdir flutter_patched_sdk
+
+$checkout/tools/sdks/dart-sdk/bin/dart --packages=$checkout/.packages $checkout/pkg/front_end/tool/_fasta/compile_platform.dart dart:core --single-root-scheme=org-dartlang-sdk --single-root-base=$checkout/ org-dartlang-sdk:///sdk/lib/libraries.json vm_outline_strong.dill vm_platform_strong.dill vm_outline_strong.dill
+$checkout/tools/sdks/dart-sdk/bin/dart --packages=$checkout/.packages $checkout/pkg/front_end/tool/_fasta/compile_platform.dart --target=flutter dart:core --single-root-scheme=org-dartlang-sdk --single-root-base=engine org-dartlang-sdk:///flutter/lib/snapshot/libraries.json vm_outline_strong.dill flutter_patched_sdk/platform_strong.dill flutter_patched_sdk/outline_strong.dill
+
+popd
+
+$dart --enable-asserts pkg/vm/test/frontend_server_flutter.dart --flutterDir=$tmpdir/flutter --flutterPlatformDir=$tmpdir/flutter_patched_sdk
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 78e10bc..3cd4ed0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -885,6 +885,14 @@
             "pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart",
             "-rnone"
           ]
+        },
+        {
+          "name": "ddc worker tests",
+          "script": "out/ReleaseX64/dart",
+          "arguments": [
+            "pkg/dev_compiler/test/worker/worker_test.dart",
+            "-rnone"
+          ]
         }
       ]
     },
@@ -950,6 +958,14 @@
             "pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart",
             "-rnone"
           ]
+        },
+        {
+          "name": "ddc worker tests",
+          "script": "xcodebuild/ReleaseX64/dart",
+          "arguments": [
+            "pkg/dev_compiler/test/worker/worker_test.dart",
+            "-rnone"
+          ]
         }
       ]
     },
@@ -1839,6 +1855,30 @@
       ]
     },
     {
+      "builders": [
+        "flutter-frontend"
+      ],
+      "meta": {
+        "description": "This configuration is used for running frontend tests on flutter code."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "--mode=release",
+            "--arch=x64",
+            "create_sdk"
+          ]
+        },
+        {
+
+          "name": "compile flutter tests",
+          "script": "tools/bots/flutter/compile_flutter.sh"
+        }
+      ]
+    },
+    {
       "builders": ["fuzz-linux"],
       "meta": {
         "description": "This configuration is used for fuzz testing."
diff --git a/tools/download_abi_dills.py b/tools/download_abi_dills.py
index 6eaa9e6..51dd8c1 100644
--- a/tools/download_abi_dills.py
+++ b/tools/download_abi_dills.py
@@ -23,11 +23,14 @@
   return procWait(p) == 0
 
 
-def downloadAbiDills(oldest_abi_version, abi_version):
+def main():
+  abi_version = int(utils.GetAbiVersion())
+  oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
   cmd = ['cipd', 'ensure', '-root', 'tools/abiversions', '-ensure-file', '-']
   ensure_file = ''
   for i in xrange(oldest_abi_version, abi_version + 1):
-    ensure_file += '@Subdir %d\ndart/abiversions/%d latest\n\n' % (i, i)
+    if findAbiVersion(i):
+      ensure_file += '@Subdir %d\ndart/abiversions/%d latest\n\n' % (i, i)
   if not ensure_file:
     return 0
   p = subprocess.Popen(cmd,
@@ -41,16 +44,5 @@
   return procWait(p)
 
 
-def main():
-  abi_version = int(utils.GetAbiVersion())
-  oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
-
-  # The latest abi version may not have an entry in CIPD yet, so check first.
-  if not findAbiVersion(abi_version):
-    abi_version -= 1
-
-  return downloadAbiDills(oldest_abi_version, abi_version)
-
-
 if __name__ == '__main__':
   sys.exit(main())
diff --git a/tools/testing/dart/command.dart b/tools/testing/dart/command.dart
index 9b41d64..d89b964 100644
--- a/tools/testing/dart/command.dart
+++ b/tools/testing/dart/command.dart
@@ -41,9 +41,10 @@
       List<Uri> bootstrapDependencies,
       String executable,
       List<String> arguments,
-      Map<String, String> environment) {
+      Map<String, String> environment,
+      List<String> batchArgs) {
     return new VMKernelCompilationCommand._(outputFile, neverSkipCompilation,
-        bootstrapDependencies, executable, arguments, environment);
+        bootstrapDependencies, executable, arguments, environment, batchArgs);
   }
 
   static Command analysis(String executable, List<String> arguments,
@@ -419,6 +420,8 @@
 }
 
 class VMKernelCompilationCommand extends CompilationCommand {
+  final List<String> batchArgs;
+
   VMKernelCompilationCommand._(
       String outputFile,
       bool alwaysCompile,
@@ -426,17 +429,29 @@
       String executable,
       List<String> arguments,
       Map<String, String> environmentOverrides,
+      this.batchArgs,
       {int index = 0})
-      : super._('vm_compile_to_kernel', outputFile, alwaysCompile,
+      : super._('vm_compile_to_kernel $batchArgs', outputFile, alwaysCompile,
             bootstrapDependencies, executable, arguments, environmentOverrides,
             index: index);
 
   VMKernelCompilationCommand indexedCopy(int index) =>
-      VMKernelCompilationCommand._(_outputFile, _alwaysCompile,
-          _bootstrapDependencies, executable, arguments, environmentOverrides,
+      VMKernelCompilationCommand._(
+          _outputFile,
+          _alwaysCompile,
+          _bootstrapDependencies,
+          executable,
+          arguments,
+          environmentOverrides,
+          batchArgs,
           index: index);
 
   int get maxNumRetries => 1;
+
+  @override
+  List<String> get batchArguments {
+    return batchArgs;
+  }
 }
 
 /// This is just a Pair(String, Map) class with hashCode and operator ==
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 6f6c394..9edb9fb 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -539,10 +539,23 @@
 
   Command createCommand(String inputFile, String outputFile,
       List<String> sharedOptions, Map<String, String> environment) {
-    // TODO(jmesserly): restore testing on this once we have everyone migrated
-    // to DDC's Kernel backend. At that point we'd like to migrate from Analyzer
-    // summaries to Kernel IL.
-    final useDillFormat = false;
+    /// This can be disabled to test DDC's hybrid mode (automatically converting
+    /// Analyzer summaries to Kernel files).
+    ///
+    /// The current DDC configurations are:
+    ///
+    /// - using Analyzer ASTs and Analyzer summaries: the current default
+    ///   configuration; used in internal builds.
+    /// - using Kernel trees and Kernel IL files: the new default for external
+    ///   users (e.g. Flutter Web), and in the future, the only DDC mode.
+    /// - using Kernel trees, but Analyzer summaries (converted automatically):
+    ///   this was intended to help migrate internal users, but is currently
+    ///   unused.
+    ///
+    /// The first two are tested on the bots and are called "dartdevc" and
+    /// "dartdevk" respectively. This flag switches "dartdevk" to use either
+    /// Kernel IL files, or the Analyzer summaries.
+    final useDillFormat = useKernel;
 
     var args = <String>[];
     if (useKernel) {
@@ -1095,11 +1108,18 @@
     final pkgVmDir = Platform.script.resolve('../../../pkg/vm').toFilePath();
     final genKernel = '${pkgVmDir}/tool/gen_kernel${executableScriptSuffix}';
 
-    final kernelBinariesFolder = _useSdk
-        ? '${_configuration.buildDirectory}/dart-sdk/lib/_internal'
-        : '${_configuration.buildDirectory}';
+    final String useAbiVersion = arguments.firstWhere(
+        (arg) => arg.startsWith('--use-abi-version='),
+        orElse: () => null);
 
-    // Always use strong platform as preview_dart_2 implies strong.
+    var kernelBinariesFolder = '${_configuration.buildDirectory}';
+    if (useAbiVersion != null) {
+      var version = useAbiVersion.split('=')[1];
+      kernelBinariesFolder += '/dart-sdk/lib/_internal/abiversions/$version';
+    } else if (_useSdk) {
+      kernelBinariesFolder += '/dart-sdk/lib/_internal';
+    }
+
     final vmPlatform = '$kernelBinariesFolder/vm_platform_strong.dill';
 
     final dillFile = tempKernelFile(tempDir);
@@ -1111,6 +1131,11 @@
       dillFile,
     ];
 
+    final batchArgs = <String>[];
+    if (useAbiVersion != null) {
+      batchArgs.add(useAbiVersion);
+    }
+
     args.add(arguments.where((name) => name.endsWith('.dart')).single);
     args.addAll(arguments.where((name) =>
         name.startsWith('-D') ||
@@ -1132,7 +1157,7 @@
     }
 
     return Command.vmKernelCompilation(dillFile, true, bootstrapDependencies(),
-        genKernel, args, environmentOverrides);
+        genKernel, args, environmentOverrides, batchArgs);
   }
 }
 
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index c0c6d7d..902dd9e 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -306,6 +306,7 @@
         // over.
         DebugLogger.error("${filePath.toNativePath()}: "
             "Relative import in multitest containing '..' is not allowed.");
+        DebugLogger.close();
         exit(1);
       }
 
diff --git a/tools/utils.py b/tools/utils.py
index d6878bc..32d843e 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -472,7 +472,7 @@
 
 
 def GetShortGitHash():
-  p = subprocess.Popen(['git', '--short', 'rev-parse', 'HEAD'],
+  p = subprocess.Popen(['git', 'rev-parse', '--short', 'HEAD'],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.STDOUT, shell=IsWindows(),
                        cwd = DART_DIR)
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index c97152e..3723077 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -258,14 +258,17 @@
     state.options.onDiagnostic = onDiagnostic;
     Component incrementalComponent = await state.incrementalCompiler
         .computeDelta(entryPoints: sources, fullComponent: true);
-    if (summaryOnly) {
-      incrementalComponent.uriToSource.clear();
-      incrementalComponent.problemsAsJson = null;
-      incrementalComponent.mainMethod = null;
-      target.performOutlineTransformations(incrementalComponent);
-    }
 
-    kernel = fe.serializeComponent(incrementalComponent);
+    kernel = await state.incrementalCompiler.context.runInContext((_) {
+      if (summaryOnly) {
+        incrementalComponent.uriToSource.clear();
+        incrementalComponent.problemsAsJson = null;
+        incrementalComponent.mainMethod = null;
+        target.performOutlineTransformations(incrementalComponent);
+      }
+
+      return Future.value(fe.serializeComponent(incrementalComponent));
+    });
   } else {
     kernel = await fe.compile(state, sources, onDiagnostic,
         summaryOnly: summaryOnly);